リクエスト ロギングの使用

セキュリティ ポリシー名、一致ルールの優先度、関連するアクション、関連情報に関する Google Cloud Armor のリクエストごとのログは、外部アプリケーション ロードバランサと外部プロキシ ネットワーク ロードバランサのロギングの一環として記録されます。新しいバックエンド サービスのロギングは、デフォルトでは無効になっているため、Google Cloud Armor の全ロギング情報を記録するには、ロギングを有効にする必要があります。

Google Cloud Armor ログは、Cloud Load Balancing ログの一部です。つまり、Google Cloud Armor のログの生成には、ロードバランサに構成されたログ サンプリング レートが適用されます。ロードバランサのサンプリング レートを減らすと、Google Cloud Armor のリクエストログは、そのレートでサンプリングされます。また、プロジェクト間のサービス参照を使用すると、ロードバランサのフロントエンドと URL マップを含むホストまたはサービス プロジェクトの下にログが生成されます。したがって、フロントエンド プロジェクトの管理者は、バックエンド プロジェクトの管理者にログと指標を読み取る権限を付与することをおすすめします。

ロギングを使用すると、Google Cloud Armor セキュリティ ポリシーで評価されたすべてのリクエストと、結果またはアクションを確認できます。たとえば、拒否されたリクエストを表示するには、jsonPayload.enforcedSecurityPolicy.outcome="DENY"jsonPayload.statusDetails="denied_by_security_policy" などのフィルタを使用します。

外部アプリケーション ロードバランサのロギングを有効にするには、外部アプリケーション ロードバランサのロギングとモニタリングをご覧ください。外部プロキシ ネットワーク ロードバランサの場合、前の「外部アプリケーション ロードバランサのロギングとモニタリング」ページに記載されている Google Cloud CLI コマンドを使用できます。Google Cloud コンソールを使用して外部プロキシ ネットワーク ロードバランサのロギングを有効にすることはできません。

また、さまざまなロギングレベルを設定して、セキュリティ ポリシーとルールが意図したとおりに機能しているかどうか評価することもできます。詳細については、詳細ログをご覧ください。

セキュリティ ポリシーのログエントリ

