CentOS7でFTPSを設定してみた

はじめに

こんにちは、AWS事業本部のニシヤマです。はいマスキュラー。

先日、CentOS7でFTPサーバ(vsftpd)を構築してみましたが、今回はその環境を利用してFTPSを設定してみます。

FTPS (File Transfer Protocol over SSL/TLS)とは

Wikipediaより

FTPS (File Transfer Protocol over SSL/TLS) は、FTPで送受信するデータをTLSまたはSSLで暗号化する通信プロトコル。

そのままですが、ユーザ名、パスワードを含むデータを平文でやりとりするFTP(File Transfer Protocol)を暗号化通信上でやり取りするためのプロトコルになります。

似たものにSFTP(SSH File Transfer Protocol)SCP(Secure copy)がありますが、どちらもSSHを利用したファイル転送の仕組みのためFTPSとは別物になります。

やってみる

前回の設定でFTP(vsftpd)の構築は完了しているのでFTPS部分の設定のみ実施します。

秘密鍵、証明書の作成

今回は検証環境のため自己証明書を利用します。FTPサーバで以下を実行して秘密鍵、証明書を作成します。

秘密鍵の作成

$ sudo openssl genrsa -aes256 2048 > vsftpd.key
Generating RSA private key, 2048 bit long modulus
......+++
........+++
e is 65537 (0x10001)
Enter pass phrase:パスフレーズ
Verifying - Enter pass phrase:パスフレーズ

証明書の作成

有効期限は365日で証明書を作成します

$ sudo openssl req -new -key vsftpd.key -x509 -days 365 -out vsftpd.pem
Enter pass phrase for vsftpd.key:
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]:Chiyoda-ku
Organization Name (eg, company) [Default Company Ltd]:Classmethod,Inc.
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:nishiyama.local
Email Address []:hogehoge@classmethod.jp

秘密鍵のパスフレーズを削除

パスフレーズがあるとFTPサーバ起動時に秘密鍵が読み込めないためパスフレーズなしの秘密鍵を作成します

$ mv vsftpd.key vsftpd.key.bak
$ sudo openssl rsa -in vsftpd.key.bak -out vsftpd.key
Enter pass phrase for vsftpd.key.bak:パスフレーズ
writing RSA key

証明書、秘密鍵を移動

所有者をrootに変更して証明書フォルダに移動します

$ sudo sudo chown root:root vsftpd.pem vsftpd.key
$ sudo mv vsftpd.key /etc/pki/tls/private/
$ sudo mv vsftpd.pem /etc/pki/tls/certs/

vsftpdの設定

vsftpd.confに暗号化関連の設定を追記します。今回はTLS1.2のみを有効にして、パスワード、データ送受信で暗号化通信を強制します。

$ sudo vi /etc/vsftpd/vsftpd.conf
$ sudo cat /etc/vsftpd/vsftpd.conf
〜〜〜〜省略〜〜〜〜
ssl_enable=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_tlsv1=NO
ssl_tlsv1_1=NO
ssl_tlsv1_2=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
rsa_private_key_file=/etc/pki/tls/private/vsftpd.key
force_local_logins_ssl=YES
force_local_data_ssl=YES

vsftpdの設定変更を適用

$ sudo systemctl restart vsftpd
$ sudo systemctl status vsftpd

クライアントから接続

今回はCyberduckを利用して接続してみます。

Cyberduckを起動して接続情報を入力。この時プロトコルの一覧から「FTP-SSL(Explicit AUTH TLS)」を選択して、接続ボタンを押下。

その後、証明書が信頼されていないとのエラーが表示されますが、今回は自己証明書のため続けるを押下すると接続できました。

以上です!

さいごに

最近ではマネージドSFTPサーバのAWS Transfer for SFTPがリリースされたりで、FTPSの設定する機会はなくなってきているかと思いますがこの記事がどなたかのお役に立てば幸いです。