Vsftpdの設定方法



●vsftpd.confの設定

 参考URL:FTPサーバー構築(vsftpd)
 参考URL:vsftpdを設定した
 参考URL:CentOSでftpsをセットアップ(vsftpd)

 以下のように設定します。
# vi /etc/vsftpd/vsftpd.conf
匿名ユーザのログイン不可
anonymous_enable=NO
ローカルユーザでのログイン許可
local_enable=YES
FTPログインしてPUTを可能にするデフォルトはGETしかできない)
write_enable=YES
/var/log/vsftpd.logに接続・転送を記録(その1)
xferlog_enable=YES
/var/log/vsftpd.logに接続・転送を記録(その2)
xferlog_file=/var/log/vsftpd.log
/var/log/vsftpd.logに接続・転送を記録(その3)
ファイルのアップロードとダウンロードのログを
xferlog_fileオプションで<指定したファイルに記録
xferlog_std_format=NO
データを無転送時の切断時間(秒)
data_connection_timeout=300
リモートクライアントがFTPコマンドを実行しなかった場合の切断時間(秒)
idle_session_timeout=600
アスキーモードでのアップロード及びダウンロードを許可
ascii_upload_enable=YES 
ascii_download_enable=YES
FTPログイン時にソフト名とバージョンが表示されないようにする
ftpd_banner=Welcome to blah FTP service.
seccomp_sandbox=NO
allow_writeable_chroot=YES
FTPログインしたユーザが上の階層へ行けないようにする
chroot_local_user=YES
chroot_list_fileオプションで指定したユーザリストファイルを読み込み
chrootさせる(または、させない)などの設定
chroot_list_enable=YES (デフォルトのままコメントアウト)
chrootさせる(または、させない)ローカルユーザのリストを含むファイル名を指定
chroot_list_file=/etc/vsftpd/chroot_list ← 別サーバで立ち上げ時、このファイルをコピーする
    設定が複雑なので、下記参照
    chroot_list_enable=YES
    chroot_local_user=YES
    chroot_list_fileオプションで指定したファイルにリストされたユーザ以外はchrootされます。
    chroot_local_user=YES
    chroot_list_enable=NO
    すべてのローカルユーザはchrootされる
    chroot_local_user=NO
    chroot_list_enable=YES
    chroot_list_fileオプションで指定したファイルにリストされたユーザはchrootされる
    chroot_local_user=NO
    chroot_list_enable=NO
    すべてのローカルユーザはchrootされない
ディレクトリごと削除できるようにする
ls_recurse_enable=YES
IPv4接続を有効化
listen=YES
Ipv6接続を無効化
listen_ipv6=YES
※IPv4接続を無効化、IPv6接続を有効化した状態ではPASV接続できなかった。
以下は、追記項目
ローカルタイムを適用する(世界標準時ではなく日本時間)
use_localtime=YES
PASVモード接続先IPアドレスをホスト名から取得
pasv_addr_resolve=YES
PASVモードで接続する場合、IPアドレスを正引きできるホスト名を記載
※ただし、インターネット側とイントラネット側で同じホスト名を設定している場合、イントラ側のIPアドレスを返答することになるのでインターネット側から接続できなくなる。
その場合、インターネット側のIPアドレスを直接記載しておく。DDNSではインターネット側のIPアドレスが可変なので、それに合わせて書き換えが必要となる。
pasv_address=www.bigbang.mydns.jp
PASVモード接続時の最小ポート番号
pasv_min_port=60000
PASVモード接続時の最大ポート番号
pasv_max_port=60010

オレオレ証明書の作成方法は下記を参照してください。
サーバ証明書の作成
SSLの有効化
ssl_enable=YES
サーバ(オレオレ)証明書を利用する場合、下記のように記載
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
Let's Encryptの証明書を既に利用している場合、下記のように記載
rsa_cert_file=/etc/letsencrypt/live/www.bigbang.mydns.jp/fullchain.pem
rsa_private_key_file=/etc/letsencrypt/live/www.bigbang.mydns.jp/privkey.pem
POODLE対策のためNO
ssl_sslv2=NO
ssl_sslv3=NO
TLS1.2、1.3を使う
ssl_tlsv1=NO
ssl_tlsv1_1=NO
ssl_tlsv1_2=YES
ログイン時にSSL接続を強制しない
※暗号化しない接続もできるようにする場合のみ
# コントロールコネクションでSSL認証し、データコネクションで認証されたSSLセッションを再利用する:YES
#  ↑ FileZillaクライアントの場合、こちらの設定でも動作する(推奨)
# コントロールコネクションでSSL認証し、データコネクションでは認証を行わない:NO
#  ↑ FFFTPクライアントの場合、こちらの設定でないと動作しない
require_ssl_reuse=NO
データ転送時にSSL接続を強制しない
force_local_logins_ssl=NO
暗号化しない接続もできるようにする場合のみ
force_local_data_ssl=NO
※SSLを強制する場合は下記のように設定します。
force_local_data_ssl=YES
force_local_logins_ssl=YES

