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

Media CDN は Google Cloud Armor セキュリティ ポリシーを使用して、望ましくないトラフィックがそのサービスに到達するのを防止します。リクエストを許可または拒否するには、次のものに基づいて行います。

  • IPv4 および IPv6 アドレスと範囲(CIDR)
  • 国コード(geography)
  • レイヤ 7 フィルタリング

これらの機能によって、コンテンツ ライセンス制限が設定された特定のロケーションにあるユーザーにコンテンツのダウンロードを制限できます。また、会社の IP アドレスにのみテストまたはステージング エンドポイントへのアクセスを許可したり、既知の不正なクライアント IP アドレスのリストを拒否したりできます。

Google Cloud Armor セキュリティ ポリシーは、キャッシュされたコンテンツとキャッシュミスの両方を含め、Media CDN から配信されるすべてのコンテンツに適用されます。

Google Cloud Armor セキュリティ ポリシーは Media CDN サービスごとに構成されます。そのサービスの IP アドレス(またはホスト名)を宛先とするすべてのリクエストには、一貫してセキュリティ ポリシーが適用されます。サービスごとに異なるセキュリティ ポリシーを適用できます。また、必要に応じて、地域ごとに異なるサービスを作成できます。

ユーザー単位でコンテンツをよりきめ細かく保護するには、署名付き URL と署名付き Cookie を Google Cloud Armor ポリシーと組み合わせて使用することをおすすめします。

次のいずれかの値に設定されている場合、Media CDN は、レイヤ 7 ヘッダー フィルタリング エッジ セキュリティ ポリシーのルール評価時に referer ヘッダーを考慮しません。

  • 複数の URL
  • 相対 URL
  • ユーザー情報またはフラグメント コンポーネントを含む有効な絶対 URL

セキュリティ ポリシーの構成

セキュリティ ポリシーを構成するには、次の手順を行います。

始める前に

Google Cloud Armor セキュリティ ポリシーを Media CDN サービスに接続するには、次のことを確認します。

  • Google Cloud Armor に精通している。
  • ポリシーを適用する既存の Media CDN サービスがある。
  • 推奨されるオプション: Media CDN サービスでロギングを有効にして、ブロックされたリクエストを識別できるようにしている。

また、セキュリティ ポリシーを承認して作成し、Media CDN サービスに接続するには、次の Identity and Access Management 権限も必要です。

  • compute.securityPolicies.addAssociation
  • compute.securityPolicies.create
  • compute.securityPolicies.delete
  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.update
  • compute.securityPolicies.use

既存の証明書を Media CDN サービスに添付する必要があるユーザーは、次の IAM 権限のみが必要です。

  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.use

roles/networkservices.edgeCacheUser ロールには、これらの権限がすべて含まれます。

セキュリティ ポリシーの作成

Google Cloud Armor セキュリティ ポリシーは複数のルールで構成され、各ルールではリクエストの一致条件(式)のセットを定義します。たとえば、式には、インドに所在するクライアントに対する一致ロジック(関連するアクションが allow)を含めることができます。リクエストがルールと一致しない場合、Google Cloud Armor は、すべてのルールが試行されるまで、次のルールの評価を続けます。

セキュリティ ポリシーには、allow アクションを指定したデフォルト ルールがあります。デフォルト ルールでは、それに先立つルールに一致しないリクエストが許可されます。これを deny ルールに変更することで、前のルールに一致したリクエストだけを allow し、それ以外のリクエストをすべて拒否できます。

次の例で、HTTP 403 でオーストラリアに配置されたすべてのクライアントをブロックし、他のすべてのリクエストを許可するルールを作成する方法を示します。

gcloud

CLOUD_ARMOR_EDGE タイプの新しいポリシーを作成するには、gcloud compute security-policies create コマンドを使用します。

gcloud compute security-policies create block-australia \
    --type="CLOUD_ARMOR_EDGE" --project="PROJECT_ID"

これにより、最も優先度の低い(priority: 2147483647)デフォルトの許可ルールを持つポリシーが作成されます。

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

次に、優先度の高いルールを追加します。

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

次のような出力が表示されます。

