nginxでDDoSに対抗するためのCSFとのFail2ban統合

ConfigServer Security&Firewall(CSF)スクリプトスイートには、当初、iptablesパケットフィルターを使用してWebホスティングサーバーを保護するためのかなり豊富な機能セットがあります。 特に、攻撃されたホストがTCPおよびSYN、UDP、およびICMPの弱いおよび中程度の強度のパケットでフラッディングするのを防ぐために使用できます。 CSFには、組み込みのログイン失敗デーモン(lfd)が追加されています。これは、パスワードを選択するために、さまざまなネットワークサービスでのログイン試行の失敗の数をログで監視します。 このような試みは、攻撃者のIPアドレスをCSFブラックリストに追加することによりブロックされます。



同様の機能を実装する別のサードパーティツールがあります:Fail2ban。 解決されるタスクの類似性にもかかわらず、lfdとFail2banの間には基本的な違いがあります。 最初のアーキテクチャはクローズドアーキテクチャであり、サポートされるサービスは限られています。 2番目の方法では、ほぼすべてのタスク用のフィルターを独立して開発できます。 ただし、CSFとFail2banは、iptablesルールをいくぶん無秩序に処理するため、同じサーバー上でひどく共存します。 Linux Debian v7.XX amd64 OSを例としてこの問題を解決し、両方のツールの機能を最大化するようにします。 また、例として、nginxに対するDDoS攻撃に対する保護を編成します。



私の構成では、CSFは元々サーバーにインストールおよび構成されていました。 この問題については詳しく説明しませんが、十分な資料があります。 ファイル「/etc/csf/csf.conf」で次の設定を行うことをお勧めします。

 SYNFLOOD = "1"
 SYNFLOOD_RATE = "100 / s"
 SYNFLOOD_BURST = "10"

 CONNLIMIT = "80; 110,443; 110"

 PORTFLOOD = "80; tcp; 20; 1,443; tcp; 20; 1"

 CT_LIMIT = "300"
 CT_INTERVAL = "60" 




このような構成により、CSFは、TCP SYNパケットによるフラッド攻撃に関与するホストに対抗したり、HTTPサーバーのTCPポートへの多数の接続を開いたりすることができます。

Fail2banのインストールに進みます。その後、停止して自動実行を無効にする必要があります。

 サービスfail2ban停止
 update-rc.d -f fail2ban remove




CSFを使用してFail2banを起動します。 これを行うには、スクリプト「/etc/csf/csfpost.sh」を作成します。

  #!/ bin / sh
 /etc/init.d/fail2ban reload 




CSFが更新などの場合にCSFが独自のルールをリロードする場合、iptablesにFail2banルールの自動ロードを提供します。

Fail2banをCSFと統合するという考え方は、最初の攻撃者がiptablesルールではなく、2番目のブラックリストを使用して攻撃者のIPアドレスをブロックするという事実に基づいています。 ただし、Fail2banではiptablesを完全に放棄しません。

Fail2banのすべてのフィルターを無効にします。 それらのほとんどはlfdでカバーされています。 Fail2banは、lfdをサポートしないものにのみ使用されます。

  sed -i "s | enabled = true | enabled = false | g" /etc/fail2ban/jail.conf 




CSFサポートをFail2banに追加します。 これを行うには、次の内容で設定ファイル「/etc/fail2ban/action.d/csf-ip-deny.conf」を作成します。

  [定義]
 actionstart =
 actionstop =
 actioncheck =
 actionban = csf -d <ip> <name>に対してFail2Banによって追加
 actionunban = csf -dr <ip> 




すべてのFail2banを置換すると、作成された「csf-ip-deny」でブロッキングアクションがフィルタリングされます。

 sed -i -e "s | banaction = | banaction = csf-ip-deny \ n#banaction = |"  /etc/fail2ban/jail.conf




