金曜日, 2月 01, 2013

ProftpdのSFTPとFTPSの覚書(まとめ中)


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-----をコピペする。
---