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

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

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

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

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

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

    • configuredAction は、ルールで構成されたアクションと一致する
    • outcome は、上記の configuredAction と一致する
    • priority は、ルールの優先度の数字と一致する
    • name は、このバックエンド サービスに接続された Google Cloud Armor セキュリティ ポリシーの名前と一致する
    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: ''
           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. ルールの階層を確認して、確実に正しいルールが一致するようにします。allow アクションのある優先度の高いルールがトラフィックと一致している可能性があります。gcloud コマンドライン ツールのセキュリティ ポリシーに対する describe コマンドを使用して、Google Cloud Armor セキュリティ ポリシーの内容を確認します。

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

    gcloud compute security-policies describe my-policy
    
    creationTimestamp: '2017-04-18T14:47:58.045-07:00
    description: ''
    fingerprint: Yu5spBjdoC0=
    id: '2560355463394441057'
    kind: compute#securityPolicy
    name: my-policy
    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 my-policy
       --expression "evaluatePreconfiguredExpr('xss-stable')"
       --action deny-403
       --preview
    
  2. urlcookie などの HTTP リクエスト フィールドの HTTP(S) ログを確認します。たとえば、requestUrlModSecurity 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: my-policy
        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: ''
        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 my-policy \
       --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 アドレスからのトラフィックがブロックされている場合があります。トラフィックが名前付き IP アドレスの許可リスト上の IP アドレスから発信されていることを確認します。次に、トラフィックをブロックする可能性のある他のセキュリティ ルールがあるかどうかを確認します。それでも問題が解決しない場合は、Cloud サポートチームにお問い合わせください。

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

gcloud compute backend-services describe my-backend-service

次に、セキュリティ ポリシーにあるルールを確認します。例:

 gcloud compute security-policies describe my-policy
---
…
name: my-policy
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」を含むリファラーの拒否ルールです。それぞれの優先度も表示されます。

次に、ログを調べて、トラフィックに一致するルールと、関連するアクションを決定します。ロギングの詳細については、ログの表示(従来版)をご覧ください。

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

 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: "my-policy"
      outcome: "DENY"
      priority: 50
    }
    statusDetails: "denied_by_security_policy"
  }
  …

上記のログからのリクエストは 23.230.32.10 からのもので、Fastly 社のパブリック IP アドレスリスト(https://api.fastly.com/public-ip-list で確認できます)から取得されます。ただし、リクエストは、優先度 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 サポートチームにお問い合わせください。