特に迷惑な侵入者には、長いロックが提供されます。 このメカニズムは、Fail2ban自体のジャーナルを監視することで実装されます。 設定ファイル「/etc/fail2ban/filter.d/fail2ban.conf」を作成します。

 [定義]
 #ログファイル内のすべての禁止をカウント
 failregex = fail2ban.actions:警告\ [(。*)\]禁止<ホスト>
 #カウントを正確に保つために、独自の禁止を無視します。
 #設定で、jailに「fail2ban」という名前を付けるか、この行を変更します!
 ignoreregex = fail2ban.actions:警告\ [fail2ban \]禁止<ホスト>




「/etc/fail2ban/jail.conf」に次の行を追加します。

 ## CSFを使用したfail2banにより、繰り返し犯人をブロック
 [fail2ban]
有効= true
フィルター= fail2ban
 action = iptables-allports
 #sendmail-whois [名前= fail2ban]
 logpath = /var/log/fail2ban.log
 maxretry = 10
 #検索時間:1日
 findtime = 86400
 #禁止期間:1週間
禁止時間= 604800




つまり 日中に他のフィルターで10回以上ブロックされたサイバー犯罪者は、このフィルターで1週間ブロックされます。 アクションはcsf-ip-denyではなくiptables-allportsであることに注意してください。 これは間違いではありません。 そのため、他のフィルターによって偶発的に長いブロックが削除されないようにする必要があります。



次に、DDoS攻撃に対するnginx保護の構成例を使用して、Fail2banフィルタリングルールの作成を検討します。 まず、nginxを設定してみましょう。ngx_http_limit_conn_moduleおよびngx_http_limit_req_moduleモジュールの機能を使用する必要があります。 これを行うには、設定に次の行を追加します。

 limit_conn_zone $ binary_remote_addr zone = perip:10m;
 limit_conn perip 100;
 limit_conn_zone $ server_name zone = perserver:10m;
サーバーごとのlimit_conn 200;
 limit_req_zone $ binary_remote_addr zone = reqip:10m rate = 10r / s;
 limit_req zone = reqip burst = 30; 




したがって、1秒あたり10〜30の新しい接続で200を超えない速度で、一度に1つのIPアドレスから100を超えない接続を、任意の数のIPアドレスから1つのサイトに制限します。 超過分はエラーログに記録され、Fail2banフィルターを構成します。

次の設定ファイルを作成します。

「/etc/fail2ban/filter.d/nginx-conn-limit.conf」

 #Fail2Ban構成ファイル
 #

 [定義]
 #オプション:failregex
 #注。:IPアドレスからの一般的な呼び出しをキャッチする正規表現。
 #値:TEXT
 #
 failregex =ゾーンによる接続の制限*クライアント:<HOST>

 #オプション:ignoreregex
 #注。:無視する正規表現。 この正規表現が一致する場合、その行は無視されます。
 #値:TEXT
 #
 ignoreregex =




「/etc/fail2ban/filter.d/nginx-req-limit.conf」

 #Fail2Ban構成ファイル
 #
 
 [定義]
 #オプション:failregex
 #注。:IPアドレスからの一般的な呼び出しをキャッチする正規表現。
 #値:TEXT
 #
 failregex =リクエストの制限*クライアント:<HOST>
 
 #オプション:ignoreregex
 #注。:無視する正規表現。 この正規表現が一致する場合、その行は無視されます。
 #値:TEXT
 #
 ignoreregex =




「/etc/fail2ban/filter.d/nginx-dos.conf」

 #Fail2Ban構成ファイル
 #

 [定義]
 #オプション:failregex
 #注。:IPアドレスからの一般的な呼び出しをキャッチする正規表現。
 #値:TEXT
 #
 failregex = ^ <HOST>-。* "(GET | POST)。* HTTP。*" $

 #オプション:ignoreregex
 #注。:無視する正規表現。 この正規表現が一致する場合、その行は無視されます。
 #値:TEXT
 #
 ignoreregex =




「/etc/fail2ban/jail.conf」に追加します。

 [nginx-conn-limit]
