Kubernetes Envoy Gateway

Next-Gen WAF エージェントは、拡張可能な外部処理サービスとして Envoy Gateway と統合します。これにより、ゲートウェイのリクエストおよびレスポンス処理パイプライン内でリアルタイムのトラフィック検査とセキュリティの保護が可能になります。

前提条件

ワークスペース用のエージェントキーをコピーしてください。デプロイの設定を行う際に必要になります。

Next-Gen WAF Service 拡張機能の仕組み

Envoy Gateway API は Gateway API 拡張機能のセットを使用しており、これにより Envoy プロキシを利用できます。EnvoyExtensionPolicy という CRD を使って外部処理を設定することができます。

GRPC 外部処理サービス

このセクションでは、Envoy Gateway のサンプルアプリ向けに Next-Gen WAF エージェントをデプロイします。

  1. Envoy Gateway の前提条件に関する手順に従って、Gateway API CRD、Envoy Gateway、およびサンプルアプリをインストールしてください。

  2. 外部処理サービスとして使用される Next-Gen WAF エージェント用の Kubernetes デプロイを作成します。

    注 : readinessProbe と SIGSCI_ENVOY_GRPC_ADDRESS のポートは一致している必要があります。

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: ngwaf-agent
    spec:
    replicas: 2
    selector:
    matchLabels:
    app: ngwaf-agent
    template:
    metadata:
    labels:
    app: ngwaf-agent
    spec:
    containers:
    - name: ngwaf-agent-container
    image: signalsciences/sigsci-agent:latest
    imagePullPolicy: Never
    ports:
    - containerPort: 9999
    env:
    - name: SIGSCI_ACCESSKEYID
    valueFrom:
    secretKeyRef:
    name: ngwaf-agent-keys
    key: your-access-key-id
    - name: SIGSCI_SECRETACCESSKEY
    valueFrom:
    secretKeyRef:
    name: ngwaf-agent-keys
    key: your-secret-access-key
    - name: SIGSCI_ENVOY_EXTPROC_ENABLED
    value: "true"
    - name: SIGSCI_ENVOY_GRPC_ADDRESS
    value: "0.0.0.0:9999"
    - name: SIGSCI_SERVER_FLAVOR
    value: "envoy-gateway"
    readinessProbe:
    grpc:
    port: 9999
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: ngwaf-agent
    spec:
    selector:
    app: ngwaf-agent
    ports:
    - protocol: TCP
    port: 9999
    targetPort: 9999
  3. エージェントのシークレット認証情報を作成します。

    kubectl create secret generic ngwaf-agent-keys \
    --from-literal=your-access-key-id=YOUR_ACCESS_KEY_ID \
    --from-literal=your-secret-access-key=YOUR_SECRET_ACCESS_KEY
  4. /mywaf パス上のトラフィックをバックエンドサービスにルーティングするための新しい HTTPRoute リソースを作成します。さらに、Next-Gen WAF エージェントが検査するデータ量を制限するために、リクエストバッファ制限を設定します。

    ---
    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: BackendTrafficPolicy
    metadata:
    name: request-buffer-limit
    spec:
    targetRefs:
    - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: mywaf
    requestBuffer: # Maximum request body buffered and sent to the ngwaf-agent
    limit: 1Mi # Supports SI units (e.g., 4Ki, 1Mi)
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
    name: mywaf
    spec:
    parentRefs:
    - name: eg
    hostnames:
    - "www.example.com"
    rules:
    - matches:
    - path:
    type: PathPrefix
    value: /mywaf
    backendRefs:
    - name: backend
    port: 3000
  5. 外部処理サービスを設定するために、新しい EnvoyExtensionPolicy リソースを作成します。この EnvoyExtensionPolicy は、前のステップで作成された HTTPRoute mywaf を対象としています。処理のために、ポート 9999 で GRPC 外部処理サービス ngwaf-agent を呼び出します。

    注: processingMode構造体は、外部プロセッサに送信する内容を定義するために使用されます。リクエストに関しては、Next-Gen WAF エージェントはバッファリングされたメッセージボディのみをサポートします。このモードでは、メッセージ本文をメモリにバッファリングし、本文全体を一度に送信します。

    ボディが設定済みバッファ制限を超えると、制限を超えるリクエストは HTTP「413 Payload Too Large」で失敗します。

    ---
    apiVersion: gateway.envoyproxy.io/v1alpha1
    kind: EnvoyExtensionPolicy
    metadata:
    name: ngwaf-agent-policy
    spec:
    targetRefs:
    - group: gateway.networking.k8s.io
    kind: HTTPRoute
    name: mywaf
    extProc:
    - backendRefs:
    - name: ngwaf-agent
    port: 9999
    processingMode:
    request:
    body: Buffered
    attributes:
    - connection.tls_version
    - request.host
    - request.path
    - request.scheme
    - source.address
    response: {}
    failOpen: true
    messageTimeout: 250ms
  6. 作成した HTTPRoute を介してバックエンドサービスにリクエストを送信し、設定をテストします。以下はリクエストとレスポンスのサンプルです。

    ngwaf-agent がリクエストにシグナルを追加したことが確認できるはずです。

    curl -v -H "Host: www.example.com" -H "Content-Type: text/plain" "http://${GATEWAY_HOST}/mywaf?cmd.exe=../../../etc/passwd" -d "{\"payload\": \"traversal\"}"
    * Trying 172.19.0.3:80...
    * Connected to 172.19.0.3 (172.19.0.3) port 80
    > POST /mywaf?cmd.exe=../../../etc/passwd HTTP/1.1
    > Host: www.example.com
    > User-Agent: curl/8.5.0
    > Accept: */*
    > Content-Type: text/plain
    > Content-Length: 24
    >
    < HTTP/1.1 200 OK
    < content-type: application/json
    < x-content-type-options: nosniff
    < date: Thu, 14 May 2026 06:14:35 GMT
    < content-length: 632
    < x-sigsci-tags: TRAVERSAL,SUSPECTED-BAD-BOT
    < x-sigsci-request-id: 6a05684b826b7576ad8e98ab
    <
    {
    "path": "/mywaf?cmd.exe=../../../etc/passwd",
    "host": "www.example.com",
    "method": "POST",
    "proto": "HTTP/1.1",
    "headers": {
    "Accept": "*/*",
    "Content-Length": "24",
    "Content-Type": "text/plain",
    "Host": "www.example.com",
    "User-Agent": "curl/8.5.0",
    "X-Sigsci-Request-Id": "6a05684deadbeef76ad8e98ab",
    "X-Sigsci-Tags": "TRAVERSAL,SUSPECTED-BAD-BOT"
    },
    "body": "{\"payload\": \"traversal\"}",
    "clientIP": "172.19.0.1",
    "timestamp": "2026-05-14T06:14:35Z"
    }

デバッグログ記録

トラブルシューティングのために、詳細なログ記録を有効にしてください。

  1. 以下の環境変数を追加してください。

    env:
    - name: SIGSCI_DEBUG_LOG_VERBOSITY
    value: "3" # Enables ext_proc debug logs
  2. 処理の詳細についてはエージェントのログを確認してください。

    kubectl logs -l app=ngwaf-agent -f