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