有効= true
フィルター= nginx-conn-limit
 action = csf-ip-deny [name = nginx-conn-limit]
 logpath = /var/log/nginx/error.log
 maxretry = 4
 findtime = 21600
禁止時間= 3600
 
 [nginx-req-limit]
有効= true
フィルター= nginx-req-limit
 action = csf-ip-deny [name = nginx-req-limit]
 logpath = /var/log/nginx/error.log
 maxretry = 4
 findtime = 21600
禁止時間= 3600

 [nginx-dos]
 #apache-badbotsに基づくが、単純なIPチェック(より多くを要求するIP
 #60秒で240ページ、または平均4p / sは疑わしい)
有効= true
フィルター= nginx-dos
アクション= csf-ip-deny [名前= nginx-dos]
 logpath = /var/log/nginx/access.log
 maxretry = 240
 findtime = 60
禁止時間= 3600




フィルター「nginx-conn-limit」および「nginx-req-limit」はnginxへの接続の制限を超えるユーザーをブロックし、「nginx-dos」は1分あたり240ページ以上のWebサイトに頻繁にアクセスするユーザーをブロックします。



多くの場合、攻撃の目標は、パスワードの推測と多数のXML-RPCリクエストなど、広範囲にわたるWordPress CMSです。 私たちも彼らからの保護を組織しています。

「/etc/fail2ban/filter.d/nginx-wp-login.conf」

 [定義]
 failregex = <HOST>。* POST /wp-login.php
 ignoreregex = </ source>

 「/etc/fail2ban/filter.d/nginx-wp-xmlrpc.conf」
 <source lang = "bash"> [定義]
 failregex = <HOST>。* POST /xmlrpc.php
 ignoreregex = 




「/etc/fail2ban/filter.d/nginx-wp-register.conf」

  [定義]
 failregex = ^ <HOST>。* "GET /wp-login.php\?action=register HTTP /.*"。* $
 ignoreregex = 




「/etc/fail2ban/jail.conf」に追加します。

  [nginx-wp-login]
有効= true
フィルター= nginx-wp-login
 action = csf-ip-deny [name = nginx-wp-login]
 logpath = /var/log/nginx/access.log
 maxretry = 4
 findtime = 600
禁止時間= 3600
 
 [nginx-wp-xmlrpc]
有効= true
フィルター= nginx-wp-xmlrpc
 action = csf-ip-deny [name = nginx-wp-xmlrpc]
 logpath = /var/log/nginx/access.log
 maxretry = 4
 findtime = 600
禁止時間= 3600

 [nginx-wp-register]
有効= true
フィルター= nginx-wp-register
アクション= csf-ip-deny [名前= nginx-wp-register]
 logpath = /var/log/nginx/access.log
 maxretry = 4
 findtime = 600
禁止時間= 3600




nginxに対するDDoS攻撃中にFail2banログで確認できるのは次のとおりです。