Updated [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

Terraform

resource "google_compute_security_policy" "default" {
  name        = "block-australia"
  type        = "CLOUD_ARMOR_EDGE"
  description = "block AU"

  rule {
    action      = "deny(403)"
    description = "block AU"
    priority    = "1000"
    match {
      expr {
        expression = "origin.region_code == 'AU'"
      }
    }
  }
  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "default rule"
  }
}

ポリシーを調べると、次の 2 つのルールが表示されます。最初のルールはオーストラリアからのリクエスト(origin.region_code == 'AU')をブロックし、優先度が最も低い 2 番目のルールは、優先度が最も高いルールと一致しないすべてのトラフィックを許可します。

kind: compute#securityPolicy
name: block-australia
rules:
- action: deny(403)
  description: block AU
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == 'AU'
  preview: false
  priority: 1000
- action: allow
  description: default rule
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647
  ruleNumber: '1'
type: CLOUD_ARMOR_EDGE

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

Google Cloud Armor セキュリティ ポリシーは、外部公開しているアプリケーションとサービスを保護するために、レイヤ 7 属性と照合される一連のルールです。各ルールは受信トラフィックについて評価されます。

これらの属性は、セキュリティ ポリシーの HTTP リクエストrequest.headersrequest.methodrequest.pathrequest.schemerequest.query に使用できます。セキュリティ ポリシー ルールの式の作成方法については、Google Cloud Armor カスタムルール言語リファレンスをご覧ください。

Google Cloud Armor セキュリティ ポリシーのルールは、一致条件とその条件が満たされたときに実行するアクションで構成されています。

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

サービスへのポリシーの添付

gcloud

既存の Google Cloud Armor ポリシーを Media CDN サービスに接続するには、gcloud edge-cache services update コマンドを使用します。

gcloud edge-cache services update MY_SERVICE \
    --edge-security-policy=SECURITY_POLICY

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

以降の手順を使用して、Google Cloud Armor セキュリティ ポリシーの単一のルールを更新します。また、セキュリティ ポリシー内の複数のルールをアトミックに更新することもできます。

gcloud

gcloud compute security-policies rules update コマンドを実行します。

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"

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

ポリシー アタッチメントを表示する

既存のサービスに接続されているポリシーを確認するには、そのサービスを検査(記述)します。

gcloud

Media CDN サービスに接続されている Google Cloud Armor ポリシーを表示するには、gcloud edge-cache services describe コマンドを使用します。

gcloud edge-cache services describe MY_SERVICE

サービスの edgeSecurityPolicy フィールドに、接続されたポリシーを記述します。

name: "MY_SERVICE"
edgeSecurityPolicy: "SECURITY_POLICY

ポリシーを削除する

既存のポリシーを削除するには、関連するサービスを更新し、ポリシーとして空の文字列を渡します。

gcloud

gcloud edge-cache services update コマンドを使用します。

gcloud edge-cache services update MY_SERVICE 
--edge-security-policy=""

edgeSecurityPolicy フィールドが gcloud edge-cache services describe MY_SERVICE コマンドの出力から省略されるようになりました。

以下の詳細なユースケースの例を考えてみましょう。

例: ブロックされたリクエストを特定する

ブロックされたリクエストをログに記録するには、特定の Edge キャッシュ サービスでロギングを有効にする必要があります。

フィルタリング ポリシーによって許可または拒否されたリクエストは、Logging に記録されます。拒否されたリクエストをフィルタリングする場合、prod-video-service 構成の次の Logging クエリは次のようになります。

resource.type="edge_cache_service"
jsonPayload.statusDetails="denied_by_security_policy"

例: レスポンス コードをカスタマイズする

Google Cloud Armor ルールは、特定のルールに関連付けられたアクションとして特定のステータス コードを返すように構成できます。ほとんどの場合、クライアントがルールによってブロックされたことを明確に示すために、HTTP 403(deny-403)コードを返すことをおすすめします。

サポートされているステータス コードは次のとおりです。

  • HTTP 403 (禁止)
  • HTTP 404(未検出)
  • HTTP/1.1 502(不正なゲートウェイ)

次の例は、返されるステータス コードを構成する方法を示しています。