次に示すログ エクスプローラのログエントリは、Google Cloud Armor のセキュリティ ポリシーとルールのロギング用です。jsonPayload でエントリの構造は次のとおりです。HTTP リクエストの詳細は、httpRequest メッセージに表示されます。

  • statusDetails(文字列): レスポンス コードを説明するテキスト。
    • redirected_by_security_policy: リクエストがリダイレクト ルールによってリダイレクトされました。GOOGLE_RECAPTCHA または EXTERNAL_302 のいずれかになります。
    • denied_by_security_policy: Google Cloud Armor セキュリティ ポリシーのために、リクエストがロードバランサによって拒否されました。
    • body_denied_by_security_policy: Google Cloud Armor セキュリティ ポリシーのために、リクエスト本文がロードバランサによって拒否されました。
  • enforcedSecurityPolicy: 適用されたセキュリティ ポリシー ルール。
    • name(文字列): セキュリティ ポリシーの名前。
    • priority(数値): セキュリティ ポリシーの一致ルールの優先度。
    • adaptiveProtection: 自動的にデプロイされる Adaptive Protection ルールに関する情報(該当する場合)。
      • autoDeployAlertId: Adaptive Protection が検出したイベントのアラート ID。
    • configuredAction(文字列): 一致ルールに構成したアクションの名前。例: ALLOWDENYGOOGLE_RECAPTCHAEXTERNAL_302THROTTLE(スロットル ルールの場合)、RATE_BASED_BAN(レートベースの禁止ルールの場合)
    • rateLimitAction: スロットル ルールまたはレートベースの禁止ルールが一致したときのレート制限アクションの情報。
      • key(文字列): レート制限のキー値(最大 32 バイト)。鍵タイプが ALL の場合、または鍵タイプが HTTP-HEADERHTTP-COOKIE であり、指定したヘッダーまたは Cookie がリクエストに含まれていない場合、このフィールドは省略されます。
      • outcome(文字列): 有効な値は次のとおりです。
        • "RATE_LIMIT_THRESHOLD_CONFORM" - 構成されたレート制限のしきい値を下回る場合。
        • "RATE_LIMIT_THRESHOLD_EXCEED" - 構成されたレート制限のしきい値を超えた場合。
        • "BAN_THRESHOLD_EXCEED" - 構成された禁止しきい値を超えた場合。
    • outcome(文字列): 構成されたアクションの実行結果(ACCEPTDENYREDIRECTEXEMPT など)。
    • preconfiguredExprIds(文字列): ルールをトリガーしたすべての事前構成済み WAF ルール式の ID。
    • threatIntelligence: Threat Intelligence の一致した IP アドレスリストに関する情報(該当する場合)。
      • categories:(文字列)一致した IP アドレスリスト名。
  • previewSecurityPolicy: リクエストがプレビュー用に構成されたルールに一致する場合に入力されます(プレビュー ルールが適用済みのルールよりも優先される場合のみ)。
    • name(文字列): セキュリティ ポリシーの名前
    • priority(数値): セキュリティ ポリシーの一致ルールの優先度。
    • configuredAction(文字列): 一致ルールに構成したアクションの名前。例: ALLOWDENYGOOGLE_RECAPTCHAEXTERNAL_302THROTTLE(スロットル ルールの場合)、RATE_BASED_BAN(レートベースの禁止ルールの場合)
    • rateLimitAction: スロットル ルールまたはレートベースの禁止ルールが一致したときのレート制限アクションの情報。
      • key(文字列): レート制限のキー値(最大 32 バイト)。鍵タイプが ALL の場合、または鍵タイプが HTTP-HEADERHTTP-COOKIE であり、指定したヘッダーまたは Cookie がリクエストに含まれていない場合、このフィールドは省略されます。
      • outcome(文字列): 有効な値は次のとおりです。
        • "RATE_LIMIT_THRESHOLD_CONFORM" - 構成されたレート制限のしきい値を下回る場合。
        • "RATE_LIMIT_THRESHOLD_EXCEED" - 構成されたレート制限のしきい値を超えた場合。
        • "BAN_THRESHOLD_EXCEED" - 構成された禁止しきい値を超えた場合。
    • outcome(文字列): 構成された実行結果。
    • outcome(文字列): 構成されたアクションの実行結果(ACCEPTDENYREDIRECTEXEMPT など)。
    • preconfiguredExprIds(文字列): ルールをトリガーしたすべての事前構成済み WAF ルール式の ID。
    • threatIntelligence: Threat Intelligence の一致した IP アドレスリストに関する情報(該当する場合)。
      • categories:(文字列)一致した IP アドレスリスト名。
  • enforcedEdgeSecurityPolicyプレビュー): 適用されたエッジ セキュリティ ポリシー ルール。
    • name(文字列): セキュリティ ポリシーの名前。
    • priority(数値): セキュリティ ポリシーの一致ルールの優先度。
    • configuredAction(文字列): 一致ルールで構成したアクションの名前(ALLOWDENY など)
    • outcome(文字列): 構成されたアクションの実行結果(ACCEPTDENY など)
  • previewEdgeSecurityPolicyプレビュー): リクエストが、プレビュー用に構成されたエッジ セキュリティ ポリシー ルールに一致する場合に入力されます(プレビュー ルールが適用済みのルールよりも優先される場合のみ)。
    • name(文字列): セキュリティ ポリシーの名前。
    • priority(数値): セキュリティ ポリシーの一致ルールの優先度。
    • configuredAction(文字列): 一致ルールで構成したアクションの名前(ALLOWDENY など)
    • outcome(文字列): 構成されたアクションの実行結果(ACCEPTDENY など)

詳細ロギング

事前に構成された WAF ルールが特定のリクエストでトリガーされた理由がわからないことがあります。Google Cloud Armor のデフォルトのイベントログには、トリガーされたルールとサブ署名が含まれています。ただし、トラブルシューティング、ルールの検証、またはルールの調整を目的として、ルールをトリガーした受信リクエストの詳細を特定することが必要な場合があります。

--log-level フラグを使用すると、ポリシーに記録される詳細レベルを変更できます。このフラグの値は NORMAL または VERBOSE のいずれかです。

--log-level=[NORMAL | VERBOSE]

次に例を示します。

gcloud compute security-policies update ca-policy-1 \
    --log-level=VERBOSE

最初にポリシーを作成するとき、ポリシーを変更するとき、またはポリシーのトラブルシューティングを行うときに、詳細ログを有効にすることをおすすめします。

詳細ロギングが有効な場合に記録される値

詳細ロギングが有効になっている場合、Cloud Logging に送信されるロード バランシング リクエスト ログに追加情報が記録されます。詳細ロギングが有効になっている場合、リクエストに次の追加フィールドが含まれます。

  • matchedFieldType(文字列): 一致を引き起こすフィールドのタイプです。

    • ARG_NAMES
    • ARG_VALUES
    • BODY

      • ログに BODY フィールドが含まれている場合、投稿の本文全体がルールに一致することを意味します。
    • COOKIE_VALUES

    • COOKIE_NAMES

    • FILENAME

    • HEADER_VALUES

    • RAW_URI

    • REFERER

    • REQUEST_LINE

    • URI

    • USER_AGENT

    • HEADER_NAMES

    • ARGS_GET

    • X_FILENAME

    • ARG_NAME_COUNT

    • TRANSFER_ENCODING

    • REQUEST_METHOD

  • matchedFieldName(文字列): Key-Value ペアの値の部分と一致すると、このフィールドに Key-Value が保存されます。それ以外の場合は空になります。

  • matchedFieldValue(文字列): フィールド内で照合する部分の接頭辞。最大 16 バイトです。

  • matchedFieldLength(整数): フィールドの合計長。

  • matchedOffset(整数): 一致の原因となるフィールド内の開始オフセット。

  • matchedLength(整数): 一致の長さ。

