すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:Coraza Wasm プラグインを使用して ASM イングレスゲートウェイで WAF を有効にする

最終更新日:Mar 12, 2026

VirtualService ルーティングルールと AuthorizationPolicy アクセス制御は、SQL インジェクション、クロスサイトスクリプティング (XSS)、その他の OWASP Top 10 攻撃などのアプリケーション層の脅威をカバーしません。Coraza WebAssembly (Wasm) プラグインは、Web Application Firewall (WAF) をゲートウェイの Envoy プロセス内に直接追加することで、この問題を解決します。すべてのインバウンドリクエストは検査され、悪意のあるトラフィックはサービスに到達する前にブロックされます。外部サイドカーや追加のネットワークホップは必要ありません。

Coraza は、ModSecurity SecRule 構文を使用するオープンソースの OWASP がメンテナンスする WAF エンジンです。これをデプロイするには、Coraza Wasm バイナリを OCI イメージとしてパッケージ化し、コンテナレジストリにプッシュします。次に、WasmPlugin リソースを適用して、Envoy フィルターチェーンにロードします。

仕組み

  1. Coraza Wasm バイナリを OCI イメージとしてパッケージ化し、コンテナレジストリにプッシュします。

  2. ASM ゲートウェイがイメージをプルできるように、Kubernetes Secret を作成します。

  3. プラグインをゲートウェイの Envoy フィルターチェーンにロードし、SecRule ディレクティブを構成する WasmPlugin リソースを適用します。

  4. ゲートウェイは、構成されたルールに対してすべてのインバウンドリクエストを評価し、拒否ルールに一致するリクエストに対して 403 Forbidden を返します。

前提条件

開始する前に、次のことを確認してください。

Wasm プラグインのロード方法

ASM は、Wasm プラグインをロードする 3 つの方法をサポートしています。このチュートリアルでは、OCI イメージ方式を使用します。

方式

仕組み

使用する状況

OCI イメージ (このチュートリアルで使用)

.wasm バイナリを OCI イメージとしてパッケージ化し、コンテナレジストリにプッシュします。ゲートウェイはイメージリポジトリからイメージをプルします。

ほとんどの本番環境へのデプロイメントに推奨されます。バージョン管理され、監査可能で、既存のレジストリインフラストラクチャで動作します。

ConfigMap

.wasm バイナリを Kubernetes ConfigMap に保存し、ゲートウェイ Pod にマウントします。ゲートウェイはローカルファイルシステムからファイルをロードします。

迅速なプロトタイピングや、レジストリが利用できないエアギャップ環境に適しています。ConfigMap の 1 MiB サイズ制限があります。

HTTP ダウンロード

.wasm バイナリをクラウドストレージまたは HTTP アクセス可能なエンドポイントでホストします。ゲートウェイはネットワーク経由でダウンロードします。

一元化されたアーティファクトサーバーがすでに HTTP 経由でバイナリを提供している環境に適しています。

ステップ 1: Coraza Wasm OCI イメージのビルドとプッシュ

プラグインバイナリのダウンロードと準備

  1. Coraza Wasm プラグインをダウンロードして解凍します。

       wget https://github.com/corazawaf/coraza-proxy-wasm/releases/download/0.3.0/coraza-proxy-wasm-0.3.0.zip
       unzip coraza-proxy-wasm-0.3.0.zip
  2. バイナリの名前を plugin.wasm に変更します。ASM はこの正確なファイル名を要求します。

       mv coraza-proxy-wasm.wasm plugin.wasm
  3. 同じディレクトリに Dockerfile を作成します。

       FROM scratch
       ADD ./plugin.wasm ./plugin.wasm
  4. OCI イメージをビルドします。

       docker build -t coraza-proxy-wasm:latest .

イメージを Container Registry にプッシュ

  1. Container Registry に名前空間を作成します。

    1. Container Registry コンソールにログインします。左側のナビゲーションウィンドウで、[インスタンス] をクリックします。

    2. [インスタンス] ページで、お使いの Container Registry Enterprise Edition インスタンスのカードをクリックします。

    3. 左側のナビゲーションウィンドウで、[リポジトリ] > [ネームスペース] を選択します。 [ネームスペースの作成] をクリックし、[ネームスペース]wasm を設定して、[OK] をクリックします。

  2. レジストリのインターネットアクセスを有効化するには:左側のナビゲーションウィンドウで、[リポジトリ] > [アクセス制御] を選択します。[インターネット] タブをクリックし、「[インターネット経由のアクセスを有効化]」をオンにして、要件に応じてインターネットホワイトリストを追加します。ホワイトリストによる制御を必要としない場合は、デフォルトのホワイトリストを削除します。

    説明

    この例ではパブリックエンドポイントを使用します。本番環境での使用には、セキュリティとネットワークパフォーマンスを向上させるために Virtual Private Cloud (VPC) アクセスを構成してください。詳細については、「VPC ACL の構成」をご参照ください。

  3. レジストリにログインします。プロンプトが表示されたらパスワードを入力します。次のプレースホルダーをご利用の値に置き換えます。

    プレースホルダー

    説明

    <your-username>

    Container Registry インスタンスのログインユーザー名

    admin@china

    <your-registry-endpoint>

    ご利用の Container Registry インスタンスのエンドポイント

    enterprise-registry.cn-hangzhou

       docker login --username=<your-username> <your-registry-endpoint>.cr.aliyuncs.com
  4. イメージのタグ付けとプッシュ。前のセクションの docker build によって返されたイメージ ID を <image-id> に置き換えます。

       docker tag <image-id> <your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
       docker push <your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
  5. イメージがプッシュされたことを確認します。latest タグの付いたイメージが表示された場合、プッシュは成功しています。

    1. Container Registry コンソール」で、Enterprise Edition インスタンスを開きます。

    2. 左側のナビゲーションウィンドウで、[リポジトリ] > [リポジトリ] を選択します。[coraza-proxy-wasm] をクリックします。

    3. 左側のナビゲーションウィンドウで、[タグ] をクリックします。

