ftp.proxy というオープンソースのツールを用いて、FTP PROXY サーバを立てる方法を纏めた記事です。PROXY を通せば、グローバルな環境から、ローカルな環境にあるサーバに対して FTP をする事が出来るほか、セキュリティを確保するための手段にも用いれます。様々な実現方法がある中で、本記事は ftp.proxyを使い、比較的手軽に実現する方法を纏めました。
「えーマジ FTP!?」
「FTP が許されるのは小学生までだよねー」
「キャハハハハ」
…という声があるのは百も承知ですが、未だに使いどころもある訳でして。
■ftp.proxyは、アプリケーションによるFTPプロキシ鯖
ftp.proxy は http://www.ftpproxy.org/ で公開されている FTP Proxy サーバ。アプリケーションレベルでの、FTP ゲートウェイであり、クライアント・サーバ間でコマンドやデータの転送を取り持ちます(同サイトの説明より)。各種 Linux で動作。ライセンスは GPL v2。1999年8月に version 1.0.1 が公開され、安定版は version 1.2.3 が公開中。
FTP Proxy があれば、グローバル環境とローカル環境で隔てられているネットワーク間で役に立てます。この FTP を中継するサーバがあれば、そのサーバを介して FTP することが出来るからです。実運用上、FTP Proxy は今日日セキュリティのリスクなどで、どうよ、という場合もありますが、私は、それはそれでポリシーを持って運用したら良いのではと考えています。
本記事では、ftp.proxy のセットアップと、xinetdの制限を行う手順を紹介。ftp.proxy であれば、xinetd を使った TCP Wrapper によるアクセス制限が出来ますので、ある程度のサーバ側セキュリティを担保します。また、ftp.proxy そのものには、より高度なセキュリティ設定が出来ます。各種ドキュメントや、サンプルの設定ファイルをご覧下さい。
■ftp.proxyのインストール
インストールそのものは、非常にシンプルです。ソースを展開して make ; make install 。実際には wget 等で取得して、make するまで。具体的な手順は以下の通り。ちなみに、私の環境は RHEL5 ですが、CentOS やその他の環境でも、同様に設定出来ると思います。
$ wget http://www.ftpproxy.org/download/ftpproxy-1.2.3.tgz $ tar xfz ftpproxy-1.2.3.tgz $ make # make install
これで /usr/local/sbin/ftp.proxy が作成されます。
RPM パッケージも公開されているので、バイナリで手軽にセットアップする方法もあります。x86_64 の環境であれば、
# rpm -ivh http://www.ftpproxy.org/download/packages/ftpproxy-1.2.3-1.x86_64.rpm 準備中... ########################################### [100%] 1:ftpproxy ########################################### [100%]
このように、rpm コマンドを実行するだけでも構いません。他の i386 用や debian 向けは、FTP サイトを参照してください。
■xinetd とアクセス制限
次は、実際に FTP クライアントから ftp.proxy を通して FTP が出来るように設定を行います。本記事の設計方針は、次の通りです。
- ftp.proxy の動作ポートは 2121 とする。
- アクセス制限には、xinetd を経由し、 /etc/hosts.allow および /etc/hosts.deny で行う(tcpserver でも同じように出来るでしょう)。
- ftp.proxy 自身の認証設定は行わない(今回、自分の閉じた環境では必要なかったため。本来は、設定するのが望ましい。運用上はくれぐれもご注意ください)。
ファイル ‘/etc/services‘ に Port 2121 の定義を追加します。一般的なポート TCP 21 は攻撃の危険性があるので、2121 にしました。2121 を選んだのは、ftp.proxy の FAQ に記載があり、倣うことにしました。
# echo 'ftpproxy 2121/tcp # My special ftp.proxy port' >> /etc/services
もし2121 番以外を使いたい場合、任意の空きポートを指定することもできます。21 番を使い続けるのであれば、この手順は不要です。
次に xinetd 側の設定です。
# cat << EOF > /etc/xinetd.d/ftpproxy service ftpproxy { socket_type = stream wait = no user = nobody server = /usr/local/sbin/ftp.proxy server_args = -e -m } EOF
このようにコマンドを実行するか、好きなエディタを使って /etc/xinet.d/ftpproxy ファイルに、記述を行います。先の手順で /etc/services に ftpproxy の定義を追加したのを思い出して下さい。もし Port 21 を使うのであれば、 ‘service’ の横には ftpproxy ではなく、ftp と書きます。また、引数 (server_args) に -e と -m を付与してあります(faqと同じ)。
- ‘-e‘ … クライアント側で接続先のサーバを選べるように指定。
- ‘-m’ … モニタモード。どのディレクトリに移動しているか、ログに記録。
記述後は、設定を有効にするために xinetd を再起動します。
# /sbin/service xinetd restart xinetd を停止中: [ OK ] xinetd を起動中: [ OK ]
次に、ログ取得の設定です。ファシリティは ftp.* です。/var/log/ftpproxy.log に書き出すようにするには、
# echo 'ftp.* /var/log/ftpproxy.log' >> /etc/syslog.conf
syslog.conf にエントリを追加した後は、syslog を再起動します。
# /sbin/service syslog restart カーネルロガーを停止中: [ OK ] システムロガーを停止中: [ OK ] システムロガーを起動中: [ OK ] カーネルロガーを起動中: [ OK ]
さて、これで一通りの準備が整いました。FTP クライアントを起動して、接続を試みて下さい。このときクライアント側では、次のように指定することになります。
- FTP サーバ … ftp.proxy をセットアップしたサーバの IP アドレスまたはホスト名
- FTP User … ‘接続したいFTPサーバのID’@’接続したいFTPサーバのIPアドレス’
例: 192.168.10.2 の hoehoe ユーザであれば hoehoe@192.168.10.2 - FTP Password … 接続したいFTPサーバの当該IDのパスワード
- ポート番号 … 2121 ※忘れずに
クライアントが FFFTP であれば、ホストの設定で次のようにします。
- ‘基本’タブ
- ホスト名(アドレス)(N): ftp.proxy の IP アドレスまたはホスト名
- ユーザ名(U): hoehoe@192.168.10.2 など
- パスワード/パスフレーズ(P): そのパスワード
- ‘拡張’タブ
- ポート番号(X): 2121
※FFFTP で常時 ftp.proxy を通すのであれば、専用のプロキシ設定も可能です。’オプション’→’環境設定’ から、’FireWall’のタブを選び、タイプは ‘USER ユーザ名@ホスト名’、FireWall ホストに ftp.proxy の情報を記載、ポートは 2121 です。この常時 ftp.proxy を通す設定であれば、FFFTP の FTP ホスト追加時、FTP サーバが ftp.proxy のモノに書き換えたり、FTP ID が <ユーザ名>@<HOST> の形式にならず、通常通り <ユーザ名> になります。ローカル側からグローバル側の PROXY であれば、利用者にとっては、このほうが直感的かもしれませんね。
あとは、FTP で接続を試みます。このとき、FTP で接続先のサーバには、ftp.proxy をセットアップしたサーバからの接続許可が必要です。接続先のセキュリティ設定を確認してください。FTP 接続時のクライアント側のエラーが ‘421 Service not available, remote server has closed connection‘ であれば、ほとんどの場合、FTP の接続許可が無いケースでしょう。
ftp コマンドを用いてテストも出来ます。たとえば、FTP Proxy が AAA.BBB.CCC.DDD 、FTP 接続先が192.168.10.2 で 、FTP ユーザ名が admin とします。
$ ftp AAA.BBB.CCC.DDD 2121 ← port 2121 の指定を忘れずに Connected to AAA.BBB.CCC.DDD. 220 server ready - login please 530 login first 530 login first KERBEROS_V4 rejected as an authentication type Name (xxx:xxx): admin@192.168.10.2 331 password required Password: ← 画面に表示されませんが、パスワードを入力 230 login accepted Remote system type is UNIX. Using binary mode to transfer files. ftp>
最後にセキュリティの設定を行います。
# echo 'ftp.proxy: ALL' >> /etc/hosts.deny
まず、全ての接続を拒否する設定を入れます。
次に、/etc/hosts.allow ファイルを開き、接続を許可する環境を記述します。
例:
ftp.proxy: .example.jp ftp.proxy: 192.168.0.
■上手くいかない時は…
- /var/log/messages には、様々なログが出ます。xinetd の再起動時、ポートが認識されているかや、何かエラーが出ていないか確認しましょう。
- /var/log/ftpproxy.log 等、ログに何か表示されていないか確認しましょう。
- もしかして iptables や、外部にファイアウォールが設置されていませんか?
- もしかしてSELinux(略
■まとめ
以上、ftp.proxy を使って FTP PROXY サーバを立てる手順の紹介でした。くれぐれも、セキュリティの対策は忘れずに設定・確認してくださいね。
■本記事の参考URL
ftp.proxy – FTP Proxy Server
http://www.ftpproxy.org/
ftpproxyの情報が世の中には少なく、非常に参考になりました。
ftpproxy自身の認証は使用されない構成で構築されていましたが、もしご存知なら、ftpproxyでも認証を使用する構成で構築する場合の手順なども教えて頂きたく思います。
厚かましいお願いと思いますが、よろしくお願いいたします。
Pingback: ftp.proxyでFTPプロキシサーバを立てる | システム開発メモ