ルールに関連付けられたアクションとして [allow | deny-403 | deny-404 | deny-502] のいずれかを指定するには、次のコマンドを実行します。この例では、HTTP 502 を返すようにルールを構成します。

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

セキュリティ ポリシーのルールごとに、異なるステータス コードのレスポンスを定義できます。

例: 許可された IP アドレスを除き、国外のクライアントを拒否する

メディア配信の一般的なケースでは、コンテンツ ライセンスまたは支払いメカニズムが存在するリージョン外のクライアントからの接続を拒否することがあります。

たとえば、インドにあるクライアントと、許可リストに含まれている IP アドレス(コンテンツ パートナーやお客様の従業員を含む)のうち、192.0.2.0/24 の範囲内の IP アドレスのみを許可できます。他はすべて拒否します。

Google Cloud Armor カスタムルール言語を使用すると、次の式でこれを実現できます。

origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')

この式は allow ルールとして構成され、デフォルトの deny ルールは他のすべてのクライアントと一致するように構成されています。セキュリティ ポリシーには、常にデフォルト ルールがあります。通常、これは明示的に許可していない default deny トラフィックに構成します。また、一部のトラフィックをブロックし、他のすべてのトラフィックを default allow でブロックすることもあります。

セキュリティ ポリシーの出力では、次の点に注意してください。

  • 優先度が最も高い(priority: 0)ルールは、インドからのトラフィック、または IP アドレスの定義リストからのトラフィックを許可します。
  • 最も優先度の低いルールは default deny を表します。ルールエンジンは、優先度の高いルールが true と評価されないすべてのクライアントを拒否します。
  • boolean operatorsを使用して、複数のルールを組み合わせることができます。

次のポリシーは、インドのクライアントからのトラフィックを許可し、定義した IP 範囲のクライアントを許可し、他のすべてのトラフィックを拒否します。

ポリシーの詳細を表示すると、次のような出力が表示されます。

kind: compute#securityPolicy
name: allow-india-only
type: "CLOUD_ARMOR_EDGE"
rules:
- action: allow
  description: ''
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')
  preview: false
  priority: 0
- action: deny(403)
  description: Default rule, higher priority overrides it
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647

{region_code} ヘッダー変数を使用して、カスタム レスポンス ヘッダーを設定することもできます。このヘッダーは JavaScript を使用して検査され、クライアントに反映されます。

例: IP アドレスと IP 範囲で悪意のあるクライアントをブロックする

Google Cloud Armor カスタムルール言語を使用すると、次の式でこれを実現できます。

inIpRange(origin.ip, '192.0.2.2/32') || inIpRange(origin.ip, '192.0.2.170/32')

IPv4 では /8 マスクまで、IPv6 では /32 までの IP 範囲をブロックできます。ストリーミング プラットフォームでは、コンテンツ ライセンスの回避を最小限に抑えるために、プロキシまたは VPN プロバイダの下り(外向き)IP 範囲をブロックすることが一般的なケースです。

inIpRange(origin.ip, '192.0.2.0/24') || inIpRange(origin.ip, '198.51.100.0/24') || inIpRange(origin.ip, '203.0.113.0/24') || inIpRange(origin.ip, '2001:DB8::B33F:2002/64')

IPv4 と IPv6 の両方のアドレス範囲がサポートされています。

例: 固定された地域のリストのみを許可する

国コードのリストがある場合は、ブール OR 演算子 || を使用して一致条件を結合できます。

Google Cloud Armor カスタムルール言語を使用すると、次の式はオーストラリアまたはニュージーランドにいるユーザーとして識別されるユーザーを許可します。

origin.region_code == "AU" || origin.region_code == "NZ"

さらに、origin.ip または inIpRange(origin.ip, '...') の式で組み合わせ、指定地域からでなくても、テスター、パートナー、会社の IP 範囲を許可できます。

カスタム式を含むルールごとに、サブ式のドキュメント数が記載されています。複数のサブ式を組み合わせる必要がある場合は、1 つのポリシー内に複数のルールを定義します。

例: 特定の国のクライアントをブロックする

あまり一般的でない例として、特定の国のクライアントをブロックし、それ以外の国からのリクエストを許可する場合があります。

