WebサーバーレベルのDDoS保護

DDoS攻撃の統計は 、ネットワークレベルからアプリケーションレベルへのベクトルの一定の成長と変位を示しています。



画像



サーバー上に最小限の特性を持つ小さなサイトがある場合は、ストレステストの完全に合法的な手段でサイトを配置できます。 (IPアドレスの計算が簡単で、実験者が損害を回復するために飛ぶことができるため、これは誰にもお勧めしません。)したがって、DDoS保護のないサイトは、ウイルス対策のないWindows-98を搭載したコンピューターのようにすぐにワイルドに見えます。



サイトを保護するために最初にできることは、iptablesファイアウォールを構成することです。 私は、DDoS攻撃に対する保護のプロバイダーの1つのサイトの記事の iptables設定をほとんど変更せずに使用しています。 変更したのは、ルール#8および#10で許可される接続の数を増やすことだけでした。



iptablesパラメーターを変更するスクリプトを実行する前に、これらのパラメーターを初期状態にリセットする代替方法があることを確認する必要があります。 なぜなら ルールが正しく設定されていない場合、管理者を含む誰もサーバーに接続できません。



iptablesファイアウォールは、ネットワークレベルで攻撃を制御します。 次に設定するのはWebサーバーです。 nginxは、インターネットからのアクセスに対して開かれているWebサーバーと見なします。 nginx.confファイルでは、ファイルの数と開いている接続の制限を増やす必要があります(例はウィキペディアから取得されます)。



#      worker_rlimit_nofile 80000; events { #     worker_connections 65536; #    epoll    ... }
      
      





次に、デフォルトサーバーを構成します。これにより、ドメイン名ではなくIPアドレスでアクセスするデバイス(IoTなど)のアクセスがブロックされます。



 # Default server configuration # server { listen 80 default_server; listen 443 ssl default_server; deny all; }
      
      





また、nginxでは、ヒット数にいくつかの制限を設定できますが、そのような設定はあまり柔軟性がなく、選択的でもありません。 私たちの目標は、サイバー犯罪者の要求を消滅させるためにWebサーバーレベルでそのような保護を提供することですが、立派なユーザーからサーバーへの要求を許可することです。



Habréで既に利用可能な素材を再評価しないために、指定された記事kyprizel / testcookie-nginx-moduleの著者のモジュールだけでなく、優れた記事にも精通することをお勧めします。 このモジュールを作成できるのはすでに良いことです。 ただし、アップグレードする必要がある場合は、簡単に実行できません。



今日、多くのDDoS保護サービスプロバイダーはopenrestyサーバー(Taobaoのnginx + Luaバンドル)を使用しています。 優れたLuaコードの実行速度は優れたCコードの実行速度よりわずかに劣りますが、Luaでの開発はより高速で簡単であり、さらに、サーバーを再コンパイルせずにスクリプトを変更できます。 次回の再起動時に、LuaJITによってコンパイルされ、コンパイルされます。それだけで十分です。



optnrestyのインストール方法に関する詳細な説明 。 インストール後、nginxの構成を続けます。 httpセクションでは、Luaスクリプトが機能するために必要なパラメーターを決定します。



 lua_shared_dict whitelist 10m; lua_shared_dict banlist 100m; lua_package_path '/home/username/antiddos/?.lua;;'; init_by_lua ' local whitelist = ngx.shared.whitelist whitelist:add("1.2.3.4", true) whitelist:add("5.6.7.8", true) '; access_by_lua_file /home/username/antiddos/main.lua;
      
      





lua_shared_dict行は、新しい辞書(key-value)を作成します。 この辞書はすべてのリクエストで同じであるため、ホワイトリストとブラックリストを保存すると便利です。 この辞書には、キー値パラメーターに加えて、存続時間パラメーターを含めることができます。これは、一定期間内に要求の数を制限する必要がある場合に、カウンターの格納に最適です。



