【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

vsftpdでchrootを使って複数ユーザでFTPS接続させる

こんにちは。
お肌のシワは人生のバイナリログ
システムソリューション部のかわです。

やきとり食べたいですよね。せせりとハツが好きです。

さて、先日vsftpdを触ることがあったんですが、これがまた設定項目のクセが強い。設定したことある方は共感してくれると思うんですが、「反対の反対なのだ」みたいな設定の仕方が脳を萎縮させる気がします。

今回は、そんなvsftpdでFTPS通信を行い、ついでにchrootを有効にして複数ユーザの権限を柔軟に変更しつつ、設定する方法を備忘録として残します。vsftpd x FTPSに関する情報が少なかったので、この記事が誰かの役に立てばいいなと思います。

動作環境とか使用プロトコルとか

AlmaLinux9を使用します。
プロトコルはFTPよりデータコネクションのやり取りでより安全なFTPS(Explicitモード)を用います。
vsftpdのバージョンは3.0.5です。

chrootを使う目的

基本的には一律で「/mnt/ftp」にアクセスさせます。
が、一部管理者には自由にディレクトリ移動させたいのでchrootリストに追加します。そうすることで、
指定ディレクトリ以外にもファイルアップロードが可能になります。
また、ユーザ毎にファイルを定義することで、例えばあまり権限をもたせたくないユーザには
/mnt/ftp/user1」配下しか触らせない、みたいな柔軟な使い方が可能です。

vsftpdインストール

では早速インストールします

1
dnf install vsftpd

vsftpdの設定

インストールできたら早速confファイルをいじります。
まず念のためバックアップを取ってから、

1
2
cd /etc/vsftpd
cp -ip vsftpd.conf vsftpd.conf_org

vsftpd.confを設定します。
デフォルトのコンフィグから変更する点/残しておく点がたくさんあるので、今回有効にする部分だけ抜粋します。
適宜ご利用の環境によって設定値は調整してみてください。

1
2
#Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=NO

▶anonymousユーザでログイン不可に(NO)

1
2
# Uncomment this to allow local users to log in.
local_enable=YES

▶localユーザでアクセスできるように(YES)

1
2
# Uncomment this to enable any form of FTP write command.
write_enable=YES

▶ユーザに対しアップロード権限を付与するため「write_enable」はYES

1
2
3
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022

▶アップロードしたファイルの権限に関する項目。けっこう重要。
初期値は「022」なので、アップロードしたファイル権限は777から022を引いた755となる

1
2
3
4
5
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
# You may fully customise the login banner string:
ftpd_banner=Welcome!

▶ ここはお好みで。ログイン時に任意のメッセージ(今回は「Welcome!」)を表示させる。

1
2
3
4
5
6
7
8
9
10
# Activate logging of uploads/downloads.
xferlog_enable=YES
# You may override where the log file goes if you like. The default is shown
# below.
# xferlog_file=/var/log/vsftpd.log
log_ftp_protocol=YES
dual_log_enable=YES
# If you want, you can have your log file in standard ftpd xferlog format.
# Note that the default log file location is /var/log/xferlog in this case.
xferlog_std_format=NO

▶ 特にややこしいログまわり。要件にもよるが、この4項さえ確認できていれば事足りるはず。
xferlog_enable」一番重要。ログ取得を有効化する。既定値はYES
log_ftp_protocol」FTPの要求/応答を記録する。デバッグ用。併せて「xferlog_std_format」は無効にする。
dual_log_enable」vsftpdとxferlog両方を取得したいときに有効化する。「xferlog_enable」も有効状態である必要がある。
ログ容量が増加するのでここは要検討。 これらの設定をすることで「/var/log/xferlog」にFTPのファイルやり取り、「/var/log/vsftpd.log」にFTP接続ログが出力される。

⇩ログはこんな感じ

xferlog

1
2
Mon Jul 24 16:25:03 2023 1 10.10.10.10 8230 /test.jpg b _ i r ftp_test ftp 0 * c
Mon Jul 24 18:01:39 2023 1 10.10.10.10 8230 /test.jpg b _ i r ftp_test ftp 0 * c

vsftpd.log

1
2
3
Mon Jul 24 18:17:16 2023 [pid 42580] FTP response: Client "10.10.10.10", "220 Welcome!"
Mon Jul 24 18:17:16 2023 [pid 42580] FTP command: Client "10.10.10.10", "QUIT"
Mon Jul 24 18:17:16 2023 [pid 42580] FTP response: Client "10.10.10.10", "221 Goodbye."

 

1
2
3
4
5
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
pasv_address=<IP>
pasv_min_port=61000
pasv_max_port=61010

▶ passiveモード関連の設定。「pasv_address」にはWAN側に割り当てている(インターネット経由の場合はグローバル)IPアドレスを設定する。
「pasv_min_port」「pasv_max_port」でデータコネクションに用いるポート範囲を指定する。

1
2
# You may change the default value for timing out an idle session.
idle_session_timeout=<数値>

▶ 既定値はコメントアウト状態で600。コネクションがアイドル状態(≒放置)の際に切断までの秒数を指定。
必要な場合のみコメントインする。

1
2
ascii_upload_enable=YES
ascii_download_enable=YES

▶ ASCIIモードでの転送を許可するため有効化。

