F5のような連続アクセスによる負荷をかけるDoSに対してWEBサーバにはRate Limitingのモジュールが用意されています。このモジュールは悪戯目的の単純なものであれば、同一IPのアクセス数からバーストさせることにより十分凌ぐことが出来ます。
予め何も対策しておかなかった場合は、DoS攻撃中はSSH等のリモート接続も出来なくなるのでどうしようもなくなります。そんなわけで今回はNginxで出来るDoS対策のご紹介。
DoSの小規模レベル対策
- サーバ側の対策
FW, IPS/IDS, DoS対策モジュールの導入, カーネルチューニング(SYN flood….etc), Rate Limiting - クラウド側のFWでの遮断
遮断後にログからサーバ側でのフィルタリング - 物理のスイッチでの遮断
遮断後にログからサーバ側でのフィルタリング - CDN導入
- クラウド型WAF
- DDoS対応のクラウドを使う
AWS・・・UDP関連のDNSはALBを導入することで対応可能。HTTPのDDoSははサーバを並べることで解決できる。またはAWS WAFやShieldの有料プランを利用する。
IBM Bluemixなど・・・DDoS検知でPublicIPでの公開が遮断されるものの、プライベートネットワークで設定操作可能 - 海外IPからのアクセスを弾く
GeoIP, ipsetなどで海外IPを弾き、国内IPのみ許可する。
国内IPで犯罪行為する人は少ないので、認証系など特定ポートにこのフィルターをかけておくと固定IPでなくてもだいぶセキュアになりますよ!
WEBサーバ NginxでのRate Limiting対応
今回はサーバ側の対策としてNginxのRate Limitingである、ngx_http_limit_req_moduleを使ってみます。
公式サンプル
123456789101112 http {limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;...server {...location /search/ {limit_req zone=one burst=5;}
@see Module ngx_http_limit_req_module
上記のサンプルでは同一IPからの秒間1回のリクエスト対して503エラーを返します。但し、locationディレクティブのほうを見ると5回までのバーストを許す設定です。
設定サンプル
1 2 3 4 5 6 |
http { (略) limit_req_zone $binary_remote_addr zone=limit_zone:10m rate=50r/s; limit_req zone=limit_zone burst=30 nodelay; (略) } |
また、nodelayオプションをかけることでburstまでそのまま通過させてくれます。
実際のところ、ブログ系でキャッシュを効かせていい環境ならF5程度は大丈夫…(۶•̀ᴗ•́)۶セイッ
お疲れ様です。