CentOS7 の vsftpd でホームディレクトリ直下も書き込み可能にする

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:ftpuserftpuser:root としたり、権限を 777 にしたりすると、 FTPログイン そのものが失敗してしまいます。

対処

上述の現象は、 vsftpd がセキュリティのためにホームディレクトリがログインするユーザの権限で書き込み可能なディレクトリとなっている場合は阻害されるようになっているためのようです。

そこで、対策として「書き込み可能な権限のディレクトリでもホームディレクトリにして良い」という設定を追加します。

# vi /etc/vsftpd/vsftpd.conf


## ディレクトリが書き込み可能でもchrootを利用する
allow_writeable_chroot=YES

肝である allow_writeable_chroot=YES を追加して、 vsftpd を restart させます。

これで、ホームディレクトリ直下にもファイルをアップロードしたりディレクトリを切ったりできるようになりました。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。