はじめに
FTPのSSL/TLS方式
FTPでSSL/TLSを利用する方法には大きく2種類あり、vsftpdとしては、どちらとも利用可能なため、接続するFTPクライアントによって使い分けることが良いと思われる。
※ ftpをTLSで暗号化するプロトコルは下記2種類どちらともftpsと呼ばれ、SSHでファイル転送を行うsftpとは異なる。
explicit(明示的な)方式
平文のFTPのポート(TCP/21)で接続、平文でコネクションを張った後、FTPのAUTHメソッドでTLSへ移行する方法。いわゆるSTARTTLS方式。
httpで例えれば、平文のHTTPのポート(TCP/80)で接続し、GETやPOST等のメソッドを呼ぶ前にTLSへ移行するためのメソッドを呼び、暗号化通信を開始した後にGET等のリクエストを開始するようなイメージ。
vsftpdでのSSL/TLS通信のデフォルトで、RFCで正式に採用されている方式。
implicit(暗黙的な)方式
平文のFTPのポート(TCP/21)とは別にTLS(ftps)用のポート(一般にTCP/990)を使用し、コネクションを張る時点からTLSで暗号化する方式。httpsで利用されているTLSに近い。
RFCとして正式な記載はないが、vsftpdではimplicitモードも利用することができる。
vsftpdでSSL/TLSを利用する設定
環境
- CentOS 7.6
- vsftpd 3.0
用意するもの
サーバ証明書
SSL/TLSを利用するため、httpsのWebサーバと同様にサーバ証明書が必要となる。
使用する証明書はhttpsのSSL/TLSで使用するサーバ証明書と同じもので、自己証明書で作成してもよいし、一般の認証局やLet's encrypt等で発行したサーバ証明書でもよい。
中間証明書が必要となる場合は、サーバ証明書と中間証明書を1つのファイルに連結した証明書ファイルを作成しておく必要がある。(WebサーバのApache 2.4やnginxで使用する方法と同様)
設定
vsftpdの設定ファイル/etc/vsftpd/vsftpd.conf
へ設定を行っていく。
※ Ubuntu等のパッケージでは場所が異なり、/etc/vsftpd.conf
となっている。
vsftpdの設定ファイルには初期で設定項目が存在していない場合もあるので、無い場合はファイルの末尾などに手動で追記する必要がある。
基本的な設定
# TLSを有効化
ssl_enable=YES
# 使用プロトコル (必要なプロトコルをYESに設定する)
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=NO
ssl_tlsv1_1=NO
ssl_tlsv1_2=YES
# 暗号化方式
ssl_ciphers=kEECDH+AESGCM+AES128:kEECDH+AESGCM:kEECDH+AES128:kEECDH+AES:!aNULL:!eNULL:!LOW:!EXP
# サーバ証明書、秘密鍵
rsa_cert_file=/etc/vsftpd/server.crt
rsa_private_key_file=/etc/vsftpd/server.key
各設定値の意味はそれぞれ下記の通り。
設定項目名 | 設定値 | 意味 |
---|---|---|
ssl_enable | YES/NO | SSL/TLSによる接続を有効化する |
ssl_sslv2 | YES/NO | SSL 2.0 を利用可能とする |
ssl_sslv3 | YES/NO | SSL 3.0 を利用可能とする |
ssl_tlsv1 | YES/NO | TLS 1.0 を利用可能とする |
ssl_tlsv1_1 | YES/NO | TLS 1.1 を利用可能とする |
ssl_tlsv1_2 | YES/NO | TLS 1.2 を利用可能とする |
ssl_ciphers | 文字列 | 通信で利用可能とする暗号化スイート(OpenSSL方式で指定) |
rsa_cert_file | 文字列 | サーバ証明書(+中間証明書)のファイル名 |
rsa_private_key_file | 文字列 | 証明書の秘密鍵ファイル名 |
ssL_ciphers
でDHE方式の暗号化スイートを利用する場合は、DH鍵交換パラメータ設定により任意の鍵長のDH鍵交換パラメータを利用することもできる。
implicitモードを使用する場合
implicitモードでのftpsを利用する場合は、上記に加えてimplicit_ssl
を有効化し、listen_port
に通信に使用するポート(TCP/990 など)を設定する。
# implicit モード有効化
implicit_ssl=YES
listen_port=990
SSLログの有効化
debug_ssl
を有効化することで、クライアントからの接続時にsyslogへSSL/TLSのプロトコルや暗号化方式などの情報を出力させることも可能。
※syslog_enable
が有効となっていないとsyslogへのログ出力自体がされないので注意。
# ロギング設定
syslog_enable=YES
debug_ssl=YES
ログを有効化した場合、SSL/TLSでの接続時にsyslogへ下記のようなログが出力されるようになる。
vsftpd[1279]: DEBUG: Client "127.0.0.1", "SSL version: TLSv1/SSLv3, SSL cipher: ECDHE-RSA-AES256-GCM-SHA384, not reused, no cert"
稼働確認
SSL/TLS周りの接続確認はOpenSSLのコマンドで確認が可能。
OpenSSLの場合、implicitモードでの接続になるため、explicitモードで接続の場合は-starttls
オプションを利用する必要がある。
# explicitモードの場合
openssl s_client -connect localhost:21 -starttls ftp
# implicitモードの場合
openssl s_client -connect localhost:990
補足:DH鍵交換パラメータ設定
SSL/TLSのCipherSuitesにDHE系の鍵交換を使用する場合は、
nginx等と同様に任意の長さのDHパラメータを生成して設定することも可能。
DHパラメータファイル設定
vsftpdの設定ファイルにはdh_param_file
に生成したDHパラメータファイルを指定することで任意のパラメータを使用することができる。
# DH鍵交換パラメータ
dh_param_file=/etc/vsftpd/dhparam.pem