Cloud Armor セキュリティ ポリシーを構成する

ここでは、アプリケーションの受信トラフィックをフィルタリングする Google Cloud Armor セキュリティ ポリシーを作成する方法を説明します。セキュリティ ポリシーのコンセプトについては、Cloud Armor のセキュリティ ポリシーの概要をご覧ください。

始める前に

セキュリティ ポリシーを構成する前に、次のことを行います。

  • 外部アプリケーション ロードバランサのコンセプトについて理解します。

  • 既存のバックエンド サービスを調べて、セキュリティ ポリシーがまだ接続されていないものを確認します。そのようなバックエンド サービスと、それに関連付けれらたバックエンドは、Cloud Armor で保護されていません。Cloud Armor による保護をそのバックエンド サービスに追加するには、このドキュメントの手順に沿って新規または既存のセキュリティ ポリシーを接続してください。

Cloud Armor セキュリティ ポリシー用の IAM 権限を設定する

次の操作を行うには、Identity and Access Management(IAM)の Compute セキュリティ管理者のロール(roles/compute.securityAdminが必要です。

  • Cloud Armor セキュリティ ポリシーの構成、変更、更新、削除
  • 次の API メソッドの使用:
    • SecurityPolicies insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies removeRule

Compute ネットワーク管理者のロール(roles/compute.networkAdminを付与されたユーザーは、次の操作を実行できます。

  • バックエンド サービスに Cloud Armor セキュリティ ポリシーを設定する
  • 次の API メソッドの使用:
    • BackendServices setSecurityPolicy
    • BackendServices listgcloud のみ)

セキュリティ管理者のロール(roles/iam.securityAdminと Compute ネットワーク管理者のロールを持つユーザーは、SecurityPolicies API メソッドの getlistgetRule を使用して Cloud Armor のセキュリティ ポリシーを参照できます。

カスタムロールの IAM 権限を設定する

次の表に、IAM のロールの基本的な権限と、関連する API メソッドを示します。

IAM 権限 API メソッド
compute.securityPolicies.create SecurityPolicies insert
compute.securityPolicies.delete SecurityPolicies delete
compute.securityPolicies.get SecurityPolicies get
SecurityPolicies getRule
compute.securityPolicies.list SecurityPolicies list
compute.securityPolicies.use BackendServices setSecurityPolicy
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
compute.backendServices.setSecurityPolicy BackendServices setSecurityPolicy

セキュリティ ポリシーを作成する

Cloud Armor セキュリティ ポリシー、ルール、式を構成するには、 Trusted Cloud コンソール、Google Cloud CLI、または REST API を使用します。gcloud CLI を使用してセキュリティ ポリシーを作成する場合は、--type フラグを使用して、そのセキュリティ ポリシーがバックエンド セキュリティ ポリシーとエッジ セキュリティ ポリシーのどちらであるかを指定します。

セキュリティ ポリシーの構成についてよく知らない場合は、セキュリティ ポリシーの例をご覧ください。

式のサンプル

以下にサンプルの式を示します。式の詳細については、Cloud Armor カスタムルール言語リファレンスをご覧ください。

ISO 3166-1 alpha 2 の国コードや地域コードを使用するルールまたは式を構成した場合、各コードは個別に処理されます。Cloud Armor のルールと式では、これらの地域コードを明示的に使用してリクエストを許可または拒否します。

  • 次の式は、IP アドレス 1.2.3.4 から発信された、ユーザー エージェント ヘッダーに文字列 example を含むリクエストと一致します。

    inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')
    

    origin.user_ip 属性を使用すると、カスタムのクライアント IP アドレス ヘッダーの IP アドレス範囲と一致する式を作成できます。

    inIpRange(origin.user_ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')
    
  • 次の式は、特定の値を含む Cookie を持つリクエストと一致します。

    has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
    
  • 次の式は、リージョン AU からのリクエストを照合します。

    origin.region_code == 'AU'
    
  • 次の式は、指定された IP 範囲に存在しないリージョン AU からのリクエストを照合します。

    origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
    
  • 次の式は、URI が正規表現に一致する場合、特定のファイルへの番号付き変数パスを含むリクエストを照合します。

    request.path.matches('/path/[0-9]+/target_file.html')
    
  • 次の式は、Base64 でデコードされた user-id ヘッダーの値に特定の値が含まれている場合に、リクエストを照合します。

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    
  • 次の式では、SQLi 攻撃と一致するように設定された事前構成済みの式を使用しています。

    evaluatePreconfiguredWaf('sqli-stable')
    

セキュリティ ポリシーを管理する

以下の各セクションでは、プロジェクト内のセキュリティ ポリシーの一覧表示、更新、削除、テストの方法について説明します。

セキュリティ ポリシーを一覧表示する

以下の手順を使用して、現在のプロジェクトまたは指定したプロジェクト内のすべての Cloud Armor セキュリティ ポリシーを一覧表示します。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. 特定のポリシーを表示するには、[セキュリティ ポリシー] ページにあるポリシーのリストで該当の名前をクリックします。

gcloud

gcloud compute security-policies list

次に例を示します。

gcloud compute security-policies list
NAME
my-policy

詳細については、gcloud compute security-policies list をご覧ください。

セキュリティ ポリシーを更新する

以下の手順を使用して、Cloud Armor のセキュリティ ポリシーを更新します。たとえば、ポリシーの説明を変更する、デフォルトのルールの動作を変更する、ターゲット バックエンド サービスを変更する、新しいルールを追加する、といった操作が可能です。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. 特定のポリシーを更新するには、[セキュリティ ポリシー] ページにあるポリシーのリストで、更新するポリシーの [メニュー] をクリックします。

    • そのポリシーのデフォルト ルール アクションに関する説明を更新するには、[編集] を選択して変更した後で [更新] をクリックします。
    • ルールを追加するには、[ルールの追加] を選択し、セキュリティ ポリシーにルールを追加するの手順に沿って操作します。
    • ポリシーのターゲット バックエンド サービスを変更するには、[ターゲットへのポリシーの適用] を選択し、[ターゲットを追加] をクリックしてターゲットを選択してから、[追加] をクリックします。

gcloud

セキュリティ ポリシーを更新するには、次の Google Cloud CLI の手順を行います。

セキュリティ ポリシーを削除する

以下の手順を使用して、Cloud Armor セキュリティ ポリシーを削除します。ポリシーを削除する前に、ポリシーからすべてのバックエンド サービスを削除する必要があります。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. [セキュリティ ポリシー] ページで、削除するセキュリティ ポリシーの名前の横にあるチェックボックスをオンにします。

  3. ページの右上で [削除] をクリックします。

gcloud

gcloud compute security-policies delete NAME を使用します。NAME は、セキュリティ ポリシーの名前に置き換えます。

gcloud compute security-policies delete NAME

セキュリティ ポリシーをテストする

すべての新しいルールをプレビュー モードでデプロイしてから、リクエストログを調べて、ポリシーとルールが期待どおりに動作していることを確認することをおすすめします。

セキュリティ ポリシーのルールを管理する

以下の各セクションでは、セキュリティ ポリシーのルールの一覧表示、追加、更新、削除の方法について説明します。

セキュリティ ポリシーのルールを一覧表示する

以下の手順を使用して、Cloud Armor セキュリティ ポリシーのルールを一覧表示します。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. [セキュリティ ポリシー] ページで、セキュリティ ポリシーの名前をクリックします。[ポリシーの詳細] ページが表示され、ページ中央の [ルール] タブにポリシールールが一覧表示されます。

gcloud

次の gcloud コマンドを使用して、1 つのセキュリティ ポリシー内のすべてのルールを、ポリシーの説明とともに一覧表示します。

gcloud compute security-policies describe NAME \

次の gcloud コマンドを使用して、指定したセキュリティ ポリシー内に優先度が指定されたルールを記述します。

gcloud compute security-policies rules describe PRIORITY \
    --security-policy POLICY_NAME

たとえば、次のコマンドは、セキュリティ ポリシー my-policy の優先度が 1,000 のルールを記述します。

gcloud compute security-policies rules describe 1000 \
    --security-policy my-policy

出力:

action: deny(403)
description: block traffic from 192.0.2.0/24 and 198.51.100.0/24
kind: compute#securityPolicyRule
match:
  srcIpRanges:
  - '192.0.2.0/24'
  - '198.51.100.0/24'
preview: false
priority: 1000

セキュリティ ポリシーにルールを追加する

以下の手順を使用して、Cloud Armor セキュリティ ポリシーにルールを追加します。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. [セキュリティ ポリシー] ページで、セキュリティ ポリシーの名前をクリックします。[ポリシーの詳細] ページが表示されます。

  3. ページ中央の [ルール] タブをクリックします。

  4. [ルールを追加] をクリックします。

  5. (省略可)ルールの説明を入力します。

  6. モードを選択します。

    • 基本モード: IP アドレスまたは範囲に基づいて、トラフィックを許可または拒否します。
    • 詳細モード: ルール式に基づいてトラフィックを許可または拒否します。
  7. [一致] フィールドで、ルールが適用される条件を指定します。

    • 基本モード: ルールで照合する IP アドレス範囲の数を 1~10 の間で入力します。追加できる IP アドレス範囲は 10 個までです。上限については、Cloud Armor の割り当てと上限をご覧ください。

    • 詳細モード: 受信リクエストに対して評価する式またはサブ式を入力します。式の作成方法と以下の例の読み取り方法については、カスタムルール言語リファレンスをご覧ください。

      • 次の式は、IP アドレス 1.2.3.4 から発信された、ユーザー エージェント ヘッダーに文字列 example を含むリクエストと一致します。

        inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')
        
      • 次の式は、特定の値を含む Cookie を持つリクエストを照合します。

        has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')
        
      • 次の式は、リージョン AU からのリクエストを照合します。

        origin.region_code == 'AU'
        
      • 次の式は、指定された IP 範囲に存在しないリージョン AU からのリクエストを照合します。

        origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
        
      • 次の式は、URI が正規表現に一致する場合、リクエストを照合します。

        request.path.matches('/example_path/')
        
      • 次の式は、Base64 でデコードされた user-id ヘッダーの値に特定の値が含まれている場合に、リクエストを照合します。

        has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
        
      • 事前構成された式セットを使用する次の式は、SQLi 攻撃を照合します。

        evaluatePreconfiguredWaf('sqli-stable')
        
  8. [アクション] で [許可] または [拒否] を選択します。

  9. 拒否ルールを作成している場合は、[拒否ステータス] メッセージを選択します。

  10. ルールのプレビュー モードを有効にする場合は、[有効] チェックボックスをオンにします。

  11. [優先度] フィールドに正の整数を入力します。

  12. [追加] をクリックします。

gcloud

gcloud compute security-policies rules create PRIORITY コマンドを使用します。PRIORITY は、ポリシー内のルールの優先度に置き換えます。

gcloud compute security-policies rules create PRIORITY \
    --security-policy POLICY_NAME \
    --description DESCRIPTION \
    --src-ip-ranges IP_RANGES | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ] \
    --preview

たとえば、次のコマンドは、IP アドレス範囲 192.0.2.0/24 と 198.51.100.0/24 からのトラフィックを遮断するルールを追加します。このルールの優先度は 1,000 で、my-policy という名前のポリシー内のルールです。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --description "block traffic from 192.0.2.0/24 and 198.51.100.0/24" \
    --src-ip-ranges "192.0.2.0/24","198.51.100.0/24" \
    --action "deny-403"

カスタムルール言語リファレンスで条件を指定するには、--expression フラグを使用します。次のコマンドは、IP アドレス 1.2.3.4 からのトラフィックを許可するルールを追加し、user-agent ヘッダーに文字列 example を含めます。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')" \
    --action allow \
    --description "Block User-Agent 'example'"

次のコマンドは、リクエストの Cookie に特定の値が含まれている場合に、リクエストをブロックするルールを追加します。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')" \
    --action deny-403 \
    --description "Cookie Block"

次のコマンドは、リージョン AU からのリクエストをブロックするルールを追加します。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "origin.region_code == 'AU'" \
    --action deny-403 \
    --description "AU block"

次のコマンドは、指定した IP 範囲にないリージョン AU からのリクエストをブロックするルールを追加します。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')" \
    --action deny-403 \
    --description "country and IP block"

次のコマンドは、正規表現に一致する URI を含むリクエストをブロックするルールを追加します。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "request.path.matches('/example_path/')" \
    --action deny-502 \
    --description "regex block"

次のコマンドは、Base64 デコードされた user-id ヘッダーの値に特定の値が含まれている場合に、リクエストをブロックするルールを追加します。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')" \
    --action deny-403 \
    --description "country and IP block"

次のコマンドは、SQLi 攻撃を緩和する目的で設定された事前構成済みの式を使用するルールを追加します。

gcloud compute security-policies rules create 1000 \
    --security-policy my-policy \
    --expression "evaluatePreconfiguredWaf('sqli-stable')" \
    --action deny-403

セキュリティ ポリシー内の単一のルールを更新する

以下の手順を使用して、Cloud Armor セキュリティ ポリシーの単一のルールを更新します。複数のルールをアトミックに更新するには、セキュリティ ポリシーで複数のルールをアトミックに更新するをご覧ください。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. [セキュリティ ポリシー] ページで、セキュリティ ポリシーの名前をクリックします。[ポリシーの詳細] ページが表示されます。

  3. ページ中央の [ルール] タブをクリックします。

  4. 更新するルールの横にある [編集] をクリックします。[ルールの編集] ページが表示されます。

  5. 変更を加え、[更新] をクリックします。

gcloud

このコマンドを使用して、指定されたセキュリティ ポリシーで、指定された優先度を持つルールを更新します。次のコマンドを使用して、一度に 1 つのセキュリティ ポリシーのみ更新できます。

gcloud compute security-policies rules update PRIORITY [ \
    --security-policy POLICY_NAME  \
    --description DESCRIPTION  \
    --src-ip-ranges IP_RANGES  | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ]  \
    --preview
  ]
  

たとえば、次のコマンドは、IP アドレス範囲 192.0.2.0/24 からのトラフィックを許可する優先度 1111 のルールを更新します。

gcloud compute security-policies rules update 1111 \
    --security-policy my-policy \
    --description "allow traffic from 192.0.2.0/24" \
    --src-ip-ranges "192.0.2.0/24" \
    --action "allow"

このコマンドの詳細については、gcloud compute security-policies rules update をご覧ください。

ルールの優先度を更新するには、REST API を使用する必要があります。詳細については、securityPolicies.patchRule をご覧ください。

セキュリティ ポリシーの複数のルールをアトミックに更新する

アトミックに更新を行うと、1 回の更新で複数のルールに変更が適用されます。ルールを 1 つずつ更新すると、古いルールと新しいルールが少しの間同時に適用されるため、意図しない動作が発生することがあります。

複数のルールをアトミックに更新するには、現在のセキュリティ ポリシーを JSON ファイルまたは YAML ファイルにエクスポートして、ファイルを変更します。変更したファイルを使用して新しいセキュリティ ポリシーを作成し、関連するバックエンド サービスのセキュリティ ポリシーを切り替えます。

gcloud

  1. 次の例に示すように、更新するポリシーをエクスポートします。

    gcloud compute security-policies export my-policy \
        --file-name my-file \
        --file-format yaml
    

    エクスポートされたポリシーは、たとえば次の例のようになります。

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:
    - action: deny(404)
      description: my-rule-1
      match:
        expr:
          expression: evaluatePreconfiguredWaf('xss-stable')
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 1
    - action: allow
      description: my-rule-2
      match:
        config:
          srcIpRanges:
          - '1.2.3.4'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 2
    - action: deny
      description: default rule
      kind: compute#securityPolicyRule
      match:
        config:
          srcIpRanges:
          - '*'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 2147483647
    selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
    
  2. 任意のテキスト エディタを使用してポリシーを変更します。たとえば、既存のルールの優先度を変更したり、新しいルールを追加したりできます。

    description: my description
    fingerprint: PWfLGDWQDLY=
    id: '123'
    name: my-policy
    rules:
    - action: deny(404)
      description: my-rule-1
      match:
        expr:
          expression: evaluatePreconfiguredWaf('xss-stable')
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 1
    - action: allow
      description: my-new-rule
      match:
        config:
          srcIpRanges:
          - '1.2.3.1'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 10
    - action: allow
      description: my-rule-2
      match:
        config:
          srcIpRanges:
          - '1.2.3.4'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 11
    - action: deny
      description: default rule
      kind: compute#securityPolicyRule
      match:
        config:
          srcIpRanges:
          - '*'
        versionedExpr: SRC_IPS_V1
      preview: false
      priority: 2147483647
    selfLink: https://www.googleapis.com/compute/v1/projects/my-project/global/securityPolicies/my-policy
    
  3. 次の例に示すように、新しい Cloud Armor セキュリティ ポリシーを作成し、変更したファイルの名前と形式を指定します。

    gcloud compute security-policies create new-policy \
        --file-name modified-policy \
        --file-format yaml
    
  4. 次の例に示すように、関連するバックエンド サービスから古いセキュリティ ポリシーを削除します。

    gcloud compute backend-services update my-backend \
        --security-policy ""
    
  5. 次の例に示すように、新しいセキュリティ ポリシーをバックエンド サービスに追加します。

    gcloud compute backend-services update my-backend \
        --security-policy new-policy
    
  6. 古いポリシーが使用されていない場合は、ポリシーを削除します。

    gcloud compute security-policies delete my-policy
    

セキュリティ ポリシーからルールを削除する

以下の手順を使用して、Cloud Armor セキュリティ ポリシーからルールを削除します。

コンソール

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

    Google Cloud Armor ポリシーに移動

  2. セキュリティ ポリシーの名前をクリックします。[ポリシーの詳細] ページが表示されます。

  3. ページ中央の [ルール] タブで、削除するルールの横にあるチェックボックスをオンにします。

  4. [削除] をクリックします。

gcloud

次のコマンドを使用して、指定された優先度のルールを、指定されたセキュリティ ポリシーから削除します。一度に変更できるセキュリティ ポリシーは 1 つだけですが、一度に複数のルールを削除できます。

gcloud compute security-policies rules delete PRIORITY [...] [
    --security-policy POLICY_NAME \
  ]

例:

gcloud compute security-policies rules delete 1000 \
    --security-policy my-policy

セキュリティ ポリシーの接続と削除

以下の各セクションでは、バックエンド サービスとバックエンド バケットへのセキュリティ ポリシーの接続と削除の方法について説明します。

セキュリティ ポリシーをバックエンド サービスに接続する

以下の手順を使用して、Cloud Armor セキュリティ ポリシーをバックエンド サービスに接続します。1 つのセキュリティ ポリシーを複数のバックエンド サービスに接続できますが、あるバックエンド サービスに接続できるセキュリティ ポリシーは、セキュリティ ポリシーの種類ごとに 1 つずつに制限されます。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. [セキュリティ ポリシー] ページで、セキュリティ ポリシーの名前をクリックします。[ポリシーの詳細] ページが表示されます。

  3. ページ中央の [ターゲット] タブをクリックします。

  4. [新しいターゲットにポリシーを適用] をクリックします。

  5. [ターゲットを追加] をクリックします。

  6. [ターゲット] リストでターゲットを選択し、[追加] をクリックします。

gcloud

バックエンド セキュリティ ポリシーをバックエンド サービスに接続する場合は、gcloud compute backend-services コマンドと --security-policy フラグを使用します。

gcloud compute backend-services update my-backend \
    --security-policy my-policy

エッジ セキュリティ ポリシーをバックエンド サービスに接続する場合は、gcloud compute backend-services コマンドと --edge-security-policy フラグを使用します。

gcloud compute backend-services update my-backend \
    --edge-security-policy my-policy

バックエンド サービスからセキュリティ ポリシーを削除する

以下の手順を使用して、Cloud Armor のバックエンド セキュリティ ポリシーまたはエッジ セキュリティ ポリシーをバックエンド サービスから削除します。

コンソール

  1. Trusted Cloud コンソールで、[Cloud Armor ポリシー] ページに移動します。

    [Cloud Armor ポリシー] に移動

  2. [セキュリティ ポリシー] ページで、セキュリティ ポリシーの名前をクリックします。[ポリシーの詳細] ページが表示されます。

  3. ページ中央の [ターゲット] タブをクリックします。

  4. ポリシーを削除する対象のバックエンド サービスを選択します。

  5. [削除] をクリックします。

  6. [ターゲットを削除] メッセージで、[削除] をクリックします。

gcloud

バックエンド セキュリティ ポリシーを削除する場合は、gcloud compute backend-services コマンドと --security-policy フラグを使用します。

gcloud compute backend-services update my-backend \
    --security-policy ""

エッジ セキュリティ ポリシーを削除する場合は、gcloud compute backend-services コマンドと --edge-security-policy フラグを使用します。

gcloud compute backend-services update my-backend \
    --edge-security-policy ""