DOS 攻撃対策の
実装を
Dropwizard を
Dropwizard は
参考サイト
Apache DoS攻撃に
そなえる | Developers.IO
HTTP サーバ側での対策 サーバが 死んでいたり、
縮退運転? などを考えると、 どちらの 層でも、 実施した ほうが いいように 思います。 Denial of Service Filter
Jetty のDenial of Service Filter の ページ
MyWebApplication.java
Jersey はorg.eclipse.jetty.servlets.DoSFilter
が
以下、
正しく
package mypackage; import io.dropwizard.Application; import io.dropwizard.assets.AssetsBundle; import io.dropwizard.jetty.MutableServletContextHandler; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import org.eclipse.jetty.servlet.ErrorPageErrorHandler; import org.eclipse.jetty.servlet.FilterHolder; import org.eclipse.jetty.servlets.DoSFilter; import mypackage.MyConfiguration import javax.servlet.DispatcherType; import java.util.EnumSet; /** * MyWebApplication * * @author Kem */ public class MyWebApplication extends Application<MyConfiguration> { public static void main(String[] args) throws Exception { new Festivals4PartyPeopleApp().run(args); } @Override public String getName() { return "MyWebApplication"; } @Override public void initialize(Bootstrap<MyConfiguration> bootstrap) { // Do Nothing.... } @Override public void run(MyConfiguration t, Environment e) throws Exception { MutableServletContextHandler context = e.getApplicationContext(); // DOS Attack 対策 Filterの定義 FilterHolder doSFilterHolder = new FilterHolder(new DoSFilter()); doSFilterHolder.setName("DoSFilter"); doSFilterHolder.setInitParameter("maxRequestsPerSec", "3"); doSFilterHolder.setInitParameter("delayMs", "-1"); context.addFilter(doSFilterHolder, "/*", EnumSet.of(DispatcherType.REQUEST)); // 429 ページの設定 ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler(); errorHandler.addErrorPage(429, "/429"); context.setErrorHandler(errorHandler); } }
- 説明
- MutableServletContextHandler に
対して、 DoSFilter を addFilter します。 maxRequestsPerSec
でDos アタックとみなす1秒間の リクエスト数を 定義します。 3 [3] 感覚的には 厳しめの 3
を設定。 context.addFilter(doSFilterHolder, "/*", EnumSet.of(DispatcherType.REQUEST));
で、REQUEST
をdispatcher
に設定しています。 4 [4] servlet 2.4 から、 デフォルト REQUEST - delayMs を
-1 に すると、 HTTP エラーコード 429 TOO MANY REQUESTS が 飛びます。 - 429 の
エラー時の URLを 設定しています。
- MutableServletContextHandler に
確認
以下、
while true; do (sleep 2; curl http://127.0.0.1:18080)& done | grep '429 Too Many Requests'
以上です。
コメント