LANDISK HACKING DIARY
Since2005/8/17
TOPへ戻る
     INDEX
   
1. ProFTPD + SSL によるFTP通信の暗号化
2. トラブルシューティング
3. Timing attack対策
4. 参考文献




 
     ProFTPD + SSL によるFTP通信の暗号化
 
FTP による通信は、周知の通り、データがネットワーク上を平分で流れるため、セキュリティ的には好ましくありません。前回は、SSHポートフォワーディングによるFTP暗号化接続について説明しましたが、今回はProFTPD + SSL 接続について解説していきます。SSHポートフォワーディングでFTP接続する場合、通信は暗号化されますが、転送データは暗号化されません。その代わり、秘密鍵がなければFTPにも接続することができないので強固になります。SSLを使った場合、秘密鍵などはありませんが(証明書はある)、通信とデータの両方が暗号化されるのでこれも強固になります。今回は後者のFTP通信のSSL化について説明していきます。なお、詳細に関しては、パソコンおやじさんの「セキュアFTPサーバの構築(ProFTPD+SSL/TLS) 」が詳しいのでそちらを参考にしたほうがいいと思います。

まず、ここでの想定環境として、以下の環境を想定しています。

■サーバー側環境
 ProFTPD Version 1.2.10(TLS対応)
 YAMAHA RTX1500ルータ
 IPアドレス:219.xxx.yyy.zzz(プライベートアドレスが192.168.0.3)

■クライアント側環境
 マイクロ総合研究所OPT50 ルータ
 IPアドレス:219.117.218.xxx(プライベートアドレスが172.16.50.4)
 FTPクライアントソフト:SmartFTP(日本語化適用)

まず、サーバー側とクライアント側で共通していることは、双方とも、ファイアーウォール内(ルータ内)にマシンが設置されており、NAT/IPマスカレードによってプライベートアドレスが割り振られている点である。クライアント側はプライベートアドレスが割り振られていても特に問題はありませんが、FTPサーバにプライベートアドレスが割り当てられている場合、PASSIVE接続した際にサーバが自身のプライベートアドレスをクライアント側に返してしまうので、クライアント側はFTPサーバにアクセスすることができなくなります(本来ならば、グローバルアドレスを返さなければならない)。また、PASSIVE接続の際、サーバ側は任意のポート番号を返してしまうので、その場合、ルータのフィルタリング設定で何番ポートをあけるべきか明示的に指定することができなくなってしまうので、対策としてProFTPD側で何番から何番のポートを使用しますということを明示的に指定してあげる必要がある。

■ProFTPDの設定

まずは、ProFTPDの proftpd.conf を以下のように編集しておく。以下は、PASSIVE接続をすることを前提とした設定にしており、且つ、細かな設定については省いてある。ここで重要となるのは、2行目と3行目である。MasqueradeAddress には、ルータのグローバルアドレス(WAN側アドレス)を指定する。あるいは、ProFTPD自身がグローバルアドレスを持っている場合は、自身のグローバルアドレスを明記すればよい。PassivePorts では、PASSIVE接続で使用するポート番号を指定しておく。ここでは、20020~20032の間のポート番号を指定している。

ServerType                      inetd
MasqueradeAddress               219.xxx.yyy.zzz
PassivePorts                    20020 20032

<IfModule mod_tls.c>
    TLSEngine on
    TLSLog  /var/log/proftpd-tls.log
    TLSProtocol SSLv23
    TLSCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    TLSRequired on
    TLSRSACertificateFile /usr/local/certs/server.crt
    TLSRSACertificateKeyFile /usr/local/certs/server.key
    TLSVerifyClient off
</IfModule>

