Google Cloud Service 拡張機能

Next-Gen WAF エージェントは、ユーザーが管理するコールアウト・バックエンド・サービスとして Google Cloud Service 拡張機能と統合され、Google Cloud Load Balancer のリクエスト処理パイプライン内でリアルタイムのトラフィック検査とセキュリティ保護を可能にします。

前提条件

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

  • Service Extensions API、Compute Engine API、ネットワークサービス API が有効になっている Google Cloud プロジェクト

  • Service Extensions とバックエンドサービスを作成するための適切なIAM権限

  • デプロイインフラストラクチャにおける HTTP/2 および gRPC のサポート

Fastly WAF Service 拡張機能統合の仕組み

Google Cloud Load Balancer により呼び出された Service Extensions は、リクエストライフサイクル全体を通じて Envoy の外部処理プロトコルを用い、gRPC を介して Next-Gen WAF エージェントと通信します。デプロイシナリオのサンプルをご確認ください。

加工段階説明
REQUEST_HEADERSロードバランサーは、HTTP/HTTPS リクエストヘッダーを検査のために Next-Gen WAF エージェントに送信します。エージェントは、有効なルールしきい値設定に基づいてヘッダーを分析します。
REQUEST_BODYロードバランサーは、リクエスト本文のチャンクを Next-Gen WAF エージェントにストリーム送信します。エージェントはペイロードデータを検査し、悪意のあるリクエストをブロックしたり、疑わしいコンテンツにタグを付けたりすることができます。
RESPONSE_HEADERSロードバランサーは、さらなる分析のためにレスポンスヘッダーをNext-Gen WAFエージェントに送信します。

Next-Gen WAF エージェントのコールアウト・バックエンド・サービスを設定する

このセクションでは、ユーザーが管理するコールアウト・バックエンド・サービスの設定方法について説明します。

ロードバランサーとテストクライアントを準備する

  1. 拡張機能をサポートするアプリケーションロードバランサーを作成し、設定します。この例では、 VM インスタンスグループのバックエンドを持つリージョン内部アプリケーションロードバランサーを設定します。言及されたサンプル値を使用してください。

  2. テスト用のクライアントVMを作成します。

コールアウト・バックエンド・サービスを作成・設定する

  1. Next-Gen WAF エージェントを動かすコールアウト・バックエンド・サービス用の仮想マシン (VM) インスタンスを作成します。

    REGION=us-west2
    ZONE=us-west2-a
    gcloud compute instances create callouts-vm \
    --zone=$ZONE \
    --network=lb-network \
    --subnet=backend-subnet \
    --machine-type=e2-medium \
    --image-family=cos-stable \
    --image-project=cos-cloud \
    --tags=allow-ssh,load-balanced-backend \
    --metadata-from-file=startup-script=startup-script-tls.sh
  2. startup-script-tls.shという名前の起動スクリプトを作成します。以下の例はスクリプトの一般的な構造を示しています。プレースホルダーの値はご自身の設定に置き換えてください。

    重要: gRPC サーバーが TLS を使用するように設定されていることを確認してください。TLS を使用しない場合、拡張サーバーへの接続は失敗します。

    cat >startup-script-tls.sh <<EOF
    #!/bin/bash
    # Create certificate directory
    mkdir -p /etc/ssl/certs/sigsci
    # Generate self-signed certificates for the gRPC service
    openssl req -x509 -newkey rsa:4096 \
    -keyout /etc/ssl/certs/sigsci/key.pem \
    -out /etc/ssl/certs/sigsci/cert.pem \
    -days 365 -nodes \
    -subj "/C=US/ST=CA/L=SF/O=Fastly/CN=ext11.com"
    # Set proper permissions for the sigsci user inside the container
    chmod 644 /etc/ssl/certs/sigsci/key.pem
    chmod 644 /etc/ssl/certs/sigsci/cert.pem
    # Start Signal Sciences agent with TLS configuration
    docker run -d \
    --name sigsci-agent \
    --restart unless-stopped \
    -p 443:443 \
    -v /etc/ssl/certs/sigsci:/etc/ssl/certs/sigsci:ro \
    -e SIGSCI_ACCESSKEYID=<YOUR_ACCESS_KEY_ID> \
    -e SIGSCI_SECRETACCESSKEY=<YOUR_SECRET_ACCESS_KEY> \
    -e SIGSCI_SERVER_FLAVOR=GCP \
    -e SIGSCI_ENVOY_GRPC_ADDRESS=0.0.0.0:443 \
    -e SIGSCI_ENVOY_EXTPROC_ENABLED=true \
    -e SIGSCI_ENVOY_GRPC_CERT=/etc/ssl/certs/sigsci/cert.pem \
    -e SIGSCI_ENVOY_GRPC_KEY=/etc/ssl/certs/sigsci/key.pem \
    signalsciences/sigsci-agent:latest
    # Log startup completion
    echo "Signal Sciences agent with TLS started at $(date)" >> /var/log/startup.log
    EOF
  3. 管理されていないインスタンスグループに VM を追加し、コールアウト・バックエンド・サービスを作成し、以下のサンプルスクリプトで示すようにバックエンドを追加します。各コマンドの詳細な説明については、Google Cloudのドキュメントを参照してください。

