セキュア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> |
- TLSLog
TLS関係のログファイルを指定する。通常のログと分けて置くことで異常なアクセスも見つけやすい。なお、logrotate.dをワイルドカードで指定していない場合は、tls.logの追加を忘れずに。
- TLSPortocol
SSL/TLSプロトコル・バージョンを指定する。ここでは、SSLv3およびTLSv1の両方を許可する互換性モード(SSLv23)を指定。
- TLSCipherSuite
利用可能な暗号を指定する。デフォルトのままで問題はないはずであるが、ここでは、ディレクティブの説明の中にある例に合わせ、ADHキー交換を含まないすべての利用可能な暗号を指定した。
- TLSRequired
制御/データの各コネクションでSSL/TLSの要否を指定する。通常接続も必要なので、ここはoffとしクライアントの接続に任せる。指定すると、クライアントは指定コネクションでのSSL/TLS使用を強制される。
- TLSRSACertificateFile/TLSRSACertificateKeyFile
サーバ証明書とキーを指定する。Apache用に作成したサーバ証明書とキーを指定すればよい。サーバ証明書の作成は、こちらを参考にしてください。
- TLSVerifyClient
クライアント証明書の要否を指定する。サーバとクライアントとの相性でうまくいかないこともあると、ProFTPDにもクライアントにも書いてあるので、取り敢えず暗号化ができれば良しということで、ここはoffとした。
■動作試験
FTPクライアントとしては、GetIt FTPとSmartFTPで動作確認しました。なお、ProFTPDは、Explicitのみサポート(Implicitは未サポート)しているので、SmartFTPではImplicitも選択できますが動作しません。以下に両者のSSL関係だけの設定方法を示します。
◆GetIt FTPのSSL関係の設定
GetIt FTPのSSL関係の設定を以下に示します。なお、ついでと言ってはなんですが、日本語化しましたので、
ソフトダウンロードにパッチを置いておきます。
- サイトアイコンを押し、「Site manager」を開く。
- 「新規サイト」又は「サイトの編集」を押し、「Site propaties」を開く。
- 「セキュリティ」タブを選択し、「プロパティ」の「タイプ」で「FTP with SSL」を選択する。このとき、「データ・チャネルでSSLを使用しない」が選択できるようになるので、必要に応じてチェックする。通常はデータも含めて保護するはずなので、未チェックとすること。
◆SmartFTPのSSL関係の設定
SmartFTPのSSL関係の設定を以下に示します。このクライアントは、日本語化パッチも用意されています。
- 「お気に入り」から「お気に入りの編集」を選択し、「お気に入り」を開く。
- 右ウインドウで右クリックして「新規作成」から「お気に入り」を選択して、適当な名前を付与してサイトを登録する。
- 登録したサイト名の上で右クリックし、「プロパティ」から「基本設定」を開く。
- 「全般」の「サーバー」の「プロトコル」の「プルダウンメニュー」から、「FTP
over SSL Explisit」を選択する。
- 続いて「接続」->「SSL」で、SSL関係の設定をする。「セキュアコネクション」の「認証モード」は「TLS-C」に、「データコネクションモード」は「暗号化データコネクション」の選択する。
- 「クライアント証明書」は不要に設定してあるのでいらないはずだが、何故か設定しないと接続できないので、「証明書を使用する」をプルダウンメニューから選択し、「証明書の作成」を押してウイザードに従って証明書を作成する。(ユーザ名を入れるだけで他はデフォルトでも問題はない。)
Top Pageへ