proftpdを使った場合の、SFTP(SSH File Transfer Protocol)と、FTPS(File Transfer Protocol over SSL/TLS)のそれぞれの設定方法などについての覚書です。
ざっくり言えばどちらも暗号化しますが、SFTPはSSH経由で暗号化し、FTPSはSSL/TLS経由で暗号化します。
【共通点など】
■proftpd 公式サイトおよびマニュアル
http://www.proftpd.org/
http://www.proftpd.org/docs/
■proftpd コンパイルについて
SFTPの場合、コンパイル時に--with-modules=mod_sftpが必要。
FTPSの場合、コンパイル時に--with-modules=mod_tlsが必要。
どちらも必要なら、./configure --with-modules=mod_sftp:mod_tls と書く。
■用語
SSL (Secure Sockets Layer) - NetScapeが開発したSV~CL暗号化技術。SSL2.0は脆弱性があるため現在推奨されていない。
TLS (Transport Layer Security) - IETFがSSL3.0をベースに開発。SSL3.0≒TLS1.0。
■portの差異
- ftp 20,21/TCP
- sftp 22/TCP
- ftps(Explicit) 20,21/TCP
- ftps(implicit) 990/TCP
【SFTPについて】
■mod_sftp.c について
SFTPの設定モジュール。
■設定例
SFTPAuthMethodsで認証を公開鍵のみにし、SFTPAuthorizedUserKeysで公開鍵の場所を指定する
<IfModule mod_sftp.c>
<VirtualHost xxx.xxx.xxx.xxx>
Port 22 ←適宜変更で
DefaultRoot ~/
AllowOverwrite on
SFTPEngine on
SFTPLog /var/log/proftpd/sftp.log ←適宜変更で
SFTPHostKey /etc/ssh/ssh_host_dsa_key
SFTPHostKey /etc/ssh/ssh_host_rsa_key
SFTPAuthMethods publickey ← 公開鍵認証のみにしてパスワード認証を禁止する。
SFTPAuthorizedUserKeys file:~/.ssh/id_rsa.pub ←公開鍵の保存場所を指定する。
</VirtualHost>
</IfModule>
■鍵ペアの作り方
※Windowsクライアントを使っている場合…
Windowsで、WinSCP付属のPuTTYgenを立ち上げる。
以下の設定で、「Generate」ボタンを押す
- Parameters :SSH2 RSA
- Number of bits :2048
■公開鍵を保存する
「Save public key」ボタンを押して、たとえば
ホスト名_ユーザーID_id_rsa.pub
として保存する
■秘密鍵を保存する
Key passphrase/Confirm passphraseに秘密鍵を使うときのパスワードを入力する。これが今後、ログインする前に毎回入力するパスワードになるので忘れないで!
「Save private key」ボタンを押して、たとえば
ホスト名_ユーザーID_key.ppk
として保存する
【サーバーの準備】
公開鍵をサーバーに設置する
・ユーザーのホームディレクトリ直下に「.ssh」フォルダを作成する
・「id_rsa.pub」というテキストファイルを作り、公開鍵の---- BEGIN SSH2 PUBLIC KEY ----から---- END SSH2 PUBLIC KEY ----までをコピペする。
・id_rsa.pubのオーナーを持ち主、権限を600に変える
(doraemonの場合)
chown doraemon:doraemon doraemon
chmod 600 id_rsa.pub
【クライアントの準備】
WinSCPなどで接続する場合、
Private key fileにパソコンのどこか安全な場所に保存した秘密鍵を指定する。
【FTPSについて】
■秘匿性
ExplicitとImplicitの2種類あり、秘匿性は
Explicit(接続後暗号化) < Implicit(開始時点から暗号化)。
しかし、proftpdはImplicitは未対応のため、Explicitで運用する。
■mod_tls.c について
FTPSの設定モジュール。
http://www.proftpd.org/docs/directives/linked/config_ref_mod_tls.html
■設定例
MasqueradeAddress www.xxx.com ←NAT経由ならFQDNまたはグローバルユニークアドレス
PassivePorts 49152 49200 ←Paasiveポートを指定するなら(ポート番号は適宜変更のこと)
<IfModule mod_tls.c>
TLSEngine on
TLSVerifyClient off
TLSLog /var/log/proftpd/ftps.log ←適宜変更で
TLSCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
TLSProtocol SSLv3 TLSv1
TLSRequired on
TLSRSACertificateFile /etc/pki/tls/certs/サーバー証明書.crt
TLSRSACertificateKeyFile /etc/pki/tls/private/秘密鍵.key
</IfModule>
■mod_tls.c詳細
- TLSEngine SSL/TLSを有効にする(Default=OFF)
- TLSVerifyClient クライアント証明書の設定。onなら必須。
- TLSLog SSL/TLSに関するログ出力先の指定
- TLSProtocol 暗号化プロトコルの指定(Default=1.2.7c以降はSSLv3 TLSv1、それ未満はSSLv23{SSL3.0とTLS1.0}。どちらにせよ明示的な設定不要。)
- TLSCipherSuite 利用可能な暗号方式を指定する(Default=ALL:!ADH)
- TLSRequired controlとdataの暗号化を取りきめる(Default=OFF)
onはcontrolとdataの双方を暗号化し、offはクライアント次第。
他にctrl/data/auth/auth+dataなどが選べる
(onがImplicitというわけではない)。
- TLSRSACertificateFile サーバー証明書の指定(CA局から届くもの)
- TLSRSACertificateKeyFile 秘密鍵の指定(サーバーで作成したもの)
■証明書関連
[ドメインとIPアドレス、ポート番号]
www.xxx.com
ipaddr:xxx.xxx.xxx.xxx
ポート:1000
最終的に以下のファイルを用意する(とする)。
秘密鍵 /etc/pki/tls/private/www.xxx.com.key
サーバー証明書 /etc/pki/tls/certs/www.xxx.com.crt
■参考 秘密鍵などの証明書について
・秘密鍵
(「BEGIN RSA PRIVATE KEY」で始まり「END RSA PRIVATE KEY」で終わるもの)
・サーバー証明書
(「BEGIN CERTIFICATE」で始まり「END CERTIFICATE」で終わるもの)
・中間証明書
(「BEGIN CERTIFICATE REQUEST」で始まり「END CERTIFICATE REQUEST」で終わるもの)
※参考 Apacheでは以下のように使っている場合が多い。
---
SSLCertificateFile xxx.crt ←サーバー証明書
SSLCertificateKeyFile xxx.key ←秘密鍵
SSLCertificateChainFile xxx.cer ←中間証明書
---
■証明書作成作業手順
[秘密鍵の作成]
openssl genrsa -out www.xxx.com.key 2048
$ openssl genrsa -out www.xxx.com.key 2048
Generating RSA private key, 2048 bit long modulus
........+++
...................................................+++
e is 65537 (0x10001)
$
証明書要求書(CSR)の作成
$ openssl req -new -key www.xxx.com.key -out www.xxx.com.csr
-----
Country Name (2 letter code) [GB]:JP
State or Province Name (full name) [Berkshire]:Tokyo
Locality Name (eg, city) [Newbury]:Chiyoda-ku
Organization Name (eg, company) [My Company Ltd]:xxx
Organizational Unit Name (eg, section) []:xxx
Common Name (eg, your name or your server's hostname) []:xxx
Email Address []: エンターでおk
A challenge password []: エンターでおk
An optional company name []: エンターでおk
$
俺俺証明局での作業内容
ssh 俺俺証明局サーバー
cd /var/xxx/private-ca
vi server/www.xxx.com.csr
---
上記で作成した証明書要求書の-----BEGIN CERTIFICATE REQUEST-----から-----END CERTIFICATE REQUEST-----をコピペする。
---
署名し、サーバー証明書を書きだす。
# /usr/local/ssl/bin/openssl ca -config openssl.cnf \
> -keyfile xxx/private/ca.key \ ←既に住所などが明示されたものがあれば
> -cert xxx/ca.crt \
> -in server/www.xxx.com.csr -out server/www.xxx.com.crt
Using configuration from openssl.cnf
Enter pass phrase for xxx/private/ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 35 (0x23)
Validity
Not Before: Jan 30 05:16:56 2013 GMT
Not After : Jan 30 05:16:56 2016 GMT
Subject:
countryName = JP
stateOrProvinceName = Tokyo
organizationName = xxx
organizationalUnitName = xxx
commonName = xxx
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Cert Type:
SSL Server
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
3C:DD:B9:FF:38:4A:EA:BC:xx
X509v3 Authority Key Identifier:
keyid:79:2F:94:AB:B5:B5:xx
DirName:/C=JP/ST=Tokyo/L=Chiyoda-ku/O=xxx/OU=xxx/CN=xxx
serial:80:4C:xx
Certificate is to be certified until Jan 30 05:16:56 2016 GMT (1095 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#
proftpdサーバーで、秘密鍵およびサーバー証明書を配置する
cp www.xxx.com.key /etc/pki/tls/private/
vi /etc/pki/tls/certs/www.xxx.com.crt
---
-----BEGIN CERTIFICATE-----~-----END CERTIFICATE-----をコピペする。
---