vsftpd で FTPS 環境を構築する (CentOS 5.5) : Linux の使い方
SFTP と FTPS
FTP の通信経路を暗号化して、ファイル転送をより安全に行うための技術として、SFTP, SCP や FTPS といった方式があるようです。
前者の SCP (Secure Copy) や SFTP (SSH File Transfer Protocol) は、厳密には SSH の機能といった形で、SSH の通信経路 22/TCP を利用して、ファイルのやり取りを行うための仕組みです。これを利用するためには OpenSSH を導入する形になるようです。
もうひとつの FTPS (File Transfer Protocol over SSL/TLS) というのは、FTP を SSL/TSL に乗せることでファイル転送を暗号化します。これを利用するためには、SSL/TSL に対応した FTP サーバーソフトウェアを導入する形になるようです。
FTP 単体ではセキュリティー面の不安が残りますし、これからファイル転送の環境を用意するのであれば、こういった暗号化を盛り込んだ方法を選んでおきたいものです。
最近の Linux では OpenSSH が当たり前に利用できるようになっているので、導入の面では SFTP が簡単なような気がします。実際、SSH さえ稼働していれば他の準備は必要無さそうな感じなので、ちょっとしたファイル転送であれば scp コマンドや WinSCP を利用して SSH によるファイル転送を行うこともこれまでに幾度とありました。
ただ、あまり詳しく調べてはいないのですけど、SCP や SFTP の場合、SSH と一体となっている都合、運用上のセキュリティー対策が取りにくくなるのではないかとついつい考えてしまいます。
そこで、今回は FTP 専用サーバーソフトウェアである vsftpd を利用して、FTPS によるファイル転送環境の構築を行ってみようと思います。
vsftpd で FTPS 環境を用意する
今回は CentOS 5.5 の vsftpd で FTPS 環境を構築してみようと思います。
ここでは vsftpd が既にインストールされているものとして話を進めて行きたいと思いますので、vsftpd のインストールについては EZ-NET: CentOS 5.4 で FTP サーバーを起動する : Linux の使い方 を参考にしてみてください。
また、FTPS でパッシブモードによる接続を行う場合で、パケットフィルターによる通信制御を行う場合には、EZ-NET: vsftpd の PASV モードで使用するポートの範囲を制限する (CentOS 5.5) : Linux の使い方 も参考になるかもしれません。
さて、FTPS では電子証明書を用意する必要がありますので、次のようにして電子証明書の作成から行います。
cd /etc/pki/tls/certs/
make vsftpd.pem
すると、次のようないくつかの事項を尋ねられるので、必要事項を入力して行きます。
Country Name (2 letter code) 所在の国名を入力します。日本の場合は "JP" です。 State or Province Name (full name) 所在の都道府県名をローマ字で入力します。 Locality Name (eg, city) 所在の市区町村をローマ字で入力します。 Organization Name (eg, company) 所属する組織名を入力します。特になければ任意のもので構わないと思います。 Organizational Unit Name (eg, section) 所属する部署名を入力します。特になければ何も入力しなくても大丈夫です。 Common Name (eg, your name or your server's hostname) サーバー名を入力します。サーバーに名前があればそれか、無ければ何も入力しなくても大丈夫なようでした。 Email Address 自身のメールアドレスを入力します。何も入力しなくても大丈夫な様子です。
電子証明書が作成できたら、続いて vsftpd の設定です。
FTPS を利用できるようにするには "/etc/vsftpd/vsftpd.conf" 内で、次の項目を設定して行く感じです。
ssl_enable=YES
rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem
force_local_logins_ssl=YES
force_local_data_ssl=YES
allow_anon_ssl=NO
ここでは、"ssl_enabled" で SSL 接続を有効化し、"force_local_logins_ssl" と "force_local_data_ssl" とを YES に設定することで、FTPS ではない通常の FTP による接続を行えないようにしています。
併せて、"allow_anon_ssl" に NO を設定して、匿名アクセス時の通信では SSL を利用しないように設定しています。
FTPS に関する設定が整ったら、次のようにして vsftpd を再起動します。
service vsftpd restart
このようにすることで、匿名アクセスだけは通常の FTP で接続することができますが、それ以外のアカウントによる接続は FTPS での接続に限定されるようでした。
実際に FileZilla で SSL による匿名アクセスしようとしてみると "530 Anonymous sessions may not use encryption." というエラーが表示されました。逆に通常の FTP で通常のアカウントによるアクセスを試みてみたときは "530 Non-anonymous sessions must use encryption." というメッセージが表示されました。
なお、/etc/services では、ftps として 990/tcp が、ftps-data として 989/tcp が定義されているようでしたが、通常のこの設定では、ポート番号として 21/TCP が利用されるようです。
もし vsftpd の待ち受けポート番号を変更する必要がある場合には EZ-NET: vsftpd で待ち受けポートを変更する (CentOS 5.5) の方も参考にしてみてください。ただ、FTP と FTPS とでポートを分けるようなことは vsftpd 単体では出来ないような感じがしますので注意が必要になるかもしれないです。