Arch Linuxにて検証した手順になります。
※「{{ }}」にて囲まれている部分は変数を表します(Jinja2などのテンプレートエンジンでもレンダリング可能なようにしてあります)。
- Anonymous 禁止
- chroot化する
- Passive接続
- Unixユーザと分離(ただし、ディレクトリ・ファイル作成時のマッピング用Unixユーザは1アカウント以上必要)
- DBはサーバ内蔵機能を利用
-
vsftpd をインストール
$ sudo pacman -S vsftpd $ yay -S libpam_pwdfile (Ubuntu → $ sudo apt install vsftpd libpam-pwdfile)
-
VirtualUser Config 用のディレクトリを作成
$ sudo mkdir -p /etc/vsftpd/conf.d
-
VirtualUser の User と Password を設定
$ sudo touch /etc/vsftpd/.passwd && echo -e "{{ VirtualUserName }}:$(openssl passwd -1)" | sudo tee /etc/vsftpd/.passwd
-
user_list(VirtualUser) と chroot_list の作成
$ sudo touch /etc/vsftpd/user_list && echo -e "{{ VirtualUserName }}\n" | sudo tee /etc/vsftpd/user_list $ sudo touch /etc/vsftpd/chroot_list && echo "" | sudo tee /etc/vsftpd/chroot_list
-
パーミッションの調整
$ sudo chmod -R 755 /etc/vsftpd $ sudo chmod 600 /etc/vsftpd/user_list $ sudo chmod 600 /etc/vsftpd/chroot_list $ sudo chmod 600 /etc/vsftpd/.passwd
-
PAM 設定ファイルを作成
$ curl -sS https://gist.githubusercontent.com/t-okkn/0d6a6ed09b44dda01339911193ebfc10/raw/543a207e811111b4e44235d53a366830e35a744d/vsftpd.virtual | sudo tee /etc/pam.d/vsftpd.virtual
-
config ファイルの作成
$ sudo mv /etc/vsftpd.conf /etc/vsftpd/vsftpd.conf.org $ curl -sS https://gist.githubusercontent.com/t-okkn/0d6a6ed09b44dda01339911193ebfc10/raw/543a207e811111b4e44235d53a366830e35a744d/vsftpd.conf | sudo tee /etc/vsftpd.conf
-
パラメータの調整
{{ FtpPort }}, {{ MinPort }}, {{ MaxPort }}, {{ MyHostName }}, {{ UnixUserName }} の各パラメータを入力してください。
※{{ UnixUserName }} は VirtualUser の Username ではなく Unix の Username です。 -
vsftpd の起動
$ sudo systemctl enable --now vsftpd
VirtualUser ごとにルートディレクトリを変更するのであれば、以下のように設定します。
$ echo "local_root=/path/to/example" | sudo tee /etc/vsftpd/conf.d/{{ VirtualUserName }}
$ sudo ufw allow from 0.0.0.0/0 to any port {{ FtpPort }} proto tcp
$ sudo ufw allow from 0.0.0.0/0 to any port {{ MinPort }}:{{ MaxPort }} proto tcp
SSL(TLS) を使用しようとして設定したのですが、うまく動作しなかったので諦めました。
なので、vsftpd はFTPサーバ専用と考えています。