web-dev-qa-db-ja.com

常に同じURLにヒットするボットをブロックするにはどうすればよいですか?

ボットに激しく非難されていますが、正当なトラフィックをブロックせずにボットを阻止する方法はわかりません。 iptablesルールをいくつか作成しました。つまり、X接続がX秒である場合はブロックしますが、ボットが30秒ごとに2つまたは3つのリクエストしか行わない場合は、あまり効果がありません。

理想的には、これらのボットをURLとそのURLにアクセスした回数で識別したいのですが、いくつかのコードでこれを実行できると確信していますが、関係のない解決策がすでにあるかどうか疑問に思っていましたコード、そしてできればiptablesを介してブロックします。

どんなアイデア、考え、提案でも大歓迎です。

これが私のアクセスログからの出力です:

27.153.233.93 - - [02/Nov/2013:10:44:54 +0000] "GET /register/ HTTP/1.1" 200 8296
192.99.2.188 - - [02/Nov/2013:10:44:54 +0000] "GET /register/ HTTP/1.1" 200 8296
110.86.164.186 - - [02/Nov/2013:10:44:54 +0000] "GET /register/ HTTP/1.1" 200 8296
121.205.239.188 - - [02/Nov/2013:10:44:54 +0000] "POST /register/ HTTP/1.1" 44 339
27.153.233.93 - - [02/Nov/2013:10:44:54 +0000] "POST /register/ HTTP/1.1" 44 339
36.251.24.146 - - [02/Nov/2013:10:44:54 +0000] "GET /wp-login.php HTTP/1.1" 200 1655
110.86.164.186 - - [02/Nov/2013:10:44:55 +0000] "POST /register/ HTTP/1.1" 44 339
192.99.2.188 - - [02/Nov/2013:10:44:54 +0000] "POST /register/ HTTP/1.1" 302 20
110.85.107.18 - - [02/Nov/2013:10:44:56 +0000] "GET /register/ HTTP/1.1" 200 8296
110.86.187.169 - - [02/Nov/2013:10:44:56 +0000] "GET /register/ HTTP/1.1" 200 8296
125.117.214.174 - - [02/Nov/2013:10:44:55 +0000] "POST /wp-admin/admin-ajax.php HTTP/1.1" 200 1166
110.85.107.18 - - [02/Nov/2013:10:44:56 +0000] "POST /register/ HTTP/1.1" 44 339
110.86.187.169 - - [02/Nov/2013:10:44:56 +0000] "POST /register/ HTTP/1.1" 44 339
192.99.2.188 - - [02/Nov/2013:10:44:55 +0000] "GET / HTTP/1.1" 200 10718
110.89.13.58 - - [02/Nov/2013:10:44:57 +0000] "GET /register/ HTTP/1.1" 200 8296
36.251.24.146 - - [02/Nov/2013:10:44:57 +0000] "POST /wp-login.php HTTP/1.1" 302 20
110.89.13.58 - - [02/Nov/2013:10:44:57 +0000] "POST /register/ HTTP/1.1" 44 339
218.86.50.83 - - [02/Nov/2013:10:44:58 +0000] "GET /register/ HTTP/1.1" 200 8296
218.86.50.83 - - [02/Nov/2013:10:44:58 +0000] "POST /register/ HTTP/1.1" 44 339
117.26.195.51 - - [02/Nov/2013:10:44:58 +0000] "GET /register/ HTTP/1.1" 200 8296
120.43.20.103 - - [02/Nov/2013:10:44:58 +0000] "GET /register/ HTTP/1.1" 200 8296
121.205.196.193 - - [02/Nov/2013:10:44:58 +0000] "GET /register/ HTTP/1.1" 200 8296
117.26.195.51 - - [02/Nov/2013:10:44:58 +0000] "POST /register/ HTTP/1.1" 44 339
120.43.20.103 - - [02/Nov/2013:10:44:58 +0000] "POST /register/ HTTP/1.1" 44 339
120.37.207.234 - - [02/Nov/2013:10:44:59 +0000] "GET /register/ HTTP/1.1" 200 8296
27.153.210.2 - - [02/Nov/2013:10:44:59 +0000] "GET /register/ HTTP/1.1" 200 8296
121.205.196.193 - - [02/Nov/2013:10:44:59 +0000] "POST /register/ HTTP/1.1" 44 339
120.37.207.234 - - [02/Nov/2013:10:44:59 +0000] "POST /register/ HTTP/1.1" 44 339
120.37.206.69 - - [02/Nov/2013:10:44:59 +0000] "GET /register/ HTTP/1.1" 200 8296
120.37.206.69 - - [02/Nov/2013:10:44:59 +0000] "POST /register/ HTTP/1.1" 44 339
27.159.234.10 - - [02/Nov/2013:10:44:59 +0000] "GET /register/ HTTP/1.1" 200 8296
27.159.234.10 - - [02/Nov/2013:10:45:00 +0000] "POST /register/ HTTP/1.1" 44 339
4

