CentOS7 環境の vsftpd で、設定ファイルなどをURLでアクセスできない領域に配置したいと考え、ホームディレクトリ直下にファイルをアップロードできないか試してみました。
前提・経緯
サーバの設定はCentOS7.5 + Apache + PHP + MySQL サーバを構築し、WordPressサイトを引っ越す(2018/11/20)の環境をベースとしたものに準じるとします。
条件だけ抜き出すと次のような状況。
- Apache のある仮想サイトのドキュメントルート:
/var/www/example/web/
- vsftpd の設定:
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
- 中身は空
userlist_deny=NO
user_config_dir=/etc/vsftpd/user_conf
- 上述仮想サイト用のFTPユーザ
ftpuser
のホームディレクトリ:/var/www/example/
/var/www/example/
は所有者:グループがroot:root
で権限は775
- vsftpd の詳細な設定は以下
vsftpd.conf
# vi /etc/vsftpd/vsftpd.conf
## 匿名ユーザ無効化
#anonymous_enable=YES
anonymous_enable=NO
## タイムアウト時間変更
#idle_session_timeout=600
idle_session_timeout=600
#data_connection_timeout=120
data_connection_timeout=60
## ASCIIモード有効
#ascii_upload_enable=YES
ascii_upload_enable=YES
#ascii_download_enable=YES
ascii_download_enable=YES
## ホームディレクトリより上へのアクセス制限
#chroot_local_user=YES
chroot_local_user=YES
#chroot_list_enable=YES
chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
chroot_list_file=/etc/vsftpd/chroot_list
## IPv4有効
#listen=NO
listen=YES
## IPv6無効化
#listen_ipv6=YES
listen_ipv6=NO
## アクセスユーザ制御
userlist_deny=NO
## ユーザごとの設定ファイルを指定
user_config_dir=/etc/vsftpd/user_conf
## ローカル時間有効
use_localtime=YES
## パッシブモード有効
pasv_promiscuous=YES
pasv_min_port=50000
pasv_max_port=50030
## .htaccessをFTPソフトから見られるようにする
force_dot_files=YES
## ftps 設定
ssl_enable=YES
rsa_cert_file=/path/to/certificate/fullchain.pem
rsa_private_key_file=/path/to/certificate/privkey.pem
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=YES
require_ssl_reuse=NO
allow_writeable_chroot=YES
/etc/vsftpd/chroot_list
# vi /etc/vsftpd/chroot_list
## 空ファイル作成
## root以外参照できないように権限変更
# ls -al /etc/vsftpd/chroot_list
-rw-r--r-- 1 root root 0 MM月 dd hh:ii /etc/vsftpd/chroot_list
# chmod 600 /etc/vsftpd/chroot_list
# ls -al /etc/vsftpd/chroot_list
-rw------- 1 root root 0 MM月 dd hh:ii /etc/vsftpd/chroot_list
ユーザ周り
# useradd ftpuser
# vi /etc/vsftpd/user_list
ftpuser
# vi /etc/vsftpd/user_conf/ftpuser
local_root=/var/www/example/
現象
この状態では、 ftpuser
が FTP でログインすると /var/www/example/
がホームディレクトリとして表示され、そこから上には辿れないようになっています。
また、所有者:グループが root:root
で権限は 775
となっているので、 ftpuser
で /var/www/example/
直下にファイルをアップロードしたり新しいディレクトリを切ることができません。
そこで仮に所有者やグループを root:ftpuser
や ftpuser:root
としたり、権限を 777
にしたりすると、 FTPログイン そのものが失敗してしまいます。
対処
上述の現象は、 vsftpd がセキュリティのためにホームディレクトリがログインするユーザの権限で書き込み可能なディレクトリとなっている場合は阻害されるようになっているためのようです。
そこで、対策として「書き込み可能な権限のディレクトリでもホームディレクトリにして良い」という設定を追加します。
# vi /etc/vsftpd/vsftpd.conf
## ディレクトリが書き込み可能でもchrootを利用する
allow_writeable_chroot=YES
肝である allow_writeable_chroot=YES
を追加して、 vsftpd を restart させます。
これで、ホームディレクトリ直下にもファイルをアップロードしたりディレクトリを切ったりできるようになりました。