vsftpd で特定のアカウントに chroot を設定する
SERVER
vsftpd で chroot を設定する
FTP サーバー vsftpd には、ログインした際に指定したディレクトリよりも上位を参照できないようにする機能があります。
これを利用する場合、設定ファイル /etc/vsftpd/vsftpd.conf を調整して、chroot 機能を有効化する必要があります。今回は特定のアカウントでログインした場合に chroot 機能が有効になるように vsftpd の調整を行ってみることにしました。
まず、vsftpd で chroot の機能を有効化するために /etc/vsftpd/vsftpd.conf を編集します。
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
このファイルの中の上記の部分、インストール時に用意されていた vsftpd.conf ファイルに # でコメントアウトされて用意されていたのですけど、ここで指定されている "/etc/vsftpd.chroot_list" ファイルが用意されていないようでした。
代わりに似た名前のファイルが用意されていて、それとすっかり勘違いしてしまい、vsftpd は起動するものの、どのアカウントでも FTP へログインすることができなくなってしまったので、念のため注意点として記しておくことにします。なお、このような失敗をした場合、FTP 接続の際にサーバーから "500 OOPS: could not open chroot() list file:/etc/vsftpd.chroot_list" というレスポンスが返ってきます。
それともう一つ、注意しておきたいこととして、上記と併せて /etc/vsftpd/vsftpd.conf 内で "chroot_local_user=YES" が設定されている場合、原則として全てのローカルアカウントが chroot されるようになるとのことです。このとき、上で設定した /etc/vsftpd.chroot_list に記載されているアカウントは chroot されなくというように、このファイルの用途が全く逆になってきます。
そして、環境によっては /etc/vsftpd.chroot_list が最初から用意されている場合もあるようですが、自分の環境では存在していなかったため、次のようにしてそれを用意しておきます。
このファイルを用意するには、次のようにします。
touch /etc/vsftpd.chroot_list
chmod 600 /etc/vsftpd.chroot_list
最後の chmod 命令はなくても大丈夫なようでしたが、他のファイルのパーミッション設定と合わせるために、念のため実行しておくことにしました。
後は vsftpd を再起動して、設定内容を反映させます。
service vsftpd restart
このように設定すると、/etc/vsftpd.chroot_list に書かれたアカウントでログインした場合に chroot されて、そのアカウントのホームディレクトリ以下しか読み書きできないようになります。
なお、既に chroot 機能が有効になれば、/etc/vsftpd.chroot_list を編集した後で vsftpd を再起動しなくても、次のログインからは指定したアカウントが chroot されるようになるようでした。
chroot 設定確認時の注意
今回の vsftpd での chroot 設定において、個人的に引っ掛かったところがあったので、補足として記しておくことにします。
vsftpd の設定しながらその動作の確認に FileZilla という FTP クライアントを利用していたのですけど、それに搭載されていた操作を快適にするためのキャッシュ機能が災いして、古いディレクトリ情報が表示されてしまったことがありました。
特に今回のように、FTP のパスはそのままに、実際の物理パスが切り替わるような設定を行っているような場合には、FileZilla の更新ボタンを押すなどして、最新のファイルリストに反映するよう、心がけておくのも良いかもしれないです。