TLSに関する設定は以下に簡単に記しておきます。
  TLSEngine・・・・・・・・・TLSを有効にする
  TLSLog・・・・・・・・・・・TLSに関するログ出力先の指定
  TLSProtocol・・・・・・・TLSプロトコルの指定(SSLv23 は、SSLv3およびTLSv1の両方を許可する)
  TLSCipherSuite・・・・利用可能な暗号を指定する
  TLSRequired ・・・・・・TLSを強制使用するか、通常使用するか。on にするとTLSでの接続しか許可しない
  TLSRSACertificateFile/TLSRSACertificateKeyFile
          ・・・・・・・サーバ証明書と鍵のあるPATHを指定する。鍵はパスワードなしの鍵を作成しておく。
  TLSVerifyClient ・・・・クライアント証明書の要否を指定する。on にするとクライアント証明書を求められる。


■サーバー側ルータ(YAMAHA RTX1500)の設定

ここでは、YAMAHAルータを使用しているが、他のルータを使用している場合でも、21番とPassivePorts で指定したポート番号をFTPサーバ宛てにフォワーディングしてあげれば良い。

ip pp secure filter in 20010 20020
ip filter 20010 pass * 192.168.0.3 tcp * 21
ip filter 20011 pass * 192.168.0.3 tcp * 20020-20032


■クライアント側(SmartFTP)の設定

ここでは、SSLに対応したFTPクライアントソフトであるSmartFTPを利用することにする。日本語化も容易されているので比較的導入しやすいだろう。インストール方法などは簡単なのでここでは割愛させていただきます。ダウンロードはこちから。設定の手順を以下に記します。

 1. 「お気に入り」→「お気に入りの編集」
 2. 「お気に入り」→「新規作成」→「お気に入り」で適当な名前をつける
 3. 作成した設定を右クリしてプロパティで「基本設定」を開く。
 4. 「全般」でプロトコルを「FTP(明示的)(認証)SSL」を選択する。
   黙示的を選んでも、ProFTPD側が対応していない。
   「ホスト」と「ポート番号」「パス」を各自の環境に合わせて入力する。

 5. 「SSL」クリックし、「認証モード」を「TLS-C」、コントロールコネクションモードを「Private 暗号文(セキュア)」
   「ファイル転送」「リスト転送」も同様に、「Private 暗号文(セキュア)」にしておく。
   「クライアント証明書」はTLSVerifyClientを off にした場合は、「証明書を使用しない」にチェックをいれておく。


以上の設定でProFTPDサーバに接続できれば成功である。なお、TLSVerifyClient を on にした場合で試してみたものの、SmartFTPで作成した証明書&秘密鍵がなぜかインポートできず、挫折。機会があればもう一度試してみたいところだが、実際のところクライアントとサーバとの相性問題もあるようで動作は不完全のようだ。


 
     トラブルシューティング
 
■TLS付でコンパイルされていない!?

AUTH TLS
500 AUTH not understood


SmartFTPのログを見て上記のようなログが見られる場合は、ProFTPDがTLSを使えるようにコンパイルされていません。以下のconfigure オプションを使って再コンパイルしましょう。

$ ./configure --with-modules=mod_tls --with-includes=/usr/include/openssl
$ make
$ sudo make install

mod_tls が組み込まれているかどうか確認するには、以下のコマンドを入力する。

# proftpd -l
Compiled-in modules:
mod_core.c
mod_xfer.c
mod_auth_unix.c
mod_auth_file.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_auth_pam.c
mod_tls.c
mod_cap.c



 
     Timing attack対策
 
2004年10月17日の時点で、Timing attackというセキュリティ上の問題があるようで、外部から有効なユーザアカウントがわかってしまうというものです。この対策をするには、デフォルトで組み込まれている mod_delay を有効にすることで解決されるそうです。mod_delay はバージョン1.3.0以降、デフォルトで組み込まれるようになります。

<IfModule mod_delay.c>
DelayEngine on
</IfModule>
DelayTable /usr/local/var/proftpd/proftpd.delay



 
     参考文献
 
⇒ProFTPD module mod_tls





TOPへ戻る
 
Copyright © KORO All Rights Reserved.