web-dev-qa-db-ja.com

HAProxyでのIPのブロック

クライアントのウェブサイトは現在攻撃を受けており、私はそれを修正するために呼び出されました。

膨大な数のIP(簡単に5,000を超える)が常に/loginに到達しており、おそらくブルートフォース攻撃を試みています。

ページが500エラーを返すようにサイトを変更しましたが、あきらめていません。明らかに、これはrealユーザーにとっては良くありません。ユーザーは現在ログインできません。

負荷分散はHAProxyを介して行われます。これについては、ほとんど知識がありません(ただし、数時間前よりも多くの知識があります)。私はオンラインで見つけた多くの賢明なことを試しましたが、おそらく攻撃を実行するIPの非常に大きなブロックがあるため、どれも役に立たなかったようです。

次に、質問について:IPが/login[〜#〜] x [〜#〜][〜#〜] y [〜#〜]秒?

そして、サブポイント-拒否のログを確認して、実際に機能していることを確認するにはどうすればよいですか?

これがhaproxy.logのサンプルです:

Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.62.79:15290 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-03 751/0/202/38/991 500 220 - - ---- 428/428/120/38/0 0/0 "GET /login HTTP/1.1"
Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.63.132:47804 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-04 751/0/202/38/991 500 220 - - ---- 428/428/119/42/0 0/0 "GET /login HTTP/1.1"
Jun  3 14:24:50 hap-server haproxy[11831]: 46.161.62.43:53176 [03/Jun/2017:14:24:49.505] www-https-test~ www-backend/www-02 751/0/202/38/991 500 220 - - ---- 428/428/118/38/0 0/0 "GET /login HTTP/1.1"
1
Grim...

EEAAのコメントのおかげで、fail2banを使用してこれを解決することができました。

HAProxyでfail2banを使用する方法についてのドキュメントはほとんどありません-実際には、このページはすでに「haproxy fail2ban」のGoogle検索のトップに近づいているので、その方法を詳しく説明します。

まず、fail2banをインストールします。あなたがそのビットをすることができないならば、あなたはおそらくもう少し助けなしで続けるべきではありません。

fail2banは、アクセスログをスキャンして、設定したパターンを探します。そのパターンがY秒でX回検出されると、そのIPがZ秒間自動的に禁止されます。

HAProxyログは_/var/log/haproxy.log_にあるはずです。負荷が高い場合、VimまたはNanoで開くには大きすぎる可能性があるため、末尾を使用して最後の数行を確認してください:_tail -n50 /var/log/haproxy.log_

ログの「悪い」エントリのサンプルは次のようになりました。

_Jun  3 16:48:03 hap-server haproxy[21751]: 178.159.100.29:48806 [03/Jun/2017:16:48:03.735] www-https-test~ www-backend/www-04 172/0/2/3/177 200 339 - - ---- 36/36/0/0/0 0/0 "GET /login HTTP/1.1"
_

Fail2banに取得させたい重要なビットは、攻撃者のIPと攻撃者が攻撃しているページです。

Fail2banにこれを行う方法を伝えるには、最初にフィルターを作成します。フォルダー_/etc/fail2ban/filter.d_にファイルを作成します。私は_applogin.conf_と呼びましたが、_.conf_で終わっていれば、好きな名前を付けることができます。

内容は次のとおりです。

_[Definition]

failregex = ^.*haproxy\[[0-9]+\]: <Host>:.* "(GET |POST )/login HTTP/1.1"$
ignoreregex =
_

_<Host>_は、IPアドレスが表示されるログの行のポイントです。私と同じ正規表現を使用する場合は、_/login_を攻撃者がサーバー上で標的にしているアドレスに置き換えます。

次に、fail2banにそのフィルターを検索するように指示する必要があります。 _/etc/fail2ban/jail.conf_のコピーを作成し(めちゃくちゃにして、最初からやり直す必要がある場合)、次に_jail.conf_を開き、下部に次の行を追加します。

_[app-login]
enabled  = true
bantime  = 1200
findtime = 120
maxretry = 6
filter   = applogin
logpath  = /var/log/haproxy.log
port     = http,https
_

角括弧内の部分は単なる名前です-好きなものを使用してください。 bantimeは、ユーザーが禁止されている秒数です。 maxretryは、ユーザーがfindtime秒でページにアクセスできる回数です。したがって、私の例では、誰かが2分間に6回以上(または正確に6回、私にはわかりませんが)www.mydomain.com/loginにアクセスしようとすると、20分間禁止されます。 filterは、_/etc/fail2ban/filter.d_で作成したファイルの名前です(ただし、_.conf_は含まれません)。 logpathは、検索するログファイルへのパスです。

そのファイルを保存してから、fail2banを再起動します。_service fail2ban restart_ fail2banログファイルをテールします:_tail -f /var/log/fail2ban.log_そしてうまくいけば、1、2分後に次のようなものが表示されるようになります。

_2017-06-03 17:04:32,040 fail2ban.actions: WARNING [app-login] Ban 146.185.200.122
_

それでおしまい!あなたは悪者(とにかくその特定のページに到達しようとする者)から安全です。

注-fail2banログでいくつかのSSH禁止が行われていることも確認できます。インストール時にSSHのルールを自動的に作成するので、慌てないでください。

8
Grim...

Fail2banの当面の問題を解決したようで、iptablesレベルでブロックすることは理にかなっていますが、HAProxy構成でまったく同じことを行うことができます。src_http_req_rate()またはでaclを使用できます。 src_http_err_rate(Abuse)でさえ:私はそれらをいくつかの例で使用しました ここではDDOS緩和のためのhaproxy設定

長期的には、そのページにダブルログインを実装することをお勧めします。ユーザーがそれを受け入れる場合は、ログインページから追加のhtaccessパスワードを入力するだけで、ログインを分離する必要があります(かなり難しい)スクリプトでクラックする)。または、mod_securityを使用して、同じことまたは何らかの ハニートラップ を実行することもできます。

3