Google Cloud Armor に関する問題のトラブルシューティング

これらの手順を使用して、Google Cloud Armor セキュリティ ポリシーの問題をトラブルシューティングします。

一般的な問題

Google Cloud Armor セキュリティ ポリシーで構成された拒否ルールにもかかわらずトラフィックが許可される

この問題を解決する手順は次のとおりです。

  1. Google Cloud Armor セキュリティ ポリシーがターゲット バックエンド サービスに接続されていることを確認します。たとえば、次のコマンドは、バックエンド サービス BACKEND に関連付けられているすべてのデータを示します。返される結果には、このバックエンド サービスに関連付けられている Google Cloud Armor セキュリティ ポリシーの名前が含まれているはずです。

    gcloud compute backend-services describe BACKEND
    
  2. HTTP(S) ログを確認して、トラフィックに一致したポリシーとルール、および関連するアクションを特定します。ログを表示するには、Cloud Logging を使用します。

    許可されたリクエストのログの例を以下に示します。注意が必要なフィールドはハイライト表示されています。次のフィールドを確認して、トラフィックを拒否するように構成したルールと一致することを確認します。

    • configuredAction は、ルールで構成されたアクションと一致する必要があります。
    • nameは、このバックエンド サービスに接続された Google Cloud Armor セキュリティ ポリシーの名前と一致する必要があります。
    • outcomeconfiguredAction と一致する必要があります。
    • priority は、ルールの優先度の数字と一致する必要があります。
      httpRequest:
       remoteIp: 104.133.0.95
       requestMethod: GET
       requestSize: '801'
       requestUrl: http://74.125.67.38/
       responseSize: '246'
       serverIp: 10.132.0.4
       status: 200
       userAgent: curl/7.35.0
         insertId: ajvis5ev4i60
         internalId:
           projectNumber: '895280006100'
         jsonPayload:
           '@type': type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry
           enforcedSecurityPolicy:
             configuredAction: ACCEPT
             name: mydev-policy-log-test1
             outcome: ACCEPT
             priority: 2147483647
           statusDetails: response_sent_by_backend
         logName: projects/mydev-staging/logs/requests
         resource:
           labels:
             backend_service_name: BACKEND_SERVICE_NAME
             forwarding_rule_name: FORWARDING_RULE_NAME
             project_id: PROJECT_ID
             target_proxy_name: TARGET_HTTP_PROXY_NAME
             url_map_name: URL_MAP_NAME
             zone: global
           type: http_load_balancer
         severity: INFO
         timestamp: '2017-04-18T18:57:05.845960288Z'
    
  3. ルールの階層を確認して、確実に正しいルールが一致するようにします。allow アクションを含む優先度の高いルールがトラフィックと一致している可能性があります。gcloud コマンドライン ツールの security-policiesdescribe コマンドを使用して、Google Cloud Armor セキュリティ ポリシーの内容を表示します。

    たとえば、次の例では、より高い優先度の許可ルール(優先度 100)を IPアドレス 1.2.3.4 からのトラフィックに一致させ、低い優先度の拒否ルール(優先度 200)がトラフィックをトリガーおよびブロックしないようにする方法を示しています。

    gcloud compute security-policies describe POLICY_NAME
    

    出力:

      creationTimestamp: '2017-04-18T14:47:58.045-07:00
      description: ''
      fingerprint: Yu5spBjdoC0=
      id: '2560355463394441057'
      kind: compute#securityPolicy
      name: POLICY_NAME
      rules:
      -action: allow
       description: allow high priority rule
       kind: compute#securityPolicyRule
       match:
         srcIpRanges:
         -'1.2.3.4/32'
       preview: false
       priority: 100
      -action: deny
       description: deny lower priority rule
       kind: compute#securityPolicyRule
       match:
         srcIpRanges:
         -'1.2.3.0/24
       preview: false
       priority: 200
      -action: deny
       description: default rule
       kind: compute#securityPolicyRule
       match:
         srcIpRanges:
         -'*'
       preview: false
       priority: 2147483647
       selfLink: http://www.googleapis.com/compute/v1/projects/bigclustertestdev0-devconsole/global/securityPolicies/sp
    

事前設定されたルールが誤検知を返す

XSS と SQLi の検出は、HTTP リクエスト ヘッダーと他の L7 パラメータの静的なシグネチャ マッチングに基づいています。これらの正規表現パターンでは、偽陽性となる可能性が高くなります。プレビュー モードで XSS や SQLi の検出用に事前構成済みのルールを使用して、ログに偽陽性がないか確認できます。

