細かい設定が可能なので ProFTPD を利用していたのですが、故あって vsftpd へ乗り換えてハマったお話。
環境としては以下の通り。
・FreeBSD 9.3
・vsftpd 3.0.2
ハマった箇所と解決方法
chroot はみなさん設定すると思うのですが、vsftpd.conf に記述して再起動すると FTP 接続できなくなった。
$ ftp localhost
でログインを試みると下記エラー表示された。
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
結論としては /usr/local/etc/vsftp.conf に以下を記述して inetd を再起動して解決。
allow_writeable_chroot=YES
vsftp 公式サイトの Changelog や vsftpd FAQ に記載されてないのはいかがなものかと思う。
インストールと基本設定
ports からインストール。
/usr/ports/ftp/vsftpd にて
# make install clean
/usr/local/etc/vsftpd.conf を開き以下のコメントを有効にする。先頭の「#」をとる。
local_enable=YES
write_enable=YES
local_umask=022
ascii_upload_enable=YES
ascii_download_enable=YES
ls_recurse_enable=YES
# echo "vsftpd: ALL" >> /etc/hosts.allow
/etc/inetd.conf に下記を追加。
ftp stream tcp nowait root /usr/local/libexec/vsftpd vsftpd
inetd再起動。
# kill -HUP [inetdのプロセスID]
もし、起動してなければ inetd を起動。
# /etc/rc.d/inetd start
/etc/rc.conf に以下追記。
inetd_enable=”YES”
この時点で FTP 接続を確認し問題なければ chroot 設定へ。
/usr/local/etc/vsftp.conf の以下値を有効にする。コメント(先頭の#)をとる。
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/usr/local/etc/vsftpd.chroot_list
空の vsftp.chroot_list を作る。
# touch /usr/local/etc/vsftpd.chroot_list
特定ユーザのみホームディレクトリ以外に行ける様にするには、vsftpd.chroot_list に必要なユーザ名を列挙する。
foobar1 foobar2
時刻を日本標準時での表示にする
/usr/local/etc/vsftpd.conf に以下を追記。
use_localtime=YES
ドットファイルを表示する
force_dot_files=YES
パッシブモードを有効にする
/usr/local/etc/vsftpd.conf に以下を追記。
pasv_enable=YES pasv_addr_resolve=YES pasv_address=ftp.example.com (またはIPアドレス) pasv_min_port=4000 #パッシブモードの最小ポート任意の番号 pasv_max_port=4029 #パッシブモードの最大ポート任意の番号
パッシブモードを設定する際は TCP の上記の任意のポート番号を開けておくことを忘れずに。
ログファイルの設定
/usr/local/etc/vsftpd.conf の以下のコメントをとる。
xferlog_enable=YES xferlog_file=/var/log/vsftpd.log
ログローテーションの設定
vi /usr/local/etc/logrotate.d/vsftpd
以下を記載。
/var/log/vsftpd.log{ daily rotate 4 create nocompress missingok sharedscripts postrotate /bin/kill -HUP `cat /var/run/inetd.pid` endscript }
# kill -HUP [inetdのプロセスID] で接続を確認して問題なければ、とりあえずこれで一般的な FTP 接続設定は完了。
anonymous FTP を設定する
通常、設定しない方が安全だが必要ある場合の最低設定をする。
ファイルのアップロード、削除可能にする。
ファイル所有者は ftp (デフォルト)。
ルートディレクトリ /ftp (デフォルト)に chroot される。
/usr/local/etc/vsftpd.conf の以下の記述を変更する。
anonymous_enable=YES (デフォルト:NO)
vsftpd.conf に以下を追記。
アノニマスユーザのパスワードを設定するための記述。
secure_email_list_enable=YES
アノニマスユーザのパスワードファイルを作る。
# vi /usr/local/etc/vsftpd.email_passwords
ここにパスワードを記述しておく。
アノニマスユーザのファイル、ディレクトリ作成削除許可の設定。
anon_upload_enable=YES anon_other_write_enable=YES anon_mkdir_write_enable=YES
注意点
vsftpd にはログイン失敗に対する制御がない?
ProFTPD だと MaxLoginAttempts, wu-ftpd なら loginfails を指定することで、何回かログインの失敗をした場合に接続を切ることができる。これはログインの回数が多い場合は不正アクセスを試みている可能性が高いのでそれを制御するもの。
実際、ログを見るとブルートフォースアタックを試行してるくさいアクセスは頻繁にあるはず。なんで vsftpd にはこの設定ないのだろうか。
設定の参考