ネタバレ
 2015-01-04 13:44:10,660 fail2ban.actions:警告[nginx-req-limit]禁止188.191.47.46
 2015-01-04 13:44:11,668 fail2ban.actions:警告[nginx-conn-limit]禁止109.187.63.199
 2015-01-04 13:44:21,061 fail2ban.actions:警告[nginx-req-limit] 188.191.47.46は既に禁止されています
 2015-01-04 13:44:29,382 fail2ban.actions:警告[nginx-conn-limit]禁止178.123.155.115
 2015-01-04 13:44:36,584 fail2ban.actions:警告[nginx-conn-limit]禁止109.62.153.190
 2015-01-04 13:44:38,246 fail2ban.actions:警告[nginx-dos]禁止5.143.158.88
 2015-01-04 13:44:38,826 fail2ban.actions:警告[nginx-req-limit]禁止178.158.206.140
 2015-01-04 13:44:41,739 fail2ban.actions:警告[nginx-conn-limit]禁止5.44.168.38
 2015-01-04 13:44:49,877 fail2ban.actions:警告[nginx-dos]禁止91.214.131.71
 2015-01-04 13:44:52,333 fail2ban.actions:警告[nginx-conn-limit]禁止176.125.48.22
 2015-01-04 13:44:53,395 fail2ban.actions:警告[nginx-req-limit]禁止91.207.211.222
 2015-01-04 13:44:53,773 fail2ban.actions:警告[nginx-dos]禁止178.158.206.140
 2015-01-04 13:44:54,849 fail2ban.actions:警告[nginx-conn-limit]禁止5.143.158.88
 2015-01-04 13:44:57,395 fail2ban.actions:警告[nginx-req-limit] 91.207.211.222はすでに禁止されています
 2015-01-04 13:44:57,765 fail2ban.actions:警告[nginx-dos]禁止37.232.87.169
 2015-01-04 13:44:58,073 fail2ban.actions:警告[nginx-conn-limit]禁止77.34.22.95
 2015-01-04 13:44:58,506 fail2ban.actions:警告[nginx-req-limit]禁止93.80.45.244
 2015-01-04 13:45:02,733 fail2ban.actions:警告[nginx-dos]禁止176.120.38.238
 2015-01-04 13:45:05,615 fail2ban.actions:警告[nginx-conn-limit]禁止178.173.4.162 




そして、これは非常に侵入的な侵入者がブロックされる方法です:

ネタバレ
  2015-01-04 11:43:29,618 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 12:43:30,160 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 12:56:53,543 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 13:56:54,279 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 14:02:40,932 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 15:02:41,040 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 15:12:16,906 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 16:12:16,937 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 16:55:33,362 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 17:55:34,142 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 18:23:37,665 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 19:23:38,136 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 19:45:46,850 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 20:03:17,247 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-04 20:45:47.085 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 21:03:17,297 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-04 21:09:51,996 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-04 21:16:22,336 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 22:09:52,036 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-04 22:13:27,799 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-04 22:16:23,295 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-04 22:24:56,755 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-04 23:13:28,058 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-04 23:16:50,235 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-04 23:24:56,843 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-05 00:00:42,183 fail2ban.actions:警告[nginx-wp-login]禁止95.163.121.129
 2015-01-05 00:00:43,851 fail2ban.actions:警告[fail2ban]禁止95.163.121.129
 2015-01-05 00:16:50,263 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-05 00:23:22,863 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-05 01:00:42,637 fail2ban.actions:警告[nginx-wp-login] Unban 95.163.121.129
 2015-01-05 01:23:23,750 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-05 01:26:16,543 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-05 02:26:16,681 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-05 02:32:28,850 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-05 03:32:29,350 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-05 03:39:18,048 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-05 04:39:18,609 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-05 04:43:38,428 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-05 05:43:39,091 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42
 2015-01-05 05:47:47,722 fail2ban.actions:警告[nginx-wp-login]禁止92.255.28.42
 2015-01-05 05:47:50,212 fail2ban.actions:警告[fail2ban]禁止92.255.28.42
 2015-01-05 06:47:48,343 fail2ban.actions:警告[nginx-wp-login] Unban 92.255.28.42




最近、攻撃者が1つのクラスCサブネットの異なるIPアドレスからパスワードの分散列挙を実行するケースがより頻繁になりました。Fail2ban操作アルゴリズムはこの動作を認識できません。

