日本語

Java(Spring MVC)

Zen Firewall by Aikido は、一般的な攻撃や安全でない動作を実行時にブロックすることでアプリケーションの保護に役立ちます。制御はアプリや環境ごとに調整できます。以下のガイドを参考にインストールとセットアップを行ってください。

https://github.com/AikidoSec/firewall-java

要件

インストールと設定

  1. Zen Firewall by Aikidoをインストールする

    最新のJavaエージェントバンドルをダウンロードして展開します:

    curl -L https://github.com/AikidoSec/firewall-java/releases/latest/download/zen.zip -o zen.zip
    unzip zen.zip

    展開したフォルダ構造(例:/opt/zen)はそのまま維持し、プロセスがそのフォルダを読み書きできることを確認してください。

    ランタイムにJavaエージェントを追加します:

    -javaagent:/opt/zen/agent.jar

    レート制限およびユーザーブロック機能を使用するには、プロジェクトに agent_api.jar を追加します。

    Gradle:

    dependencies {
        implementation files('/opt/zen/agent_api.jar')
    }

    Maven:

    <dependency>
      <groupId>dev.aikido</groupId>
      <artifactId>agent_api</artifactId>
      <version>1.0</version>
      <systemPath>/opt/zen/agent_api.jar</systemPath>
    </dependency>
  2. リクエストブロックとユーザー識別を有効にする

    このミドルウェアを使用すると、レート制限、ユーザー識別、ブロック機能を有効にできます。

    Zen Firewall が攻撃をブロックするために、このミドルウェアは必須ではありません。中核となる攻撃防御機能はミドルウェアなしでも動作します。このミドルウェアは追加のリクエストコンテキストを提供し、Zen はそれを レート制限、ユーザーブロック、ボットブロック、国別ブロック、脅威アクターのブロックなどの保護機能に使用します。

    アプリケーションでのユーザーの識別方法やリクエストの処理方法に合わせて、サンプルを調整してください。

    @Component
    @Order(2)
    public class RateLimitingFilter implements Filter {
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            ShouldBlockRequest.ShouldBlockRequestResult result = ShouldBlockRequest.shouldBlockRequest();
    
            if (result.block()) {
                if (result.data().type().equals("ratelimited")) {
                    String message = "You are rate limited by Zen.";
                   if (result.data().trigger().equals("ip")) {
                       message = message + " (Your IP: " + result.data().ip() + ")";
                   }
                   HttpServletResponse httpResponse = (HttpServletResponse) response;
                   httpResponse.setStatus(429);
                   httpResponse.getWriter().write(message);
                   return;
               }
               if (result.data().type().equals("blocked")) {
                   HttpServletResponse httpResponse = (HttpServletResponse) response;
                   httpResponse.setStatus(403);
                   httpResponse.getWriter().write("You are blocked by Zen.");
                   return;
               }
           }
           chain.doFilter(request, response);
       }
    }

    より前段のフィルターでユーザーを設定します:

    import dev.aikido.agent_api.SetUser;
    
    @Component
    @Order(0)
    public class SetUserFilter implements Filter {
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
               throws IOException, ServletException {
           SetUser.setUser(new SetUser.UserObject("123", "John Doe"));
           chain.doFilter(request, response);
       }
    }
  3. Zen Firewallをドライ/検出専用モードで起動する

    Zenを有効にし、ドライモードでアプリを起動します:

    AIKIDO_TOKEN=AIK_RUNTIME_... AIKIDO_BLOCK=false java -javaagent:/opt/zen/agent.jar -jar build/myapp.jar

    Aikido Zen エージェントがトークンを読み取れるように、トークンを環境変数として設定してください。まだトークンをお持ちでない場合は、こちらの手順に従ってください。

    AIKIDO_TOKEN=AIK_RUNTIME_

    リクエストをブロックせずにアプリが期待どおりに動作することを確認するため、まずはドライモードでアプリを起動することをお勧めします。誤検知を避けるため、Zen Firewall をステージング環境で2週間実行することをお勧めします。

    AIKIDO_BLOCK=false

    AIKIDO_DEBUG=true を使用するとデバッグモードが有効になり、エージェントの動作に関するより詳細な情報を確認できます。環境変数の詳細については、こちらをご覧ください: configuration-via-environment-variables.md

  4. アプリをテストする

    アプリケーションにアクセスし、いくつかの操作を行うか、いくつかのページを開いてください。Zen はアプリケーション内のルートを自動的に検出します。

    Zen は 10 分ごとに Aikido へデータを送信します

    Zen アプリケーションの以下のページを確認することで、エージェントが正常に動作していることを確認できます。

    • Events: 「Application started」イベントが表示されているはずです。
    • Routes: しばらくすると、アプリケーションのルートがメソッド、ルート、リクエストとともにここに表示され始めます。
    • Instances: Zen がインストールされているアプリケーションのアクティブなインスタンス数が表示されているはずです。
  5. ダッシュボードでレート制限を設定する

    Zen Firewall ミドルウェアを追加したら、ルートをブルートフォース攻撃から保護する機能をテストできます。これは、Aikido Dashboard でレート制限を設定することで行います:

    1. 作成したアプリをクリックします。
    2. Routes タブに移動します。
    3. 制限したいルートを見つけて、Setup rate limiting をクリックします。
    4. 手順に従ってレート制限を設定します(例:1 分あたり 5 リクエスト)。

    認証ルートと保護およびレート制限のオプションを表示している API ルート管理画面。

    POST /auth/login のレート制限を 1 分あたり 5 リクエストに設定。

    レート制限の確認

    アプリを起動し、レート制限を設定したルートに 1 分以内に 5 回アクセスしてみてください。5 回目の試行の後、レート制限エラーが返されるはずです:

    You are rate limited by Aikido firewall. (Your IP: 1.2.3.4)
  6. 次のステップ

    Zen Firewall のインストールが完了しました。問題が発生した場合や、ご不明な点、機能のご要望がある場合は、お気軽にサポートまでお問い合わせください。

    Zen Firewall が提供するさまざまな機能をぜひご覧ください:

    その他の情報: