OSS Fan ~OSSでLinuxサーバ構築~

このエントリーをはてなブックマークに追加

vsFTPd 2.2.2でFTPSサーバ構築

カテゴリ:OSSセットアップ | ソフトウェア:vsftpd | タグ:
最終更新日:2021/01/03 | 公開日:2014/02/09

目次

概要

 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
ファイル名:/etc/vsftpd/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)