偽陽性が見つかった場合は、トラフィックの内容を ModSecurity CRS のルールと比較できます。 ルールが無効か不適切な場合は、evaluatePreconfiguredExpr 式を使用してルールを無効にし、exclude ID list 引数でルールの ID を指定します。

ログを確認してすべての偽陽性を削除した後、プレビュー モードを無効にします。

事前設定済みのルールをプレビュー モードで追加するには:

  1. プレビュー モードで事前設定された式セットとともにセキュリティ ポリシーを作成します。

    gcloud compute security-policies rules create 1000
       --security-policy POLICY_NAME
       --expression "evaluatePreconfiguredExpr('xss-stable')"
       --action deny-403
       --preview
    
  2. urlcookie などの HTTP リクエスト フィールドの HTTP(S) ログを確認します。たとえば、requestUrlは ModSecurity CRS ルール ID 941180 に対して検知されます。

    httpRequest:
      remoteIp: 104.133.0.95
      requestMethod: GET
      requestSize: '801'
      requestUrl: http://74.125.67.38/foo?document.cookie=1010"
      responseSize: '246'
      serverIp: 10.132.0.4
      status: 200
      userAgent: curl/7.35.0
    insertId: ajvis5ev4i60
    internalId:
      projectNumber: '895280006100'
    jsonPayload:
      '@type': type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry
      enforcedSecurityPolicy:
        configuredAction: ACCEPT
        name: POLICY_NAME
        outcome: ACCEPT
        priority: 2147483647
        preconfiguredExprIds: [ 'owasp-crs-v030001-id941180-xss' ]
      statusDetails: response_sent_by_backend
    logName: projects/mydev-staging/logs/requests
    resource:
      labels:
        backend_service_name: BACKEND_SERVICE
        forwarding_rule_name: mydev-forwarding-rule
        project_id: mydev-staging
        target_proxy_name: mydev-target-http-proxy
        url_map_name: mydev-url-map
        zone: global
      type: http_load_balancer
    severity: INFO
    timestamp: '2017-04-18T18:57:05.845960288Z'
    
  3. Google Cloud Armor セキュリティ ポリシーのルールを更新して、ModSecurity CRS ルール ID 941180 を除外します。

    gcloud compute security-policies rules update 1000 \
        --security-policy POLICY_NAME \
        --expression "evaluatePreconfiguredExpr('xss-stable', ['owasp-crs-v030001-id941180-xss'])" \
        --action deny-403 \
        --preview
    
  4. ログをもう一度確認してから、プレビュー モードを無効にしてルールを実装します。

シグネチャが拒否されたクライアントがブロックまたは拒否されない

Google Cloud Armor と Cloud CDN を併用している場合、セキュリティ ポリシーが適用されるのは、動的コンテンツやキャッシュ ミスに関するリクエスト、または CDN オリジン サーバーが宛先であるその他のリクエストに限られます。そのリクエストが CDN オリジン サーバーに到達することをダウンストリーム Google Cloud Armor セキュリティ ポリシーが禁止している場合でも、キャッシュ ヒットが発生しれます。

名前付き IP アドレスリストに関する問題

このセクションでは、名前付き IP アドレスリストに関する問題の解決について説明します。

名前付き IP アドレスリストに含まれる IP アドレス

リスト内の IP アドレスは、Google Cloud Armor の名前付き IP アドレスリスト ガイドに記載されているプロバイダ ウェブサイトの IP アドレスと常に一致します。リストについてご不明な点がある場合は、Cloud サポートチームにお問い合わせください。

名前付き IP アドレスリスト内の IP アドレスが、Google Cloud Armor で最新でない

Google Cloud Armor は、IP アドレスリストを IP アドレスリスト プロバイダと毎日同期します。プロバイダのデータよりも数時間または 1 日遅れている古いデータが存在する可能性があります。ただし、古いデータが想定よりも長く残っていると思われる場合(1 週間を超える場合など)は、Cloud サポートチームにお問い合わせください。

名前付き IP アドレスリストを参照するセキュリティ ポリシーの作成が難しい

次のようなコマンドを使用して、名前付き IP アドレスリストを参照するセキュリティ ポリシーを作成できます。

gcloud beta compute security-policies rules create 750 \
    --security-policy my \
    --expression "evaluatePreconfiguredExpr('sourceiplist-abc')" \
    --action "allow"

コマンドが失敗した場合、次のようなエラーが表示されます。