REGION=us-west2
ZONE=us-west2-a
gcloud compute instances create callouts-vm \
--zone=$ZONE \
--network=lb-network \
--subnet=backend-subnet \
--machine-type=e2-medium \
--image-family=cos-stable \
--image-project=cos-cloud \
--tags=allow-ssh,load-balanced-backend \
--metadata-from-file=startup-script=startup-script-tls.sh
##### Add the VM to an unmanaged instance group
# add the VM to an unmanaged instance group
gcloud compute instance-groups unmanaged create callouts-ig \
--zone=$ZONE
# set port for instance group
gcloud compute instance-groups unmanaged set-named-ports callouts-ig \
--named-ports=http:80,grpc:443 \
--zone=$ZONE
# add the new VM to the unmanaged instance group
gcloud compute instance-groups unmanaged add-instances callouts-ig \
--zone=$ZONE \
--instances=callouts-vm
####### create a callout backend service and add a backend
# Create a basic HTTP health check for the instance
# health check protocol of agent needs to be: Protocol gRPC with TLS
gcloud compute health-checks create grpc-with-tls callouts-hc \
--region=$REGION \
--port=443
# Create a callout backend service that uses the HTTP/2 protocol
gcloud compute backend-services create l7-ilb-callout-service \
--load-balancing-scheme=INTERNAL_MANAGED \
--protocol=HTTP2 \
--port-name=grpc \
--health-checks=callouts-hc \
--health-checks-region=$REGION \
--region=$REGION
# Add the instance group with the extension server as a backend to the backend service. The instance group runs the ext_proc service.
gcloud compute backend-services add-backend l7-ilb-callout-service \
--balancing-mode=UTILIZATION \
--instance-group=callouts-ig \
--instance-group-zone=$ZONE \
--region=$REGION

Service Extension の設定ファイルを作成する

  1. traffic.yaml という名前のトラフィック拡張機能の設定ファイルを作成します。以下の例はスクリプトの一般的な構造を示しています。使用している拡張機能の種類に基づいて設定を変更してください。

    name: traffic-ext
    forwardingRules:
    - https://www.googleapis.com/compute/v1/projects/<PROJECT_ID>/regions/us-west2/forwardingRules/l7-ilb-forwarding-rule
    loadBalancingScheme: INTERNAL_MANAGED
    extensionChains:
    - name: "chain1"
    matchCondition:
    celExpression: 'request.path.startsWith("/")'
    extensions:
    - name: 'ext11'
    authority: ext11.com
    service: https://www.googleapis.com/compute/v1/projects/<PROJECT_ID>/regions/us-west2/backendServices/l7-ilb-callout-service
    failOpen: true
    timeout: 0.1s
    metadata:
    "key": "value"
    "fr": "forwarding_rule_id"
    supportedEvents:
    - REQUEST_HEADERS
    - REQUEST_BODY
    - RESPONSE_HEADERS
  2. トラフィック拡張機能をインポートします。

    gcloud service-extensions lb-traffic-extensions import traffic-ext \
    --source=traffic.yaml \
    --location=$REGION
  3. Service Extension が有効になっていることを確認します。

    gcloud service-extensions lb-route-extensions describe traffic-ext \
    --location=$REGION

    Service Extension は、設定で指定された celExpression: 'request.path.startsWith("/")' 転送ルールに一致するリクエストに自動的に適用されます。

モニタリングとトラブルシューティング

デバッグを有効にして、Next-Gen WAF エージェントのログを確認する

  1. コールアウトバックエンドサービスに以下の環境変数を追加してください。

    -e SIGSCI_DEBUG_LOG_VERBOSITY=3 \
  2. 環境変数を startup-script-tls.sh に追加してください。

  3. 既存のVMを削除してください。

gcloud compute instances delete callouts-vm --zone=$ZONE
  1. VMを再作成します。

  2. 管理されていないインスタンスグループに VM を戻します。

gcloud compute instance-groups unmanaged add-instances callouts-ig --zone=$ZONE --instances=callouts-vm
  1. VM に SSH を接続します。

gcloud compute ssh callouts-vm --zone=$ZONE
  1. Dockerのログを表示します。

docker logs sigsci-agent -f

一般的なトラブルシューティング手順

  • Next-Gen WAF エージェントのヘルスステータスを確認します。 callouts-vm インスタンスが健全であり、ロードバランサーのヘルスチェックによってアクセス可能であることを確認します。

    gcloud compute backend-services get-health l7-ilb-callout-service --region=$REGION
  • ヘルスチェックのプロトコルを確認します。Next-Gen WAF エージェントは GRPC_WITH_TLS を使用します。