Fail2ban はシナリオに完全に適合しているようです。どちらかと言えば構成可能であるため、ドキュメントを少し参照するだけで、必要なものをセットアップできます。

7
user10211

そのログには多くの情報がないため、何かを想定する必要があります(またはそれを行うツールを使用する必要があります)。

たとえば、ほとんどのクライアントがUS/EMEAにいるとします。その後、maybe中国からのすべてのIPをブロックできます。ログからWHOISでそれらを取得するか、オンラインサービスを試すことができます。

手動で(本当に「有罪」のサブネットのみをブロックする利点があります):

$ whois 218.86.50.83 | grep "country\|inetnum" | sort | uniq
country:        CN
inetnum:        218.85.0.0 - 218.86.127.255
# iptables-deny 218.85.0.0/15

$ # Repeat for all "suspicious" IPs in your access.log

誰があなたを攻撃しているのかを知るには、access.logと受信IPの最初のビットの統計を時間単位でグループ化します。

$ grep "GET /register/" /path/to/access.log| cut -f 1,4 -d " " | cut -f1-2 -d: | sed -e 's/\(.*\)\.[0-9]* .*:\(.*\)/\2 \1/g' | sort | uniq -c | sort -n

より広いネットワークでグループ化したい場合は、

$ grep "GET /register/" /path/to/access.log | cut -f 1,4 -d " " | cut -f1-2 -d: | sed -e 's/\(.*\)\.[0-9]*\.[0-9]* .*:\(.*\)/\2 \1/g' | sort | uniq -c | sort -n

これはあなたのサンプルのためにあなたに与えます

  1 10 110.85
  1 10 110.89
  1 10 117.26
  1 10 120.43
  1 10 121.205
  1 10 192.99
  1 10 218.86
  1 10 27.159
  2 10 110.86
  2 10 120.37
  2 10 27.153

これで、たとえば、access.logで^ 27.153を検索できます(まだ中国ですが、まだip2locationでカバーされています)。

4
LSerni

このような種類の攻撃は、サーバー自体ではなく、境界で停止する方がはるかに優れています。ほとんどのアプリケーション層ファイアウォールには、IPレピュテーションリストが付属しています。私は特定の製品を推奨したくありませんが、ファイアウォール、IDP機能を提供するCisco、Juniper、および他のほとんどのベンダーは、IPレピュテーションサービスも提供しています。ネットワークチームに相談すると、ネットワークチームが必要な特定の設定を提供できます。

また、オープンソースのアプリケーション層ファイアウォールである Mod Security を使用できます。 modのセキュリティの利点は、阻止できる広範囲の攻撃とは別に、完全なHTTP POSTリクエストをログに記録する機能があります。Apacheはデフォルトではこれを行いません。一度だけ完全なパケットがあれば、攻撃シグネチャも分析できます。たとえば、ボットが特定のPOSTパラメータまたはパケットヘッダー長などを使用している場合、攻撃シグネチャを開発できます。これらのパラメータにも基づいています。

3
void_in

これらのURLが合法である場合、前述のterryのようなfail2banが最も簡単な方法です。別の方法ですが、セットアップとメンテナンスの面ではるかに複雑なのは、snort/suricataを使用することです。しきい値/レート制限もあり、一定時間後にIPベースのブロックがキャンセルされる場合があります。

問題は、これらのURLでボットあたり1つか2つのヒットがある場合に発生します。通常のユーザーに影響を与えずに悪意のある試みをブロックできる唯一のチャンス(ただし、正当なユーザーに影響する可能性があります)

  • アプリケーションで/ register /を/ register-humans-only /に変更します
  • / register /を使用しようとする人をブロックします

ところで、あなたのアクセスログは、refererやuser-agentのようないくつかの値を見逃しているようです。ユーザーエージェントに基づくパターンを確認できますか。たとえば、常に同じですか。その場合は、uri/user-agentsに基づいてブロックを試みることもできます。

それらのURLが正当でない場合は、それらにアクセスしたい人をブロックしてください。

前述のように、国全体をブロックすることも、サーバーからのIPをブロックすることもできます。たとえば、Amazonデータセンターから。

私が提供するIPのリストを使用しています: http://www.wizcrafts.net/

次のようなfail2banフィルターを使用できます。

 [定義] 
 failregex = ^。* POST /register.*
 ^。* PUT /register.*

および対応する構成ファイル:

 [register] 
 enabled = true 
 port = http、https 
 filter = wp-login 
 action = iptables-multiport [name = wp -login、port = "http、https"、protocol = tcp] 
 logpath = /var/log/.../*access.log
bantime = 36000 
 findtime = 172800 
 maxretry = 4 
1
Nicolas