1
2
3
4
5
6
local_root=/mnt/ftp
chroot_local_user=YES
chroot_list_enable=YES
allow_writeable_chroot=YES
chroot_list_file=/etc/vsftpd/chroot_list
user_config_dir=/etc/vsftpd/users

▶ chroot設定箇所。
local_root」で接続時のルートディレクトリを指定。今回は/mnt/ftp
かつ、「chroot_local_user」で、ユーザはlocal_rootで指定したディレクトリより上位を参照できない設定が可能。
(ここまでがchroot基本設定)

chroot_list_enable=YES
allow_writeable_chroot=YES
chroot_list_file=/etc/vsftpd/chroot_list

▶ chrootのリスト適用を有効化し、ファイル編集権限を付与します。
かつ、「chroot_list_file」に記載されたユーザは「local_root」で指定したディレクトリ以外(どこでも)に移動可能になります。
最後に「user_config_dir」配下にユーザ名のファイルを作成することで、ユーザ個々にルートディレクトリを指定できます。

1
2
# 例)
local_root=/var/www/html

 

1
2
3
listen=YES
# Make sure, that one of the listen options is commented !!
# listen_ipv6=NO

▶ 今回はIPv4でリッスンする設定のみ有効。いずれかが有効になっていないと通信できません。

1
2
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list

▶ 「user_list」に記載されているユーザ名ではログインできない設定です。rootやshutdownなど、一般的なユーザ名からのアクセスはそもそも遮断させます。

⇩デフォルトでuser_listに記載されているユーザたち

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ssl_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=NO
ssl_tlsv1_1=YES
ssl_tlsv1_2=YES
 
ssl_ciphers=ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-CCM:ECDHE-ECDSA-AES256-CCM8:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-CCM:ECDHE-ECDSA-AES128-CCM8:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-CCM:DHE-RSA-AES256-CCM8:DHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-CCM:DHE-RSA-AES128-CCM8:!EXP
 
force_local_data_ssl=YES
force_local_logins_ssl=YES
 
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
rsa_private_key_file=/etc/pki/tls/private/vsftpd.key

▶ SSL/TLSまわり。
POODLEの件もあるのでTLSのみYESに、かつTLS1.1以上を有効化。
諸々サイファーの設定を追記し、「force_local_...」で接続に暗号化通信を強制させます。
下部で使用する証明書と秘密鍵のパスを指定。

1
use_localtime=YES

▶ ローカルタイムを指定。

ユーザの準備

FTP接続のみ可能なユーザを用意するので、下記最低限のユーザ権限を付与します。
ついでに「ftp-grroup」というグループを追加しておきます。

1
2
3
4
5
6
7
8
9
useradd <ユーザ名>
passwd <ユーザ名>
usermod <ユーザ名> -s /sbin/nologin
 
# /etc/shellsに/sbin/nologinがない場合のみ追加
echo /sbin/nologin >> /etc/shells
 
groupadd ftp-group
usermod -aG ftp-group <ユーザ名>

また、ディレクトリ作成等できたほうが良いので、FTPルートディレクトリ権限を編集しておきます。
(ここはセキュリティ要件に応じて設定してください。本記事ではディレクトリにSGIDを設定してグループに属したユーザに権限を与えます)

1
2
3
4
5
6
cd /mnt
chmod g+s ftp/
chgrp ftp-group -R ftp/
 
ls /mnt/
drwxr-sr-x 2 root    ftp-group     4096 Jul 23 22:06 ftp

chrootとユーザ別ファイルの準備

vsftpd.confで指定した「/etc/vsftpd/chroot_list」をtouch等で作成し、必要に応じてファイル内にユーザ名を記載します。
また、mkdirで/etc/vsftpd/usersディレクトリを作成し、必要に応じてusers/配下にtouch等でユーザ名のファイルを用意、local_rootを記載します。

FTPS用自己署名証明書の準備

下記のような流れでオレオレ証明書を作成します。要件的に問題ない場合は有効期限を10年くらいに設定すれば良いです。

1
2
3
4
5
cd /etc/pki/tls/private
openssl genrsa 2048 > vsftpd.key
openssl req -new -key vsftpd.key -x509 -days 3650 -out vsftpd.pem
mv vsftpd.pem /etc/pki/tls/certs/vsftpd.pem
chmod 600 /etc/pki/tls/certs/vsftpd.pem

上記流れで証明書のON情報等入れる必要があるので、以下のような感じでよしなに設定します。
(自己署名なので、社内のみで使う場合はホスト名以外基本なんでも良いと思います)

1
2
3
4
5
6
7
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Osaka
Locality Name (eg, city) [Default City]:Osaka
Organization Name (eg, company) [Default Company Ltd]:Beyond
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:test-server
Email Address []:xxxx@mail.com

接続テスト

vsftpdをスタートさせます。

1
systemctl start vsftpd.service

WinSCPやFileZilla等で明示的な暗号化通信(Explicit mode)で接続します。
firewalldとかSELinux等で邪魔されることがあるので、適宜許可や無効化を行ってください。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
10
読み込み中...
10 票, 平均: 1.00 / 110
4,171
X facebook はてなブックマーク pocket
【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2026.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

かわ けん

システムソリューション部所属
好奇心旺盛ポケ○ン