これを行うには、国、およびリージョンを特定できないクライアントの両方をブロックするポリシーを作成し、他のすべてのリクエストのデフォルト許可ルールを使用します。

次の例は、カナダのクライアントとロケーション不明のクライアントをブロックし、他のすべてのトラフィックを許可するポリシーを示しています。

  kind: compute#securityPolicy
  name: block-canada
  type: "CLOUD_ARMOR_EDGE"
  rules:
  - action: deny(403)
    description: ''
    kind: compute#securityPolicyRule
    match:
      expr:
        expression: origin.region_code == "CA" || origin.region_code == "ZZ"
    preview: false
    priority: 0
  - action: allow
    description: Default rule, higher priority overrides it
    kind: compute#securityPolicyRule
    match:
      config:
        srcIpRanges:
        - '*'
      versionedExpr: SRC_IPS_V1
    preview: false
    priority: 2147483647

例: 特定のヘッダーを持つキャッシュに保存されたコンテンツのリクエストを拒否する

エッジ セキュリティ ポリシーは、ポリシーが接続されている Media CDN サービスを対象とするすべてのリクエストに適用されます。このポリシーは、キャッシュ ルックアップの前に行われます。エッジ セキュリティ ポリシーで許可されていないリクエストは、構成されたステータス コードで拒否されます。

次の式は、user-agent ヘッダーに文字列 user1 を含む IP アドレス 1.2.3.4 からのリクエストを照合します。

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

次のコマンドは、フィルタリング ルール 105 を、Media CDN サービスに接続されているエッジ セキュリティ ポリシー my-edge-policy に追加します。

gcloud compute security-policies rules create 105 \
    --security-policy my-edge-policy \
    --expression = "inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('charlie')" \
    --action= deny-403 \
    --description="block requests from IP addresses in which the user-agent header contains the string charlie"
    

Logging の違反措置

リクエストログには、適用されたセキュリティ ポリシー、およびリクエストが許可(ALLOW)されたか拒否(DENY)されたかに関する詳細情報が記録されます。

ロギングを有効にするには、サービスで logConfig.enabletrue に設定されていることを確認します。ログが有効になっていないサービスは、セキュリティ ポリシー イベントをログに記録しません。

クライアントが米国外にあり、米国外からのリクエストを拒否する deny-non-us-clients というセキュリティ ポリシーが適用されている場合の、拒否されたリクエストのログエントリを以下に示します。

enforcedSecurityPolicy:
  name: deny-non-us-clients
  outcome: DENY

Google Cloud Armor ポリシーが接続されていないサービスには、enforcedSecurityPolicy.name の値として no_policyALLOWoutcome が含まれます。たとえば、ポリシーが接続されていないサービスのリクエストログ エントリは次の値を持ちます。

enforcedSecurityPolicy:
  name: no_policy
  outcome: ALLOW

GeoIP の分類について

Media CDN は、Google の内部 IP 分類データソースを使用して、IP アドレスからロケーション(地域、都道府県、都市)を取得します。複数のプロバイダから移行するか、複数のプロバイダ間でトラフィックを分割する場合、少数の IP アドレスが異なるロケーションに関連付けられることがあります。

  • Google Cloud Armor は、ISO 3166-1 alpha 2 地域コードを使用してクライアントを地理的位置に関連付けます。
  • たとえば、米国の場合は US、オーストラリアの場合は AU です。
  • 1 つのリージョンは 1 つの国に対応する場合がありますが、必ずしもそうならない場合もあります。たとえば、US コードには米国のすべての州、1 つの特別区、6 つの海外領土が含まれます。
  • 詳細については、Unicode 技術標準の unicode_region_subtag をご覧ください。
  • ロケーションを導出できないクライアントの場合、origin.region_codeZZ に設定されます。

Media CDN エンドポイント(routing.routeRules[].headerActions[].responseHeadersToAdd[] を使用)に地域ヘッダーをレスポンス ヘッダーに追加したり、に提供した地域データを反映したりできます。最初の統合とテストで geoIP データソースの違いを検証するための Cloud Function の関数をご覧ください。

さらに、Media CDN リクエストログには clientRegion と、既存のデータソースに対して検証できるその他のクライアント固有のデータが含まれます。

次のステップ