家庭内サーバのCentOSにFTP(File Transfer Protocol:ファイル転送プロトコル)を使用するサーバをインストールしました。今回、記事にする理由はインターネットで検索したサイトで説明している内容では「ホームディレクトリより上を参照禁止にする 」ことができないためです。備忘録を兼ねています。
vsftpdの設定
vsftpdのインストール
次のコマンドでvsftpdをインストールします。
# yum -y install vsftpd
バージョンは以下の通りです。
# vsftpd -v
vsftpd: version 3.0.2
以下のものがインストールされます。
# rpm -ql vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/etc/vsftpd/vsftpd_conf_migrate.sh
/usr/lib/systemd/system-generators/vsftpd-generator
/usr/lib/systemd/system/vsftpd.service
/usr/lib/systemd/system/vsftpd.target
/usr/lib/systemd/system/vsftpd@.service
/usr/sbin/vsftpd
/usr/share/doc/vsftpd-3.0.2
/usr/share/doc/vsftpd-3.0.2/AUDIT
/usr/share/doc/vsftpd-3.0.2/BENCHMARKS
/usr/share/doc/vsftpd-3.0.2/BUGS
/usr/share/doc/vsftpd-3.0.2/COPYING
/usr/share/doc/vsftpd-3.0.2/Changelog
/usr/share/doc/vsftpd-3.0.2/EXAMPLE
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.xinetd
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE_NOINETD/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/PER_IP_CONFIG/hosts.allow
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_HOSTS/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/README.configuration
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/logins.txt
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.conf
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS/vsftpd.pam
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2
/usr/share/doc/vsftpd-3.0.2/EXAMPLE/VIRTUAL_USERS_2/README
/usr/share/doc/vsftpd-3.0.2/FAQ
/usr/share/doc/vsftpd-3.0.2/INSTALL
/usr/share/doc/vsftpd-3.0.2/LICENSE
/usr/share/doc/vsftpd-3.0.2/README
/usr/share/doc/vsftpd-3.0.2/README.security
/usr/share/doc/vsftpd-3.0.2/REWARD
/usr/share/doc/vsftpd-3.0.2/SECURITY
/usr/share/doc/vsftpd-3.0.2/SECURITY/DESIGN
/usr/share/doc/vsftpd-3.0.2/SECURITY/IMPLEMENTATION
/usr/share/doc/vsftpd-3.0.2/SECURITY/OVERVIEW
/usr/share/doc/vsftpd-3.0.2/SECURITY/TRUST
/usr/share/doc/vsftpd-3.0.2/SIZE
/usr/share/doc/vsftpd-3.0.2/SPEED
/usr/share/doc/vsftpd-3.0.2/TODO
/usr/share/doc/vsftpd-3.0.2/TUNING
/usr/share/doc/vsftpd-3.0.2/vsftpd.xinetd
/usr/share/man/man5/vsftpd.conf.5.gz
/usr/share/man/man8/vsftpd.8.gz
/var/ftp
/var/ftp/pub
vsftpdの設定ファイルは「/etc/vsftpd」以下にあります。
# ls -la
合計 40
drwxr-xr-x. 3 root root 124 2月 3 14:57 .
drwxr-xr-x. 166 root root 12288 2月 3 15:48 ..
-rw-------. 1 root root 5 5月 1 2020 chroot_list
-rw-------. 1 root root 125 6月 10 2021 ftpusers
drwxr-xr-x. 2 root root 18 2月 3 13:26 user_conf
-rw-------. 1 root root 287 5月 2 2020 user_list
-rw-------. 1 root root 5426 2月 3 14:57 vsftpd.conf
-rwxr--r--. 1 root root 338 6月 10 2021 vsftpd_conf_migrate.sh
設定はvsftpd.confに行います。
anonymous_enable=No
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO
ftpd_banner=Welcome to blah FTP service.
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
ls_recurse_enable=YES
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
tcp_wrappers=NO
pasv_enable=YES
pasv_addr_resolve=YES
pasv_address=172.16.1.3
pasv_min_port=60001
pasv_max_port=60010
use_localtime=YES
force_dot_files=YES
user_config_dir=/etc/vsftpd/user_conf
vsftpd_log_file=/var/log/vsftpd.log
log_ftp_protocol=YES
allow_writeable_chroot=YES
重要な箇所だけ解説
匿名(anonymous)ログインの拒否anonymous_enable=No
anonymousとftpのユーザー名でログインできないようにします。
ローカルユーザのログイン許可local_enable=YES
有効になると、ローカルユーザーがシステムにログイン可能となります。
ユーザ制限userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
userlist_enableが有効になるとuserlist_fileに指定されたファイル内にリストされたユーザはアクセスを拒否されます。
userlist_enableと共に使用してuserlist_denyがNOに設定されているとuserlist_fileに指定されたファイル内にリストされたユーザ以外はアクセスを拒否されます。
上の例ではuserlist_fileにリストされたユーザのみアクセス可能です。
chroot jailによる封じ込め
この箇所が不正確なサイトが多かったです。chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
user_config_dir=/etc/vsftpd/user_conf
chroot_local_user=YESはあくまでユーザがログイン後のホームディレクトリにルートディレクトリが変更されますがその上に移動できないわけではありません。
chroot_list_enable=YES,chroot_list_file=/etc/vsftpd/user_confはセットで使用、chroot_local_user=YESの場合はchroot_list_fileのファイル内にはユーザを登録しないことでルートディレクトリより上に移動できなくなります。chroot_local_user=NOの場合はchroot_list_fileにユーザを登録することでそのユーザはルートディレクトリより上に移動できなくなります。
chroot_list_fileに指定されたファイルが存在しない場合、ログインが拒否されます。ユーザ名を登録しなくても空のファイルを作成する必要があります。
chroot_local_userが有効になっていると、ログイン後にローカルユーザーのホームディレクトリにルートディレクトリが変更されます。user_config_dirはユーザー固有の設定が格納されている設定ファイルを格納するディレクトリへのパスを指定します。ファイル名がユーザ名のファイルを作成し、個別の設定を記述します。# cat user_conf/user1
local_root=/home/samba/user1
この例では、ユーザ名:user1のログイン後のディレクトリを指定しています。
この設定はあくまでもログインしたときのディレクトリを指定しているだけです。
ホームディレクトリより上に移動することが可能です。
以下のコマンドでvsftpdデーモンを有効化します。
# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
以下のコマンドを実行して、vsftpdデーモンを起動します。
# systemctl start vsftpd
以降、設定ファイルを更新した場合はvsftpdを再起動します。
# systemctl restart vsftpd
以上でvsftpdのインストールは終了です。