さくらで借りている 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 でダウンロードしてみたけど、これもうまく行った。