lua_package_path行は、Luaモジュールを検索するパスを設定します。Luaモジュールには、スクリプトを含むディレクトリを含める必要があります。 行の最後にある2つの連続したセミコロンは、このパスがパスの現在の値に追加され、完全に置き換えられないことを意味します。



init_by_lua行は、サーバーの起動時に1回実行されるコードを設定します(すべての新しいリクエストでは実行されません)。 IPアドレスのホワイトリストを設定します。 add関数の2番目のパラメーターであるtrueは、ifステートメントで使用される単なる値です。 3番目の存続時間パラメーターが欠落しているため、値は時間制限なしで保管されます。



access_by_lua_file行は、サーバーへの要求ごとに(サーバーの起動時だけでなく)実行されるスクリプトへのパスを設定します。 実際には、保護の論理全体です。



Luaスクリプトで実行できるいくつかのチェックを検討してください。



 -- if client IP is in whitelist, pass local whitelist = ngx.shared.whitelist in_whitelist = whitelist:get(ngx.var.remote_addr) if in_whitelist then return end -- HTTP headers local headers = ngx.req.get_headers(); -- wp ddos if type(headers["User-Agent"]) ~= "string" or headers["User-Agent"] == "" or ngx.re.find(headers["User-Agent"], "^WordPress", "ioj") then ngx.log(ngx.ERR, "ddos") ngx.exit(444) return end local banlist = ngx.shared.banlist local search_bot = "search:bot:count:request:per:10:s" if ngx.re.find(headers["User-Agent"], "Google Page Speed Insights|Googlebot|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator", "ioj") then local count, err = banlist:incr(search_bot, 1) if not count then banlist:set(search_bot, 1, 10) count = 1 end if count >= 50 then if count == 50 then ngx.log(ngx.ERR, "bot banned") end ngx.exit(444) return end return end
      
      





Lua言語は多くの点でJavaScriptに似ています(多すぎる)ので、LuaコードはJavaScriptを書く人にとって直感的です。



ngxグローバル変数は、nginxサーバーコンテキストとの通信に使用されます。 関数本体の外側のreturn



は、モジュールから戻ることを意味します。 この例では、IPアドレスがホワイトリストにある場合、スクリプトは終了し、nginx要求の通常の処理が続行されます。



次に、WordPress CMS実装の機能に基づいて攻撃が認識されます。 攻撃が検出された場合、作業は444(nginxの場合のみ通常)の特別なステータスで終了します: ngx.exit(444)







そして最後に、ボットを検索するための緑の道を提供します。 ここでは、カウンターを使用する必要があります。 攻撃者は多くの場合、検索ボットの下で偽造されます-したがって、ヒット数を考慮します。 banlist:set(search_bot, 1, 10)



、作成後10秒でゼロにリセットされるカウンターを初期化します。 banlist:incr(search_bot, 1)



は、現在のカウンター値に1を追加します。



ボットと侵入者のさらなる認識は、さまざまな方向で実行できます。 記事で提案されているようにこのような認識は、クライアントがリダイレクトをサポートしているかどうかのチェック、Cookieの設定、JavaScriptコードの実行に基づいています。 まあ、またはあなたが考えることができる他のすべて。



通常、このようなWebサーバーはプロキシとして使用され、保護されたWebサーバーは別のIPアドレスでホストされます。



便利なリンク



1.firstwiki.ru/index.php/%D0%9A%D1%80%D0%B0%D1%82%D0%BA%D0%BE%D0%B5_%D1%80%D1%83%D0%BA %D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_%D0%B1%D0%BE%D1 %80%D1%8C%D0%B1%D0%B5_%D1%81_DDOS-%D0%B0%D1%82%D0%B0%D0%BA%D0%B0%D0%BC%D0%B8_%D0% BD%D0%B0_http-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80



2. habrahabr.ru/post/139931



3. javapipe.com/ddos/blog/iptables-ddos-protection



4.github.com/apapacy/ngx_lua_anticc/tree/v-0.0.1



apapacy@gmail.com

2018年1月22日。



All Articles