HTTPフラッド方式を使用したDDoS攻撃などの現象が多く発生しています。 いいえ、これはnginxの設定に関する別のチュートリアルではありません。L7DDoS攻撃中にボットとバックエンド間のクイックフィルターとして機能し、ジャンクリクエストを除外できるモジュールを紹介します。
モジュール缶
- Set-Cookie HTTPヘッダーを使用して、標準的な方法でCookieを設定します。 Cookieを設定した後、応答コード301とLocationヘッダーを使用してユーザーをリダイレクトします(受信したCookieを受信するように強制する)
- Cookieを設定したら、応答コード200とHTMLメタタグ「更新」を使用してユーザーをリダイレクトします(受信したCookieを送信するよう強制します)
- Cookieの設定試行回数をカウントし、失敗した試行の最大回数を超えた後、指定されたURLにユーザーを送信します
- フィルタ応答用のカスタムテンプレートを使用します。このテンプレートでは何でもできます(たとえば、JavaScript経由でCookieを設定します)
- JavaScriptの実行を目的とした回答の自動解析を防ぐには、対称暗号化アルゴリズムを使用してテンプレート内の変数の値を暗号化し、クライアント側でJavaScriptをさらに復号化します( SlowAESを使用)
- ホワイトリスト設定ネットワーク(たとえば、検索ロボットが住んでいるネットワーク)
- DoS攻撃中に役立ついくつかの小さな断片。
できません
- モジュールは指定された回答のみをクライアントに返します。自分でクライアントをブロックすることを決定する必要があります(たとえば、fail2banを使用)
- 誰かが「私はJavaScriptをエミュレートしています」と言うでしょうが、現実的にしましょう-DoSはしばしば完全なエミュレーションでボットを使用しますか?
それらを私に送ってください、私たちはビットコインを採掘します - キャプチャとフラッシュに関するドキュメントには何もありません-必要に応じて、自分でそれらをねじ込むことができます。設定するときに想像力を示す必要があります
- このモジュールは万能薬ではありません-一連の保護対策のほんの小さなコンポーネントであり、正しく使用すれば役立つツールです。
仕組み
ほとんどの場合、HTTPフラッドを実装するボットはかなり馬鹿げており、HTTP Cookieとリダイレクトメカニズムがありません。 より高度なものに出くわすこともあります-これらはCookieを使用してリダイレクトを処理できますが、DoSボットが本格的なJavaScriptエンジンを搭載することはほとんどありません。
フィルターがどのように機能するかを理解するために、攻撃シナリオに応じたクライアントサーバー通信のフローを以下に示します。
- ボットはリダイレクトとCookieを理解しません
- ボットはリダイレクトとCookieを理解しますが、JavaScriptを知りません
基本的な攻撃シナリオの構成例
- ボットはリダイレクトとCookieを理解しません(典型的なケース)
server { listen 80; server_name domain.com; testcookie off; testcookie_name BPC; testcookie_secret keepmescret; testcookie_session $remote_addr; testcookie_arg attempt; testcookie_max_attempts 3; testcookie_fallback /cookies.html?backurl=http://$host$request_uri; testcookie_get_only on; location = /cookies.html { root /var/www/public_html; } location / { testcookie on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8080; } }
- ボットはリダイレクトとCookieを理解する
server { listen 80; server_name domain.com; testcookie off; testcookie_name BPC; testcookie_secret keepmescret; testcookie_session $remote_addr; testcookie_arg attempt; testcookie_max_attempts 3; testcookie_fallback /cookies.html?backurl=http://$host$request_uri; testcookie_get_only on; testcookie_redirect_via_refresh on; testcookie_refresh_template '<html><body><script>document.cookie="BPC=$testcookie_set";document.location.href="$testcookie_nexturl";</script></body></html>'; location = /cookies.html { root /var/www/public_html; } location / { testcookie on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8080; } }
- 人気サイトのiframeに挿入された保護されたURL
server { listen 80; server_name domain.com; testcookie off; testcookie_name BPC; testcookie_secret keepmescret; testcookie_session $remote_addr; testcookie_arg attempt; testcookie_max_attempts 3; testcookie_fallback /cookies.html?backurl=http://$host$request_uri; testcookie_get_only on; testcookie_redirect_via_refresh on; testcookie_refresh_template '<html><body><script>function bla() { document.cookie="BPC=$testcookie_set";document.location.href="$testcookie_nexturl";}</script><input type="submit" value="click me" onclick="bla();"></body></html>'; location = /cookies.html { root /var/www/public_html; } location / { testcookie on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8080; } }
- ボットは正規表現でクッキーを取得する方法を学びました
server { listen 80; server_name domain.com; testcookie off; testcookie_name BPC; testcookie_secret keepmescret; testcookie_session $remote_addr; testcookie_arg attempt; testcookie_max_attempts 3; testcookie_fallback /cookies.html?backurl=http://$host$request_uri; testcookie_get_only on; testcookie_redirect_via_refresh on; testcookie_refresh_encrypt_cookie on; testcookie_refresh_encrypt_cookie_key random; testcookie_refresh_encrypt_cookie_iv random; testcookie_refresh_template '<html><body>setting cookie...<script type=\"text/javascript\" src=\"/aes.min.js\" ></script><script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("$testcookie_enc_key"),b=toNumbers("$testcookie_enc_iv"),c=toNumbers("$testcookie_enc_set");document.cookie="BPC="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/";document.location.href="$testcookie_nexturl";</script></body></html>'; location = /aes.min.js { gzip on; gzip_min_length 1000; gzip_types text/plain; root /var/www/public_html; } location = /cookies.html { root /var/www/public_html; } location / { testcookie on; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://127.0.0.1:8080; } }
- ボットは正規表現を介してパラメーターを取得し、Cookieの値を解読することを学びました(誰かが気にすることはないでしょう)
server { listen 80; server_name domain.com; testcookie off; testcookie_name BPC; testcookie_secret keepmescret; testcookie_session $remote_addr; testcookie_arg attempt; testcookie_max_attempts 3; testcookie_fallback /cookies.html?backurl=http://$host$request_uri; testcookie_get_only on; testcookie_redirect_via_refresh on; testcookie_refresh_encrypt_cookie on; testcookie_refresh_encrypt_cookie_key deadbeefdeadbeefdeadbeefdeadbeef;
ソースコード
インストール手順とドキュメントを含むモジュールは、BSDライセンスの下で
githubで入手できます。
パッチ、アドオン、テスト、バグレポートを歓迎します。