vsFTPd 2.2.2でFTPSサーバ構築
目次
概要
CentOS 6.4標準のFTPサーバであるvsFTPdを利用して FTPS(File Transfer Protocol over SSL/TLS)サーバを構築します。 平文でのFTP接続は許可しないものとします。
構成
サーバ構成
OSバージョン
CentOS 6.4 x86_64
ソフトウェア・パッケージ一覧
vsftpd-2.2.2-11.el6_3.1.x86_64.rpm
クライアント構成
OSバージョン
Windows 7 Ultimate Service Pack 1 64bit
ソフトウェア・パッケージ一覧
FFFTP Ver 1.98f
サーバ構築
インストール
CentOS 6.4(x86_64)のインストールディスク1をDVDドライブにセットして、 以下のコマンドを実行します。
# mount /dev/cdrom /media/cdrom mount: ブロックデバイス /dev/sr0 は書き込み禁止です、読込み専用でマウントします # cd /media/cdrom/Packages/ # rpm -ihv vsftpd-2.2.2-11.el6_3.1.x86_64.rpm 準備中... ########################################### [100%] 1:vsftpd ########################################### [100%] # rpm -qa | grep vsftpd vsftpd-2.2.2-11.el6_3.1.x86_64 # cd / # umount /media/cdrom
設定
vsFTPdの設定
vsFTPdインストール直後はFTPS接続に必要な設定は記述されていません。 必要な設定をvsFTPdの設定ファイル(/etc/vsftpd/vsftpd.conf)に追記します。 今回はSSLではなくTLSで接続する設定とします。
また、anonymous FTPは利用しない想定なので、無効化します。 (必要であればanonymous_enableの設定は変更しなくて良いです)
# cd /etc/vsftpd/ # vi vsftpd.conf
※該当箇所を変更※ anonymous_enable=YES ↓変更 anonymous_enable=NO
※ファイルの末尾に追加※
ssl_enable=YES
ssl_tlsv1=YES
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/vsftpd/ftp.pem
秘密鍵の作成
opensslのコマンドを使用して、サーバ証明書と対になる秘密鍵の作成を行います。
# openssl genrsa -des3 -out server.key 2048 Generating RSA private key, 2048 bit long modulus ...........+++ ........................................................................................................................................................................+++ e is 65537 (0x10001) Enter pass phrase for server.key: ←パスフレーズを入力(文字は表示されません) Verifying - Enter pass phrase for server.key: ←パスフレーズを入力(文字は表示されません)
秘密鍵のパスフレーズ削除
秘密鍵作成直後はパスフレーズが設定されています。 使用する毎にパスフレーズを入力するのは手間なので パスフレーズを削除します。
# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key: ←パスフレーズを入力(文字は表示されません)
writing RSA key
CSR(証明書署名要求)の作成
秘密鍵を使用してCSRを作成します。
# openssl req -new -key server.key -out server.csr 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]:Edogawa-ku Organization Name (eg, company) [Default Company Ltd]:Ranonet Ltd. Organizational Unit Name (eg, section) []: ←何も入力せずに[リターン]キーを押す Common Name (eg, your name or your server's hostname) []:www.ranonet.net Email Address []: ←何も入力せずに[リターン]キーを押す Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: ←何も入力せずに[リターン]キーを押す An optional company name []: ←何も入力せずに[リターン]キーを押す
サーバ証明書の作成
CSRと秘密鍵を使用してサーバ証明書を作成します。 証明書の有効期間は10年(365日×10年=3650日)とします。 作成後はrootユーザ以外から内容を参照できないように パーミッションを400に変更しておきます。
# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650 Signature ok subject=/C=JP/ST=Tokyo/L=Edogawa-ku/O=Ranonet Ltd./CN=www.ranonet.net Getting Private key # chmod 400 ./server.* # ls -l 合計 40 -rw------- 1 root root 125 2月 19 16:46 2013 ftpusers -r-------- 1 root root 1192 2月 8 17:12 2014 server.crt -r-------- 1 root root 997 2月 8 17:11 2014 server.csr -r-------- 1 root root 1679 2月 8 16:58 2014 server.key -rw------- 1 root root 361 2月 19 16:46 2013 user_list -rw------- 1 root root 4732 2月 8 15:03 2014 vsftpd.conf -rwxr--r-- 1 root root 338 2月 19 16:46 2013 vsftpd_conf_migrate.sh
vsFTPd用証明書の作成
vsFTPdが使用する証明書は1つのファイルにサーバ証明書と 秘密鍵を両方含めておく必要があります。 catコマンドでファイルを結合して作成します。 作成後はrootユーザ以外から内容を参照されないように パーミッションを400に変更しておきます。
# cat server.crt server.key > ftp.pem # chmod 400 ftp.pem # ls -l 合計 44 -r-------- 1 root root 2871 2月 8 17:15 2014 ftp.pem -rw------- 1 root root 125 2月 19 16:46 2013 ftpusers -r-------- 1 root root 1192 2月 8 17:12 2014 server.crt -r-------- 1 root root 997 2月 8 17:11 2014 server.csr -r-------- 1 root root 1679 2月 8 16:58 2014 server.key -rw------- 1 root root 361 2月 19 16:46 2013 user_list -rw------- 1 root root 4732 2月 8 15:03 2014 vsftpd.conf -rwxr--r-- 1 root root 338 2月 19 16:46 2013 vsftpd_conf_migrate.sh # cat ftp.pem -----BEGIN CERTIFICATE----- MIIDQjCCAioCCQDWqbiKkz80rDANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJK UDEOMAwGA1UECAwFVG9reW8xEzARBgNVBAcMCkVkb2dhd2Eta3UxFTATBgNVBAoM DFJhbm9uZXQgTHRkLjEYMBYGA1UEAwwPd3d3LnJhbm9uZXQubmV0MB4XDTE0MDIw (中略) UWCZMgdSP0jPF39PIH6vL8ryoAxaZD2IGd0vc0UcrouzgcXvn+5UiE4Al9iyiV9i CjNLE/i7TIxAziukVQIKnL3rogipVURQ8U06U1xW0iRDaogrlhtcm0IOn9RIKXzC WCbOEcL5zEW8tzJg1H6XDYExeDpcYg== -----END CERTIFICATE----- -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA1GpM6Owr+nDq/fQGxLGzZYScFKcEMX9OUV9ASBipfqZoI++Z +MttF79KILiju6NfkMPdR8eFoF3gVmVTx0hLYjwPPUMqAP5r/r1xBm3pE3issP7N 5LvjLs3rA3DmAC7gVgbYuusxwC6PcYhJZrEwM0T5ce/PM8coDmgKth4y2lHUQHCG (中略) NuvDKf0CgYEAjflX79Q4NmsYG21ONhrpLqAKJirf5uvWJX9SrSvgLWUmMUeFM0hI v+VYimq5HC6DPZA7phcjY6gmjASEfXRKLUeVzfp8mGXzwAiiDPmjRHwfni/Yi8lX RcFtV/Ss6TJgP65oW/2j2WUHzD9jLn7cu6JsPvL28h8nHiHyntzLdzs= -----END RSA PRIVATE KEY-----
vsFTPdの自動起動設定
vsFTPdは初期状態では自動起動しない設定になっています。 Linux起動に合わせて自動起動、自動停止するように設定変更します。
# chkconfig --list vsftpd vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off # chkconfig vsftpd on # chkconfig --list vsftpd vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
vsFTPdの起動
一通りvsFTPdに関する設定が終わったので、vsFTPdを起動します。
# service vsftpd start vsftpd 用の vsftpd を起動中: [ OK ]
FTP用ユーザの作成
FTPS接続時に使用するユーザを作成します。
# useradd uftp # tail /etc/passwd ntp:x:38:38::/etc/ntp:/sbin/nologin apache:x:48:48:Apache:/var/www:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin pulse:x:497:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin subversion:x:496:492::/home/subversion:/bin/bash mysql:x:500:500::/home/mysql:/bin/bash uftp:x:501:501::/home/uftp:/bin/bash ←作成したユーザ # passwd uftp ユーザー uftp のパスワードを変更。 新しいパスワード: ←パスワードを入力 新しいパスワードを再入力してください: ←パスワードを入力 passwd: 全ての認証トークンが正しく更新できました。
動作テスト
起動確認
vsFTPdのプロセスが起動していることを確認します。
# ps -ef | grep vsftpd | grep -v grep
root 10351 1 0 18:16 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf ←vsFTPdのプロセス
vsFTPdがリッスンしているプロセスを確認します。 以下の通り21/tcp(制御ポート)でリッスンしていることが分かります。
# netstat -tanp | grep vsftpd tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 10351/vsftpd
接続確認
Windows 7にインストールしたFFFTPを使用してFTPSで接続します。 接続する際に特にFTPSを意識する必要はありません。 FFFTPが自動でFTPS接続してくれます。 作成したFTP用ユーザとパスワードを入力し、接続します。
証明書の情報が表示されます。 作成したのは自己証明書ですし、CommonName(www.ranonet.net)と 接続先アドレス(ここでは192.168.0.93)が一致しませんので、 確認画面が表示されます。 接続するためには[はい]ボタンをクリックします。 正規の(?)サーバ証明書ではありませんが、暗号化通信自体には問題ありません。
FFFTPの初期状態では「FTP over Implicit SSL/TLS (FTPIS)」と 「FTP over Explicit SSL/TLS (FTPES)」で接続を試行します。 今回の設定では後者のFTPESでのみ接続できますので、 次回接続時以降FTPESでのみ接続を試行するよう設定するか 確認の画面が表示されます。 [はい]ボタンをクリックします。(FFFTPの設定画面で後から変更することも可能です)
無事に接続できました。
接続の際にFFFTPのログウィンドウに出力されたメッセージは以下の通りです。
FTP over Implicit SSL/TLS (FTPIS)を使用します. ホスト 192.168.0.79 (21) に接続しています. (TCP/IPv4) ホスト 192.168.0.79 を探しています. (TCP/IPv6) 接続しました. (TCP/IPv4) ホスト 192.168.0.79 が見つかりません. (TCP/IPv6) 接続できません. FTP over Explicit SSL/TLS (FTPES)を使用します. ホスト 192.168.0.79 (21) に接続しています. (TCP/IPv4) 接続しました. (TCP/IPv4) 220 (vsFTPd 2.2.2) >AUTH TLS 234 Proceed with negotiation. >PBSZ 0 200 PBSZ set to 0. >PROT P 200 PROT now Private. >USER uftp 331 Please specify the password. >PASS [xxxxxx] 230 Login successful. >FEAT 211-Features: AUTH SSL AUTH TLS EPRT EPSV MDTM PASV PBSZ PROT REST STREAM SIZE TVFS UTF8 211 End >OPTS UTF8 ON 200 Always in UTF8 mode. >XPWD 257 "/home/uftp" >TYPE A 200 Switching to ASCII mode. >PASV 227 Entering Passive Mode (192,168,0,79,25,179). ダウンロードのためにホスト 192.168.0.79 (6579) に接続しています. (TCP/IPv4) 接続しました. (TCP/IPv4) >LIST 150 Here comes the directory listing. 226 Directory send OK. ファイル一覧の取得は正常終了しました. (0 Bytes)