トップ «前の日記(2008-08-18) 最新 次の日記(2008-08-21)» 編集

ORCA愉快日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|10|11|12|
2012|01|02|09|
2013|04|

2008-08-19 proftpdのmod_delayメモ

_ [Linux] proftpdのmod_delayメモ

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

_ [Linux] proftpdのアタック対策メモ

□ 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

トップ «前の日記(2008-08-18) 最新 次の日記(2008-08-21)» 編集