FTPサーバ(vsftpd)の設定

さくらで借りている VPS に FTP サーバ(vsftpd)を設定した記録。

環境

  • CentOS 6.9
  • x86_64

方針

  • ASCII転送はなし
  • 特定のユーザしかアクセスさせない
  • ホームディレクトリのpublic以下しかアクセスさせない
  • アップロードしたファイルにユーザ以外の書き込み権限を付与しない

FTP用ユーザの作成

[takatoh@tk2-254-36564 ~]$ sudo useradd ftpuser
[takatoh@tk2-254-36564 ~]$ sudo passwd ftpuser
ユーザー ftpuser のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。

ftpuser のホームディレクトリに public ディレクトリを作る。

[takatoh@tk2-254-36564 ~]$ ls -l /home
合計 8
drwx------ 2 ftpuser ftpuser 4096 10月 15 07:37 2017 ftpuser
drwx------ 5 takatoh takatoh 4096 10月  5 21:54 2017 takatoh
[takatoh@tk2-254-36564 ~]$ sudo mkdir -p /home/ftpuser/public
[takatoh@tk2-254-36564 ~]$ sudo ls -l /home/ftpuser
合計 4
drwxr-xr-x 2 root root 4096 10月 15 07:41 2017 public
[takatoh@tk2-254-36564 ~]$ sudo chown ftpuser:ftpuser /home/ftpuser/public
[takatoh@tk2-254-36564 ~]$ sudo ls -l /home/ftpuser
合計 4
drwxr-xr-x 2 ftpuser ftpuser 4096 10月 15 07:41 2017 public

インストール

[takatoh@tk2-254-36564 ~]$ sudo yum install vsftpd

設定ファイル /etc/vsftpd/vsftpd.conf の設定

変更した点、重要な点だけ書く。

[takatoh@tk2-254-36564 ~]$ cd /etc/vsftpd
[takatoh@tk2-254-36564 vsftpd]$ ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[takatoh@tk2-254-36564 vsftpd]$ sudo cp vsftpd.conf vsftpd.conf.orig
[takatoh@tk2-254-36564 vsftpd]$ sudo vim vsftpd.conf

anonymousログインを許可しない。NO に変更。

anonymous_enable=NO

ローカルユーザのログインを許可する設定。そのまま。

local_enable=YES

anonymousログインでの書き込みを許可しない。コメントのまま。

#anon_upload_enable=YES

anonymousログインでのディレクトリ作成を許可しない。コメントのまま。

#anon_mkdir_write_enable=YES

ログファイルにアップロードとダウンロードの詳細を記録する。そのまま。

xferlog_enable=YES

データ接続でサーバがポート20を送信元にする。そのまま。

connect_from_port_20=YES

ログファイルのファイル名。デフォルトでよいのでコメントのまま。

#xferlog_file=/var/log/xferlog

ログをxferlogのフォーマットにする。そのまま。

xferlog_std_format=YES

アップロード、ダウンロードでの ASCII 転送を認めないのでコメントのまま。

#ascii_upload_enable=YES
#ascii_download_enable=YES

ローカルユーザがログイン後にホームディレクトリに chroot するかの設定。コメントを外して有効にする。

chroot_local_user=YES

chroot_listを有効にする。chroot_local_user の設定で意味が変わる。YES の場合、chroot_list_file は chroot しないユーザを指定する。コメントを外して有効にする。

chroot_list_enable=YES

chroot_local_user を有効にしたので、chroot_list_file が無いとアクセスできない。コメントを外して有効にする。

chroot_list_file=/etc/vsftpd/chroot_list

スタンドアローン(デーモン)として起動するかの設定。そのまま。

listen=YES

ここからはデフォルトの設定ファイルにないので追記。
userlist_deny を NO にするとアクセスを許可するユーザーのリストになる。NO にする。

userlist_deny=NO

ユーザリストのファイルを指定。

userlist_file=/etc/vsftpd/user_list

ログイン後に移動するディレクトリを指定。chrootが有効になっている場合、chroot後のルートを指定する。

local_root=public

vsftpd.confの設定は終了。

chroot_local_user、chroot_list_enable の両方をYESにしたので、chroot_list_fileが無いとログインを拒否される。空のファイルを作る。

[takatoh@tk2-254-36564 vsftpd]$ sudo touch /etc/vsftpd/chroot_list

デフォルトでは /etc/vsftpd/user_list がアクセスを拒絶するリストになっている。許可するファイルに編集し直す。書いてあるユーザ名をすべてコメントアウトして ftpuser を追加する。

[takatoh@tk2-254-36564 vsftpd]$ sudo vim /etc/vsftpd/user_list

iptablesの設定

ftpのデータ用ポートのためのモジュールを読み込むように設定する。

[takatoh@tk2-254-36564 vsftpd]$ cd /etc/sysconfig
[takatoh@tk2-254-36564 sysconfig]$ sudo vim iptables-config
IPTABLES_MODULES="ip_conntrack_ftp"

ポート21への接続を許可するようにする。

[takatoh@tk2-254-36564 sysconfig]$ sudo vim iptables

つぎの行を追加。state ESTABLISHED,RELATEDとREJECTの間に追加する。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

iptables を再起動。

[takatoh@tk2-254-36564 sysconfig]$ sudo service iptables restart
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]
iptables: Loading additional modules: ip_conntrack_ftp     [  OK  ]

FTPサーバ(デーモン)の起動

[takatoh@tk2-254-36564 ~]$ sudo service vsftpd start
Starting vsftpd for vsftpd:                                [  OK  ]

OS起動時にvsftpdも起動するようにする。

[takatoh@tk2-254-36564 ~]$ sudo chkconfig vsftpd on
[takatoh@tk2-254-36564 ~]$ sudo chkconfig --list vsftpd
vsftpd         	0:off	1:off	2:on	3:on	4:on	5:on	6:off

これでインストールと設定は終了。

テスト

ローカルから接続してファイルをアップロードしてみる。

takatoh@envelopes $ ftp ftp.lathercraft.net
Connected to lathercraft.net.
220 (vsFTPd 2.2.2)
Name (ftp.lathercraft.net:takatoh): ftpuser
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.
ftp> put example.zip
local: example.zip remote: example.zip
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
300012340 bytes sent in 26.17 secs (10.9330 MB/s)
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 501      502      300012340 Oct 14 23:47 example.zip
226 Directory send OK.
ftp> bye
221 Goodbye.

うまくいったようだ。
試しに wget でダウンロードしてみたけど、これもうまく行った。

参考ページ

cf. ftpサーバ(vsftpd)の設定