ステップ 2: イメージプル用の Secret の作成

リポジトリは非公開であるため、ASM ゲートウェイが Wasm イメージをプルするには認証情報が必要です。レジストリ認証情報を含む Kubernetes Secret を作成します。

kubectl create secret docker-registry coraza-wasm-proxy \
  -n istio-system \
  --docker-server=<your-registry-endpoint>.cr.aliyuncs.com \
  --docker-username=<your-username> \
  --docker-password=<your-password>
重要

Secret は WasmPlugin リソースと同じ名前空間にある必要があります。このチュートリアルでは istio-system を使用します。プラグインが異なる名前空間をターゲットにする場合は、-n の値を調整してください。

Secret を検証します。

kubectl -n istio-system get secret coraza-wasm-proxy

ステップ 3: WasmPlugin リソースの適用

WasmPlugin リソースは、ロードするプラグイン、Envoy フィルターチェーンに挿入する場所、および構成方法を宣言します。

  1. 次の内容で wasm-plugin.yaml という名前のファイルを作成します。次の表は主要フィールドを説明しています。この例では、default ディレクティブセットは Coraza ルールエンジンを有効にし、単一のルールを定義します。x-user-type ヘッダーが baned と等しいすべてのリクエストを拒否します。

    フィールド

    説明

    spec.url

    タグを含む OCI イメージアドレス。oci://file://、および http[s]:// スキームをサポートします。

    spec.imagePullSecret

    レジストリ認証情報を含む Kubernetes Secret の名前。

    spec.imagePullPolicy

    イメージプルポリシー。

    spec.selector

    このプラグインをロードするワークロードを決定するラベルセレクター。ここではイングレスゲートウェイをターゲットにします。

    spec.phase

    フィルターチェーンにプラグインを挿入する場所。AUTHN は認証フィルターの前に配置するため、リクエストは可能な限り早く検査されます。

    spec.pluginConfig

    Coraza 固有の構成。directives_map は SecRule 構文を使用して名前付きルールセットを定義します。default_directives は、デフォルトで適用するルールセットを指定します。

       apiVersion: extensions.istio.io/v1alpha1
       kind: WasmPlugin
       metadata:
         name: coraza-proxy-wasm
         namespace: istio-system
       spec:
         imagePullPolicy: IfNotPresent
         imagePullSecret: coraza-wasm-proxy
         selector:
           matchLabels:
             istio: ingressgateway
         url: oci://<your-registry-endpoint>.cr.aliyuncs.com/wasm/coraza-proxy-wasm:latest
         phase: AUTHN
         pluginConfig:
           directives_map:
             default:
               - "SecDebugLogLevel 9"
               - "SecRuleEngine On"
               - "SecRule REQUEST_HEADERS:x-user-type \"@streq baned\" \"id:101,phase:1,t:lowercase,deny,msg:'denied by header'\""
           default_directives: default
  2. kubectl で ASM インスタンスに接続し、リソースを適用します。

       kubectl apply -f wasm-plugin.yaml

ステップ 4: WAF プラグインの検証

プラグインが機能していることを確認するために、許可されたリクエストとブロックされたリクエストの両方をテストします。

  1. イングレスゲートウェイ経由で HTTPBin アプリケーションに通常のリクエストを送信します。<gateway-ip> をご利用のイングレスゲートウェイの IP アドレスに置き換えます。詳細については、「イングレスゲートウェイの IP アドレスの取得」をご参照ください。期待される結果: ゲートウェイは 200 OK を返します。

       curl -v http://<gateway-ip>/
       > GET / HTTP/1.1
       > Host: <gateway-ip>
       ...
       < HTTP/1.1 200 OK
       < server: istio-envoy
       ...
  2. ブロックされたヘッダーを含むリクエストを送信します。期待される結果: ゲートウェイは 403 Forbidden を返します。403 応答は、Coraza WAF プラグインがアクティブであり、構成されたルールを適用していることを確認します。

       curl -v -H 'x-user-type: baned' http://<gateway-ip>/
       > GET / HTTP/1.1
       > Host: <gateway-ip>
       > x-user-type: baned
       ...
       < HTTP/1.1 403 Forbidden
       < server: istio-envoy
       ...