クライアントのウェブサイトは現在攻撃を受けており、私はそれを修正するために呼び出されました。
膨大な数の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"
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のルールを自動的に作成するので、慌てないでください。
Fail2banの当面の問題を解決したようで、iptablesレベルでブロックすることは理にかなっていますが、HAProxy構成でまったく同じことを行うことができます。src_http_req_rate()またはでaclを使用できます。 src_http_err_rate(Abuse)でさえ:私はそれらをいくつかの例で使用しました ここではDDOS緩和のためのhaproxy設定 。
長期的には、そのページにダブルログインを実装することをお勧めします。ユーザーがそれを受け入れる場合は、ログインページから追加のhtaccessパスワードを入力するだけで、ログインを分離する必要があります(かなり難しい)スクリプトでクラックする)。または、mod_securityを使用して、同じことまたは何らかの ハニートラップ を実行することもできます。