ERROR: (gcloud.beta.compute.security-policies.rules.create) Could not fetch resource:
 - Invalid value for field 'resource.match.expr': '{  "expression": "evaluatePreconfiguredExpr(\u0027sourceiplist-abc\u0027)"}'. Error parsing Cloud Armor rule matcher expression: sourceiplist-abc is not a valid preconfigured expression set.

特定のプロバイダがサポートされていることと、IP アドレスリストの名前が正しく指定されていることを確認します。これを行うには、次の gcloud コマンドを使用して、現在の事前構成済みの式セットを一覧表示します。

gcloud beta compute security-policies list-preconfigured-expression-sets

名前付き IP アドレスの許可リストに事前構成済みのルールがあるにもかかわらず、トラフィックがブロックされている

名前付き IP アドレスリストにある IP アドレスからのトラフィックがブロックされている場合があります。

  1. トラフィックが名前付き IP アドレスの許可リストにある IP アドレスから送信されていることを確認します。

  2. トラフィックをブロックする可能性のある、優先度の高い他のセキュリティ ルールがあるかどうかを確認します。問題が解決しない場合は、Cloud サポートチームにお問い合わせください

  3. セキュリティ ポリシーが正しいバックエンド サービスに接続されていることを確認します。

    gcloud compute backend-services describe BACKEND_SERVICE
    
  4. セキュリティ ポリシーにあるルールを確認します。例:

     gcloud compute security-policies describe POLICY_NAME
    

    コマンドから次のような情報が返されます。

    ---
    …
    name: POLICY_NAME
    rules:
    -action: allow
     description: allow fastly ip addresses
     kind: compute#securityPolicyRule
     match:
        expr:
          expression: evaluatePreconfiguredExpr('sourceiplist-fastly')
     preview: false
     priority: 100
    -action: deny(403)
     description: Default rule, higher priority overrides it
     kind: compute#securityPolicyRule
     match:
        config:
          srcIpRanges:
          -'*'
        versionedExpr: SRC_IPS_V1
     preview: false
     priority: 2147483647
    -action: deny(404)
     description: deny xyz referer
     kind: compute#securityPolicyRule
     match:
        expr:
          expression: request.headers['Referer'].contains('xyz')
     preview: false
     priority: 50
    …
    

    上記のセキュリティ ポリシーには、3 つのルールがあります。デフォルトの拒否ルール、Fastly の IP アドレスの許可ルール、xyz を含むリファラーの拒否ルールです。また、それぞれの優先度も表示されます。

  5. ログを調べて、トラフィックに一致するルールと、関連するアクションを決定します。ロギングの詳細については、Cloud Logging API の以前のログビューアでのログの表示をご覧ください。

    ログの例を次に示します。

     httpRequest: {
        referer: "http://www.xyz.com/"
        remoteIp: "23.230.32.10"
        requestMethod: "HEAD"
        requestSize: "79"
        requestUrl: "http://www.abc.com/"
        responseSize: "258"
        status: 404
        userAgent: "Mozilla/5.0"
      }
      …
      jsonPayload: {
        @type: "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry"
        enforcedSecurityPolicy: {
          configuredAction: "DENY"
          name: "POLICY_NAME"
          outcome: "DENY"
          priority: 50
        }
        statusDetails: "denied_by_security_policy"
      }
      …
    

    上記のログからのリクエストは 23.230.32.10 からのもので、Fastly のパブリック IP アドレスリストから取得されます。ただし、リクエストは、優先度 50 の拒否ルールと一致しています。これをセキュリティ ポリシーの内容と比較すると、このルールは xyz を含むリファラーの拒否ルールに対応しています。このリクエストには http://www.xyz.com/ というリファラーがあるため、セキュリティ ルールの適用は正しく動作しています。

Security Command Center の検出に関する問題

Google Cloud Armor カードが Security Command Center に表示されない

Security Command Center インターフェースで Google Cloud Armor の検出結果を有効にします。

Google Cloud Armor の検出結果が Security Command Center に表示されない

Google Cloud Armor の検出結果が Security Command Center に表示されない場合、バックエンド サービスへのトラフィックが検出結果を表示するための基準を満たしていない可能性があります。

バックエンドへのトラフィック量に関する質問については、ネットワーク セキュリティ ポリシーにある Cloud Monitoring ダッシュボードでリクエスト統計を確認してください。

検出結果が多すぎる

この問題に関するサポートについては、Cloud サポートチームにお問い合わせください

次のステップ