LoginSignup
18
25

More than 3 years have passed since last update.

【vsftpd】FTPをSSL/TLSで暗号化する設定

Posted at

はじめに

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
18
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
25