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等で邪魔されることがあるので、適宜許可や無効化を行ってください。
完