ちょっとセキュアないつものFTP設定 | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

最近、FTPを通してサイト改ざんの被害なんかが広まっていますが、そもそもインターネット越しにFTPは使うなというのは自論としてあるんですが、設定を少し見直すだけでFTPのセキュリティも多少改善されたりします。

その設定方法や運用上のTipsを幾つか書いてみたいと思います。

なお、ここではLinux系のでの設定方法を書いていますので、WindowsでのFTPサーバーの設定ではできないやり方も含まれています。



ネットワークlによる接続制限


まずは、FTPへ接続できるN/Wをそもそも制御してしまいましょう、というやり方です。

N/W機器によって制限するやり方ももちろんありますが、ここではFTPデーモン側でどうにかする方法を。


tcp_wrapperに対応しているサーバーであれば、「/etc/hosts.allow」に


vsftpd:192.168.0.0/255.255.0.0

※ vsftpdを使っている場合


のような書き方をすれば、特定のN/WにあるPCからしか接続できなくなります。

また、proftpdでは設定ファイル(proftpd.conf)に、


    <Limit LOGIN>
        Order Allow,Deny
        Allow from 192.168., 127.0.0.1
        Deny from all
    </Limit>

のように書きます。

これは、あまり広い範囲でN/Wアドレスを指定していては意味がありません。

管理用のPCが決まっているのであれば、その固定IPを幾つか設定しておくようにしましょう。



接続するユーザー名での制限


一部のFTPデーモンでは、接続するユーザーを制御したり、FTP専用のユーザーを作ることができたりします。

例えば、proftpdでは


    <Limit LOGIN>
        Order Allow,Deny
        AllowUser workuser
        Deny from all
    </Limit>

のように書くことで、「workuser」のみFTP接続を許可するということができます。

また、FTPユーザーがOSのユーザーとなっている場合、FTP接続用のIDとパスワードが漏れればサーバーへもログイン可能という状態に陥ったりします。

それを回避するために、FTP専用のユーザーやバーチャルユーザーを作ることもできたりします。


参考: OS上にいないバーチャルユーザーを使ってFTP接続する



データ転送用ポートの変更


FTPにはアクティブモードとパッシブモードの2つ通信方法があります。

パッシブモードの場合、任意のデータ転送用ポートがサーバーから指定されるため、毎回接続ポートがことなってきます。

一方で、アクティブモードはよく知られた20番ポートをデフォルトで使います。


こう見ると接続ポートが推測されにくいパッシブモードの方がセキュリティ的に高くなるわけですが、FireWallをはさむ環境の場合、パッシブモードでのデータ転送ができない場合もあります。

理由は、F/Wでは通信を許可するポートを絞っているため、任意のポートを開いて通信するというようなことができないためです。

ただ、いづれの場合でもデータ転送用のポートを固定することは可能です。


参考: FTPのアクティブモードとパッシブモード + vsftpdでの設定方法


通常のFTP通信とは異なるポートを利用することで、データ転送自体を少しだけ安全にすることができます。



転送用ディレクトリと転送ファイルの制限


多くのFTPデーモンでは、FTP接続時のルートディレクトリを指定することができます。

ルートディレクトリを指定していれば、それより上位のディレクトリには移動できません。
これは場合によっては、不便ですがFTP接続できればあらゆるディレクトリに移動でき、ファイルを取得・転送できるという状況に陥るよりはだいぶましです。


本当にFTPできる作業用ディレクトリに限定させることで、被害を最小限にとどめることもできます。

例えば、HTMLファイルを直接書き換えられるようにドキュメントルートとFTPルートディレクトリを同じにせず、FTP転送用ディレクトリにファイルを一旦転送させ、その後SSHなどでサーバーにログインして作業することで、直接的にコンテンツを改ざんされるというような状況は少なくなります。

また、FTPデーモンによっては転送できるファイルを制限することもできたりします。


参考: [vsftpd] 特定の拡張子のファイルのアップロードを禁止する



転送ログを見る


FTPのログをきちんと残しておくことで、どこから何のファイルが転送されたかを確認することができます。

これを定期的にチェックすることで、予定していない操作がされていないかをチェックすることができます。

Linuxの場合、FTPの転送ログは下記に保存されたりします。


/var/log/xferlog

そのまま見るのは、かなり骨が折れますがLogwatchなどログを整形してくれるツールを使えばチェックしやすくなるでしょう。


--------------------- ftpd-xferlog Begin ------------------------ 
TOTAL KB OUT: 558KB (0MB)
TOTAL KB IN: 558KB (0MB)

Incoming User FTP Transfers: hoge -> /home/foo/scripts.tar.gz (User: foo) Outgoing User FTP Transfers: /home/foo/images.tar.gz -> hoge (User: foo) ---------------------- ftpd-xferlog End -------------------------


上記の場合、期間中のファイル転送量や、どのユーザーが(上記の場合foo)どのファイルをダウンロードしたのか、アップロードしたのかということがわかったりします。


参考: Logwatchでサーバー上のログを集約する



まとめ


結論としては、最初に書いたようにインターネット越しでファイル転送する場合はFTPを使うない方が無難です。

ここにあげた設定は、少しは有効に働くかもしれませんが、それほど効果は大きくありません。

パスワードを含め、転送データが暗号化されませんので、転送途中で傍受される恐れもあります。

ファイル転送をしたい場合は、SCPやSFTPなどを使うほうが良いでしょう。

これであれば、通信が暗号化される上に、IDとパスワードを用いない公開鍵認証も使えます。


参考: [SSH] 公開鍵認証方式で接続する