proftpdをインストールした際に、ログにdelaying for XX usecsという表示が出るので、調べた際のメモ。
「delaying for...」というメッセージは、proftpdのmod_delayモジュールから出力されており、これはタイミング攻撃(Timing Attack)を防止するためのもの。
タイミング攻撃とは、ログイン時にアカウントの存在するユーザと存在しないユーザの処理のタイミングの違いを測ることによって、存在するユーザを判別する攻撃のこと。これにより、存在することが分かったアカウントを集中的に攻撃することで、アカウントの奪取が容易になってしまう。
この対策として、返答する際にランダムな待ち時間を入れるためにmod_delayモジュールが用意されており、proftpdのバージョン1.3.0以降にて、デフォルトで組み込まれ有効になっている。
□ auth.logのサンプル --------------------------------------------------------- Aug 18 11:32:53 srv3 proftpd[3168]: srv3 (X.X.X.X[X.X.X.X]) - mod_delay/0.5: delaying for 27 usecs Aug 18 11:32:53 srv3 proftpd[3168]: srv3 (X.X.X.X[X.X.X.X]) - mod_delay/0.5: delaying for 4 usecs Aug 18 11:32:53 srv3 proftpd[3168]: srv3 (X.X.X.X[X.X.X.X]) - mod_delay/0.5: delaying for 62 usecs Aug 18 11:32:53 srv3 proftpd[3168]: srv3 (X.X.X.X[X.X.X.X]) - no such user 'Administrator' --------------------------------------------------------- □ mod_delay.cの一部 --------------------------------------------------------- static void delay_delay(long interval) { struct timeval tv; long rand_usec; /* Add an additional delay of a random number of usecs, with a * maximum of half of the given interval. */ rand_usec = ((interval / 2.0) * rand()) / RAND_MAX; interval += rand_usec; pr_log_debug(DEBUG10, MOD_DELAY_VERSION ": additional random delay of %ld usecs added", (long int) rand_usec); tv.tv_sec = interval / 1000000; tv.tv_usec = interval % 1000000; pr_log_debug(DEBUG0, MOD_DELAY_VERSION ": delaying for %ld usecs", (long int) ((tv.tv_sec * 1000000) + tv.tv_usec)); delay_signals_block(); (void) select(0, NULL, NULL, NULL, &tv); delay_signals_unblock(); } --------------------------------------------------------- □ mod_delayが導入されているか判別する /usr/sbin/proftpd -lを実行することで判別できる。 --------------------------------------------------------- $ /usr/sbin/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_delay.c mod_dso.c mod_auth_pam.c mod_readme.c mod_cap.c mod_ctrls.c --------------------------------------------------------- □ 具体的にどのくらいの遅延が行われているのか調べてみた --------------------------------------------------------- # grep usecs /var/log/auth.log |cut -d ' ' -f9-|sed -e "s/^\- //g"|sort -n -k 4 mod_delay/0.5: delaying for 1 usecs mod_delay/0.5: delaying for 1 usecs mod_delay/0.5: delaying for 1 usecs : mod_delay/0.5: delaying for 2688526 usecs mod_delay/0.5: delaying for 2904125 usecs mod_delay/0.5: delaying for 2944477 usecs --------------------------------------------------------- 最低で1μ秒から2944.477m秒までと大きな幅があったが 計測した3124件のうち、100μ秒を超えたのはわずか52件で ほとんどのケースでは、数十μ秒のオーダーの遅延を付加して返答している。 □ 関連リンク Proftpd.org - mod_delay http://www.proftpd.org/docs/modules/mod_delay.html パソコンおやじ - Timing attack対策(mod_delayモジュールの組み込み) http://www.aconus.com/~oyaji/ftp/proftpd_rpm.htm#tim ProFTPD module mod_delay http://www.castaglia.org/proftpd/modules/mod_delay.html
□ proftpdのアタック対策メモ@ Debian 不特定のIPに対して、デフォルトのftpポートを開かなければならない場合 ファイヤウォールやiptablesなどで通常のパケットフィルタリングは使えない。 よって、proftpd側の設定とiptablesを併用して、ftpへのアタックに対する 制限を加えて、アタックの頻度を少なくする対策をした際のメモ。 □ /etc/proftpd/proftpd.confの変更 # vi /etc/proftpd/proftpd.conf --------------------------------------- MaxLoginAttempts 1 --------------------------------------- の行を追加して、接続ごとにログイン試行が可能な回数を3回から1回に変更。 通常の正規ユーザであれば、ftpクライアントソフトを使用しているケースが多く パスワードを間違える機会が少ないので、ログイン試行回数を1に絞っても 問題ないでしょう。 # /etc/init.d/proftpd restart でproftpdの再起動、もしくはreloadを行う。 □ iptablesの設定 iptablesのipt_recentモジュールを利用して、ftpポート(21)に対するアクセスを 10分(600秒)で5回に制限した。 これを設定した場合、10分間あたり5回以上のアクセスはパケットを DROPするので、アタックで高頻度にアクセスされた場合は 攻撃元IPアドレスからの接続を一時的にできなくさせる。 これにより、たいがいのケースでは攻撃者はアタックをあきらめる。 下記のコマンドを実行。設定の確認は# iptables -Lで。 ---------------------------------------------------------- # iptables -A INPUT -p tcp --syn --dport 21 -m recent --name ftpattack --set # iptables -A INPUT -p tcp --syn --dport 21 -m recent --name ftpattack --rcheck --seconds 600 --hitcount 5 -j DROP ---------------------------------------------------------- 上記の設定だけでは、再起動時に設定がリセットされてしまうので 永続的に設定する場合は、iptables-saveしておくこと。 □ ポート番号を変更する方法 不特定多数に公開するftpサーバでは使いにくい方法ですが 特定のメンバに公開するサーバであれば、ポート番号を変更してしまう手があります。 # vi /etc/proftpd/proftpd.conf ----------------------- Port 21 ----------------------- を ----------------------- Port 10021 ----------------------- など任意のIPに書き換えて、/etc/init.d/proftpd restartなどで proftpdを再起動してポート変更を有効にする。 □ <Limit>ディレクティブを利用して特定のIPからのアクセスを禁止する 下記のような設定をproftpd.confに追加する。 111.111.111.111の箇所を、拒否したいIPアドレスに置き換える。 # vi /etc/proftpd/proftpd.conf --------------------------- <Limit LOGIN> Order deny,allow Deny from 111.111.111.111, 222.222.222.222 Allow from all </Limit> --------------------------- http://www.proftpd.org/docs/faq/linked/faq-ch5.html#AEN514 その他、セキュリティを高める目的であれば、パスワードや通信内容が 平文で送られてしまうftpプロトコルを利用せずに、SSL/TLSモジュールを利用して暗号化して通信を行ったり、ssh関連コマンドのscpやsftpを使うことを 検討してみても良いかと思います。 もっとも、後者の方はクライアント側でもscp/sftpに対応したソフトが (WinSCPなど)必要になるので、不特定多数向きではありません。 参考URL The ProFTPD Project - Proftpd A User's Guide http://www.proftpd.org/localsite/Userguide/linked/userguide.html The ProFTPD Project - Professional FTP Daemon FAQ http://www.proftpd.org/docs/faq/linked/faq.html