セキュアFTPサーバの構築(ProFTPD+SSL/TLS)


サーバに置いたファイルを外部から扱う方法には、SSHやWebDAV等のいろいろな方法がありますが、特に難しいオペレーションを必要しないFTPを使用する方法も考えられます。しかし、外部から使用するとなるとセキュリティの問題がありますので、今回は、おやじが使用しているProFTPDをSSL/TLS化してみました。ProFTPDでは、1.2.7RC1以降でmod_sslに対応しています。
ProFTPD1.2.10rc1から「NLST」のオプション指定が未サポートになり、FFFTPなどではデフォルトのままではファイル一覧が取得できないので注意が必要です。これはRFC959に基づく変更であり、クライアントの設定を変更して「LIST」コマンドでファイル一覧を取得するようにすれば大丈夫です。
なお、このままではドットファイルが見えなくなるので、見せる必要があるなら、「ListOptions」ディレクティブを 「ListOptions "-a"」のように、proftpd.conf に追記してください。


[重要] SSLでの接続を行うと、クライアント側にNATルータが入っている場合はインターネット側からはActiveモードが使えなくなります。これは、通信がSSL化により暗号化されるためクライアント側のルータがPORTコマンド内のクライアントのアドレス(ポート番号)を変換できなくなり、クライアントのプライベートアドレスがそのまま中継されてしまうからです。ルータ環境下では対処方法はありませんが、PASVは問題なく使用できるので、何ら問題はないはずです。なお、クライアントがグローバルアドレスを持っている場合(ルータ無しでPPPoEをサーバで終端している場合)は、この問題は発生しません。

■ProFTPDのダウンロードとインストール

ProFTPDを本家のこちらからダウンロードします。おやじがダウンロードしたバージョンは、1.2.9rc1です。
インストールは、任意の場所にソースを展開してmod_sslオプションをつけてコンパイルします。但し、RedHat8/9では、kerberos関係のエラーがでますので、以下のようにしてコンパイルしました。
 $ tar zxfv proftpd-1.2.9rc1.tar.gz
 $ cd proftpd-1.2.9rc1
 $ export CPPFLAGS=-I/usr/kerberos/include  
 $ ./configure --with-modules=mod_tls --with-includes=/usr/include/openssl
 $ make
 $ su
 # make install

 # mkdir /var/log/proftpd   ← 詳細ログ用ディレクトリの作成(詳細ログが必要なければ不要)


■ProFTPDの設定

ProFTPDの設定は、/usr/local/etc/proftpd.confを編集します。基本的な設定は、こちらを参照してください。ここでは、SSL化に関する設定のみをあげて置きます。設定は、例によってエディタで簡単に。修正した部分のみ記載しています。(青字は削除、赤字は追加、緑字は変更したものです。)

 下記をProftpd.confの適当なところに追加する。
<IfModule mod_tls.c>
    TLSEngine on
    TLSLog  /var/log/proftpd/tls.log
    TLSProtocol SSLv23
    TLSCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

    # Are clients required to use FTP over TLS when talking to this server?
    TLSRequired off

    # Server's certificate
    TLSRSACertificateFile /usr/local/certs/server.crt
    TLSRSACertificateKeyFile /usr/local/certs/server.key

    # Authenticate clients that want to use FTP over TLS?
    TLSVerifyClient off
</IfModule>

■動作試験

FTPクライアントとしては、GetIt FTPとSmartFTPで動作確認しました。なお、ProFTPDは、Explicitのみサポート(Implicitは未サポート)しているので、SmartFTPではImplicitも選択できますが動作しません。以下に両者のSSL関係だけの設定方法を示します。

◆GetIt FTPのSSL関係の設定

GetIt FTPのSSL関係の設定を以下に示します。なお、ついでと言ってはなんですが、日本語化しましたので、ソフトダウンロードにパッチを置いておきます。
  1. サイトアイコンを押し、「Site manager」を開く。
  2. 「新規サイト」又は「サイトの編集」を押し、「Site propaties」を開く。
  3. 「セキュリティ」タブを選択し、「プロパティ」の「タイプ」で「FTP with SSL」を選択する。このとき、「データ・チャネルでSSLを使用しない」が選択できるようになるので、必要に応じてチェックする。通常はデータも含めて保護するはずなので、未チェックとすること。

◆SmartFTPのSSL関係の設定

SmartFTPのSSL関係の設定を以下に示します。このクライアントは、日本語化パッチも用意されています。
  1. 「お気に入り」から「お気に入りの編集」を選択し、「お気に入り」を開く。
  2. 右ウインドウで右クリックして「新規作成」から「お気に入り」を選択して、適当な名前を付与してサイトを登録する。
  3. 登録したサイト名の上で右クリックし、「プロパティ」から「基本設定」を開く。
  4. 「全般」の「サーバー」の「プロトコル」の「プルダウンメニュー」から、「FTP over SSL Explisit」を選択する。
  5. 続いて「接続」->「SSL」で、SSL関係の設定をする。「セキュアコネクション」の「認証モード」は「TLS-C」に、「データコネクションモード」は「暗号化データコネクション」の選択する。
  6. 「クライアント証明書」は不要に設定してあるのでいらないはずだが、何故か設定しないと接続できないので、「証明書を使用する」をプルダウンメニューから選択し、「証明書の作成」を押してウイザードに従って証明書を作成する。(ユーザ名を入れるだけで他はデフォルトでも問題はない。)

Top Pageへ