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

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

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

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

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

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

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

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

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

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インストール

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

dnf install vsftpd

vsftpdの設定

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

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

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

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

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

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

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

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

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

# 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となる

# 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!」)を表示させる。

# 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

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

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."

 

# 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」でデータコネクションに用いるポート範囲を指定する。

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

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

ascii_upload_enable=YES
ascii_download_enable=YES

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

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」配下にユーザ名のファイルを作成することで、ユーザ個々にルートディレクトリを指定できます。

# 例)
local_root=/var/www/html

 

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

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

userlist_enable=YES
userlist_file=/etc/vsftpd/user_list

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

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

# 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

 

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_...」で接続に暗号化通信を強制させます。
下部で使用する証明書と秘密鍵のパスを指定。

use_localtime=YES

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

ユーザの準備

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

useradd <ユーザ名>
passwd <ユーザ名> 
usermod <ユーザ名> -s /sbin/nologin

# /etc/shellsに/sbin/nologinがない場合のみ追加
echo /sbin/nologin >> /etc/shells

groupadd ftp-group
usermod -aG ftp-group <ユーザ名>

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

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年くらいに設定すれば良いです。

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情報等入れる必要があるので、以下のような感じでよしなに設定します。
(自己署名なので、社内のみで使う場合はホスト名以外基本なんでも良いと思います)

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 []:[email protected]

接続テスト

vsftpdをスタートさせます。

systemctl start vsftpd.service

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

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

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

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

かわ けん

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