ネタバレ
  2015-01-05 14:01:14,432 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.176
 2015-01-05 14:01:14,656 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.249
 2015-01-05 14:01:35,906 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.198
 2015-01-05 14:02:39,536 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.154
 2015-01-05 14:02:53,766 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.132
 2015-01-05 14:02:53,980 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.202
 2015-01-05 14:04:00,782 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.136
 2015-01-05 14:04:05,007 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.104
 2015-01-05 14:04:07,234 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.167
 2015-01-05 14:04:25,473 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.143
 2015-01-05 14:05:26,993 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.253
 2015-01-05 14:06:25,719 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.230
 2015-01-05 14:06:27,945 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.162
 2015-01-05 14:07:23,484 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.153
 2015-01-05 14:07:56,962 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.140
 2015-01-05 14:08:11,207 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.142
 2015-01-05 14:09:37,759 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.137
 2015-01-05 14:10:59,757 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.175
 2015-01-05 14:11:04,030 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.117
 2015-01-05 14:11:23,273 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.218
 2015-01-05 14:11:41,517 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.139
 2015-01-05 14:13:22,590 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.204
 2015-01-05 14:13:24,808 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.220
 2015-01-05 14:14:36,124 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.190
 2015-01-05 14:14:38,356 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.179
 2015-01-05 14:14:38,577 fail2ban.actions:警告[nginx-wp-login]禁止193.176.147.137
 2015-01-05 14:14:49,805 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.188
 2015-01-05 14:15:48,398 fail2ban.actions:警告[nginx-wp-login] Unban 193.176.147.131




cronスケジューラによって1時間ごとに実行される次のスクリプトを使用して、この欠点を解消してください。

「/etc/cron.hourly/fail2ban-subnets」

 #!/ bin / bash

 log = "/ var / log / fail2ban.log"
制限= 30
 grep = `which grep`

 $ {grep} "fail2ban.actions。*禁止" $ {log} |  $ {grep} -E -o "(25 [0-5] | 2 [0-4] [0-9] | [01]?[0-9] [0-9]?)\。(25 [ 0-5] | 2 [0-4] [0-9] | [01]?[0-9] [0-9]?)\。(25 [0-5] | 2 [0-4] [ 0-9] | [01]?[0-9] [0-9]?)\。(25 [0-5] | 2 [0-4] [0-9] | [01]?[0- 9] [0-9]?) "|  awk -F '。'  '{print $ 1 "。" $ 2 "。" $ 3}' |  sort -u | 行を読みながら
	する
		 count = $($ {grep} -c "fail2ban.actions。* Ban。* $ {line}" $ {log})
			 if [$ {count} -ge $ {limit}]
				それから
					 / usr / sbin / csf -td $ {line} .0 / 24 7d「サブネット$ {line} .0 / 24は、$ {count}回試行した後、Fail2banによって1週間ブロックされます」
			 fi
	やった

出口0




つまり 以前のその他のFail2banフィルターがそれらのアドレスから30回以上トリガーされた場合、クラスC IPネットワークは1週間完全にブロックされます。

結果は次のとおりです。

 #csf -t

 A / D IPアドレスポートDir生存時間コメント
拒否193.176.147.0/24 * 6d 21h 34m 18sでサブネット193.176.147.0/24は、641回の試行後、Fail2banによって1週間ブロックされます
拒否46.148.30.0/24 * 6d 21h 34m 19sでサブネット46.148.30.0/24は、332回の試行後、Fail2banによって1週間ブロックされます
拒否46.148.31.0/24 * 6d 21h 34m 19sでサブネット46.148.31.0/24は、334回の試行後、Fail2banによって1週間ブロックされます




この記事を書くとき、次のリソースのベストプラクティスが使用されました。

https://extremeshok.com/5030/ubuntu-lts-fail2ban-with-csf-and-blocking-of-repeat-offenders-scan-log-files-to-ban-malicious-ips-and-prevent-brute-強制的にログインして設定する/

http://tecadmin.net/add-custom-iptables-rules-with-csf/

https://rtcamp.com/tutorials/nginx/block-wp-login-php-bruteforce-attack/

https://rtcamp.com/tutorials/nginx/fail2ban/

https://www.xaker.name/forvb/showthread.php?t=28659

https://beeznest.wordpress.com/2012/06/08/anti-nginx-dos-filter-for-fail2ban-4/

https://debian.pro/1223

http://www.michelem.org/2014/03/02/stopblock-apachenginx-hack-attempts-with-fail2ban/

http://www.krazyworks.com/permanently-ban-ip-with-fail2ban/

http://www.shellhacks.com/en/RegEx-Nayti-IP-Adresa-v-Fayle-s-Pomoshchyu-Grep



All Articles