たとえば、SQL インジェクション WAF ルールが有効なプロジェクトにリクエストを送信できます。

curl http://IP_ADDR/?sql_table=abc%20pg_catalog%20xyz

ログ エクスプローラのエントリは次のようになります。

enforcedSecurityPolicy: {
 name: "user-staging-sec-policy"
 priority: 100
 configuredAction: "DENY"
 outcome: "DENY
 preconfiguredExprIds: [
   0: "owasp-crs-v030001-id942140-sqli"
  ]
matchedFieldType: "ARG_VALUES"
matchedFieldName: "sql_table"
matchedFieldValue: "pg_catalog"
matchedFieldLength: 18
matchedOffset: 4
matchedLength: 10
}

詳細ログが有効な場合のプライバシーの維持

詳細ロギングを使用すると、Google Cloud Armor は、事前構成された特定の WAF ルールをトリガーする受信リクエストの要素の一部をログに記録します。これらのスニペットには、リクエスト ヘッダー、リクエスト パラメータ、POST 本文の要素などが含まれることがあります。リクエスト ヘッダーや本文の内容、WAF ルールがトリガーする内容によっては、スニペットに IP アドレスやその他の機密データが含まれる場合があります。

詳細ログを有効にすると、機密性のあるデータが Logging のログに記録される可能性があります。詳細ロギングは、ルールの作成と検証中、またはトラブルシューティングでのみ有効にすることをおすすめします。通常の処理では、詳細ログを無効にしておくことをおすすめします。

ログの表示

Google Cloud Armor セキュリティ ポリシーのログは、Google Cloud Console でのみ表示できます。

コンソール

  1. Google Cloud コンソールで、Google Cloud Armor のポリシーに移動します。

    [Google Cloud Armor ポリシー] に移動

  2. アクション」をクリックします。

  3. [ログを表示] を選択します。

データロギングをリクエストする

Google Cloud Armor で使用する場合、jsonPayload には次の追加フィールドがあります。

  • securityPolicyRequestData: セキュリティ ポリシーによって処理されるリクエストに関するデータ。最終的にどのルールに一致するかは関係ありません。
    • recaptchaActionToken: reCAPTCHA Enterprise アクション トークンに関連するデータ。
      • score (float): reCAPTCHA Enterprise アクション トークンに埋め込まれたユーザー正当性スコア。reCAPTCHA Enterprise アクション トークンがリクエストに追加され、セキュリティ ポリシー ルールに基づいて正常にデコードされた場合にのみ存在します。詳細については、reCAPTCHA Enterprise の評価の適用をご覧ください。
    • recaptchaSessionToken: reCAPTCHA Enterprise セッション トークンに関連するデータ。
      • score (float): reCAPTCHA Enterprise セッション トークンに埋め込まれたユーザー正当性スコア。reCAPTCHA Enterprise セッション トークンがリクエストに追加され、セキュリティ ポリシー ルールに基づいて正常にデコードされた場合にのみ存在します。
    • tlsJa3Fingerprint: クライアントが HTTPSHTTP/2、または HTTP/3 を使用して接続している場合、JA3 TTL/SSL フィンガープリント。フィンガープリントが利用可能で、リクエストを評価するセキュリティ ポリシーがある場合にのみ存在します(ポリシー内の式がリクエストと一致するかどうかは関係ありません)。

ログの例

以下に、リクエストをブロックするスロットル ルールのログ詳細の例を示します。

jsonPayload: {
 enforcedSecurityPolicy: {
  priority: 100
  name: "sample-prod-policy"
  configuredAction: "THROTTLE"
  outcome: "DENY"
  rateLimitAction: {
    key:"sample-key"
    outcome:"RATE_LIMIT_THRESHOLD_EXCEED"
  }
 }
 @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
 statusDetails: "denied_by_security_policy"
}
httpRequest: {8}
resource: {2}
timestamp: "2021-03-17T19:16:48.185763Z"

以下に、リクエストをブロックするレートベースの禁止ルールのログ詳細の例を示します。

jsonPayload: {
 @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
 enforcedSecurityPolicy: {
  priority: 150
  name: "sample-prod-policy"
  outcome: "DENY"
  configuredAction: "RATE_BASED_BAN"
  rateLimitAction: {
    key:"sample-key"
    outcome:"BAN_THRESHOLD_EXCEED"
  }
 }
 statusDetails: "denied_by_security_policy"
}
httpRequest: {8}
resource: {2}
timestamp: "2021-03-17T19:27:17.393244Z"

次のステップ

Google Cloud Armor に関する問題のトラブルシューティングについて学習する。