ロギング設定
syslog_enable=YES ← これを有効にすると/var/log/messagesに記録され、上記xferlog_fileには記録されなくなる
debug_ssl=YES
※pasv_addressには、サーバのグローバルIPアドレスが牽けるホスト名を指定する。なお、DNSサーバを導入して内部からの名前解決時にプライベートIPアドレスに変換してしまっている場合は、新たにドメインを取得し、DNSサーバに設定しないようにして、取得したドメイン名をpasv_addressに指定する。
 Firewallで必要なポートを開放します。
# firewall-cmd --add-service=ftp --permanent
# firewall-cmd --add-port=60000-60010/tcp --permanent
# firewall-cmd --runtime-to-permanent
# firewall-cmd --list-service
dns ftp http https smtp ssh
# firewall-cmd --list-port
60000-60010/tcp
# firewall-cmd --reload
success


●証明書の作成

 オレオレ証明書を作成します。有効期限は約10年としています。
# cd /etc/pki/tls/certs
# openssl req -x509 -nodes -newkey rsa:2048 -keyout vsftpd.pem -out vsftpd.pem -days 3650
Generating a RSA private key
............................................+++++
....+++++
writing new private key to 'vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP ← 国名コード
State or Province Name (full name) []:Tokyo ← 地域
Locality Name (eg, city) [Default City]:Tokyo ← 都市
Organization Name (eg, company) [Default Company Ltd]:BIGBANG ← 組織名
Organizational Unit Name (eg, section) []:BIGBANG ← 組織の部門名
Common Name (eg, your name or your server's hostname) []:www.bigbang.mydns.jp ← サーバ名のFQDN
Email Address []:root@mail.bigbang.mydns.jp ← 管理者のメールアドレス
 作成された証明書のパーミッションを変更します。
# chmod 400 vsftpd.pem


●証明書の接続確認

 証明書(オレオレ証明書の場合)を確認します。
# openssl s_client -connect localhost:21 -starttls ftp
CONNECTED(00000003)
 :
 :
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1871 bytes and written 731 bytes
Verification error: self signed certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 18 (self signed certificate)
---
220 Welcome to blah FTP service.
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
 :
 :

 証明書(Let's Encryptの場合)を確認します。
# openssl s_client -connect localhost:21 -starttls ftp
CONNECTED(00000003)
 :
 :
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4843 bytes and written 731 bytes
Verification: OK
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Server public key is 2048 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
220 Welcome to blah FTP service.
---
Post-Handshake New Session Ticket arrived:
SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
 :
 :

 CentOS 7.9 OpenSSL 1.0.2k-fipsから接続するとオレオレ証明書、Let's Encrypt発行の証明書にかかわらずTLSv1.2での接続となります。
※オレオレ証明書の場合
# openssl s_client -connect www:21 -starttls ftp
CONNECTED(00000003)
 :
 :
verify error:num=18:self signed certificate
 :
 :
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384


※Let's Encrypt証明書の場合
# openssl s_client -connect www:21 -starttls ftp
CONNECTED(00000003)
 :
 :
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384


●ftps接続の確認

 参考URL:FTP サーバー : Vsftpd over SSL/TLS
 参考URL:CentOSでftpsをセットアップ(vsftpd)

 ※2021年11月現在、FFFTPではTLS接続ができませんでした。
 したがって、TLS接続が可能なFileZillaの利用を推奨します。


 WindowsにFFFTPをインストールして接続を確認します。
 「基本」タブで「ホストの設定名」「ホスト名(アドレス)」「ユーザー名」「パスワード/フレーズ」を設定します。

vsftpd001.jpg

 「拡張」タブで「PASVモードを使う」をチェックし「ポート番号:21」にします。

vsftpd002.jpg

 「暗号化」タブで「FTPS(Explicit)で接続」にチェックを入れます。

vsftpd003.jpg

 設定を保存後、接続してみます。

vsftpd004.jpg

 タイトルバー部分に「暗号化されています」と表示されています。アップロード・ダウンロードできるかどうか確認してください。