今回は以下のようなポリシーで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上のパスと一致していることが確認できます。