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

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

  • IPv4 アドレスと IPv6 アドレス、範囲(CIDR)
  • 国コード(地域)
  • レイヤ 7 フィルタリング

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

構成可能な名前と値を持つカスタム ヘッダーを挿入することで、Google Cloud Armor が許可するリクエストを装飾できます。

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

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

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

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 メソッドをご覧ください。

ポリシーの添付ファイルを表示する

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

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 Cache サービスでロギングを有効にする必要があります。

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

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 アドレスを除き、国外のクライアントを拒否する

メディア サービングでは、コンテンツ ライセンスまたは支払いメカニズムがある地域外のクライアントからの接続を拒否することがよくあります。

たとえば、インドにあるクライアントと、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 と評価されないすべてのクライアントを拒否します。
  • 複数のルールを組み合わせるには、ブール演算子を使用します。

次のポリシーは、インドのクライアントからのトラフィックを許可し、定義した 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 つのルールに含めることができるサブ式の数が記載されています。複数のサブ式を組み合わせる必要がある場合は、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')

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

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_policy が含まれ、outcomeALLOW です。たとえば、ポリシーが接続されていないサービスのリクエストログ エントリは次の値を持ちます。

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 などのクライアント固有のデータが含まれます。

次のステップ