今回は以下のようなポリシーでFTPサーバー(vsftpd)を構築します。
- 匿名ユーザー(annonymous)でのログインを拒否する
- パッシブモードでの転送を許可する
- rootでのログインを拒否する
- 自身のホームディレクトリより上層へはアクセスを禁止する
- ただし、ftpadminユーザーのみホームディレクトリより上層へのアクセスを許可する
vsftpd.confの編集
上記のポリシーを満たすようにvsftpd.confを編集します。
# vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 anon_upload_enable=NO dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES pam_service_name=vsftpd userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/user_list tcp_wrappers=YES use_localtime=YES pasv_enable=YES pasv_min_port=0 pasv_max_port=0
まず、デフォルトでは、匿名ユーザー(anonymous)でのログインが許可されていますのでこれを禁止します。
anonymous_enable=NO anon_upload_enable=NO
ホームディレクトリより上層へのアクセスを禁止するかどうかを指定します。
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list
「chroot_local_user」をYESにするとホームディレクトリより上層へのアクセスが禁止されます。ただし、「chroot_list_enable」をYESにすることでホームディレクトリより上層へのアクセスを許可するユーザーのリストが有効となります。それにより、「chroot_list_file」に記述したユーザーのみ上層へのアクセスが許可されます。
FTPでログインできるユーザーを指定します。
userlist_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/user_list
「userlist_enable」をYESにするとユーザーリストを使用しアクセスできるユーザーを制限することができるようになります。ユーザーリストのパスは「userlist_file」で指定します。
「userlist_deny」をYESにした場合、ユーザーリストはアクセスを拒絶するユーザーのリストになります。逆にNOにした場合、ユーザーリストはアクセスを許可するユーザーのリストになります。
パッシブモードでの転送を許可します。また、パッシブモードでの接続時に使用するポート番号の最小値と最大値を指定します。
pasv_enable=YES pasv_min_port=0 pasv_max_port=0
「pasv_min_port」「pasv_max_port」に0を指定すれば、1024~65535番のうちのポート番号がランダムで使用されるようになります。
FTP用ユーザー作成
FTP用のOSユーザーを作成します。ここでは「ftpuser」と「ftpadmin」を作成します。
# useradd ftpuser # passwd ftpuser Changing password for user ftpuser. New password: Retype new password: passwd: all authentication tokens updated successfully.
# useradd ftpadmin # passwd ftpadmin Changing password for user ftpadmin. New password: Retype new password: passwd: all authentication tokens updated successfully.
chrootしないユーザーリスト作成
ホームディレクトリより上層へのアクセスを許可するユーザーリストを作成します。
# vi /etc/vsftpd/chroot_list ftpadmin
ここではftpadminユーザーのみ許可するため、上記1行を記述します。
vsftpd.confの設定反映
ここまで行った設定を反映させるためにvsftpdを再起動します。
# service vsftpd restart
ファイル受信ディレクトリ作成
ファイルを受信するディレクトリを作成します。ftpuserユーザーはホームディレクトリ配下へしかアクセスできないため、その下の階層に作成します。
# cd /home/ftpuser/ # mkdir upload # chown ftpuser:ftpuser ./upload/ # chmod 700 ./upload/
FTPクライアントからのファイル送信
FTPサーバーに対してファイルを送信してみましょう。今回もWindows標準のFTP機能を使用して、ファイル送信の確認をします。
Windows標準のFTP機能はコマンドプロンプトから使用します。
(コマンドプロンプトの起動は画面左下のWindowsマークをクリックし「プログラムとファイル検索」欄に「cmd」と入力し、Enterキーを押下します。)
まずは送信するテスト用ファイルを作成します。
> type nul > testfile03
続いてFTPサーバーにログインします。今回はftpuserでログインします。
> ftp 172.16.0.10 172.16.0.10 に接続しました。 220 (vsFTPd 2.2.2) ユーザー (172.16.0.10:(none)): ftpuser 331 Please specify the password. パスワード: 230 Login successful.
putコマンドでファイルを送信します。その際のパス指定ですが、ftpuserは「/home/ftpuser」ディレクトリが「/」になります。そのため先ほど作成したuploadディレクトリへ送信するには「/upload/>送信ファイル名<」というパス指定になります。
ftp> put "C:\Users\user\testfile03" /upload/testfile03 200 PORT command successful. Consider using PASV. 150 Ok to send data. 226 Transfer complete. ftp> ftp> bye 221 Goodbye.
今度はftpadminユーザーでログインしてみます。
> ftp 172.16.0.10 172.16.0.10 に接続しました。 220 (vsFTPd 2.2.2) ユーザー (172.16.0.10:(none)): ftpadmin 331 Please specify the password. パスワード: 230 Login successful.
ログイン直後のカレントディレクトリをpwdコマンドで確認してみます。
ftp> pwd 257 "/home/ftpadmin"
ホームディレクトリより上層へのアクセスを許可しているftpadminユーザーでログインした場合は、OS上のパスと一致していることが確認できます。