Media CDN は Google Cloud Armor セキュリティ ポリシーを使用して、望ましくないトラフィックがサービスに到達しないようにします。リクエストは、次の条件に基づいて許可または拒否できます。
- IPv4 アドレスと IPv6 アドレス、範囲(CIDR)
- 国コード(地域)
- レイヤ 7 フィルタリング
- Google Threat Intelligence( Google Cloud Armor Enterprise 階層が必要)
- 自律システム番号(ASN)
これらの機能によって、コンテンツ ライセンス制限が設定された特定のロケーションにあるユーザーにコンテンツのダウンロードを制限できます。また、会社の IP アドレスにのみテストまたはステージング エンドポイントへのアクセスを許可したり、既知の不正なクライアント IP アドレスのリストを拒否したりできます。
Cloud Armor の は ASN と統合されているため、特定の ASN からのネットワーク トラフィックを許可またはブロックできます。Cloud Armor のエッジ セキュリティ ポリシーは、これらの IP プレフィックスを担当するネットワーク オペレーターによって決定されたオリジン IP アドレスに関連付けられた ASN を使用して、トラフィック フローを制御できます。
Cloud Armor で許可されるリクエストに、構成可能な名前と値を持つカスタム ヘッダーを挿入して、リクエストを装飾できます。
Cloud Armor と Google Threat Intelligence の統合により、既知の不正な IP アドレスとドメインからのトラフィックを制御し、脅威に対する高度な保護を提供できます。
Cloud Armor セキュリティ ポリシーは、キャッシュに保存されたコンテンツとキャッシュミスの両方を含む、Media CDN から提供されるすべてのコンテンツに適用されます。
Cloud Armor セキュリティ ポリシーは Media CDN サービスごとに構成されます。そのサービスの IP アドレス(またはホスト名)宛てのリクエストには、セキュリティ ポリシーが一貫して適用されます。 サービスごとに異なるセキュリティ ポリシーを適用できます。必要に応じて、さまざまな地域に複数のサービスを作成できます。
ユーザー単位でコンテンツをより細かく保護するには、Cloud Armor ポリシーと組み合わせて 署名付き URL と署名付き Cookieを使用することをおすすめします。
Media CDN は、レイヤ 7 ヘッダー フィルタリング エッジ セキュリティ ポリシーのルール評価時に、referer ヘッダーが次のいずれかの値に設定されている場合、このヘッダーを考慮しません。
- 複数の URL
- 相対 URL
- ユーザー情報またはフラグメント コンポーネントを含む有効な絶対 URL
セキュリティ ポリシーの構成
セキュリティ ポリシーを構成する手順は次のとおりです。
始める前に
Cloud Armor セキュリティ ポリシーを Media CDN サービスに接続するには、次のことを確認してください。
- Cloud Armor に精通している。
- ポリシーを適用する既存の Media CDN サービス がある。
- 推奨されるオプション: ブロックされたリクエストを識別できるように、Media CDN サービスでロギングを有効にしている。
また、セキュリティ ポリシーを承認して作成し、Media CDN サービスに接続するには、次の Identity and Access Management 権限も必要です。
compute.securityPolicies.addAssociationcompute.securityPolicies.createcompute.securityPolicies.deletecompute.securityPolicies.getcompute.securityPolicies.listcompute.securityPolicies.updatecompute.securityPolicies.use
既存の証明書を Media CDN サービスにアタッチする必要があるユーザーは、次の IAM 権限のみが必要です。
compute.securityPolicies.getcompute.securityPolicies.listcompute.securityPolicies.use
roles/networkservices.edgeCacheUser ロールには、これらの権限がすべて含まれます。
セキュリティ ポリシーの作成
Cloud Armor セキュリティ ポリシーは複数のルールで構成され、
各ルールではリクエストの一致条件(式)のセットを定義します。
たとえば、式にはインドにいるクライアントの一致ロジックを含めることができ、関連するアクションは allow になります。リクエストがルールと一致しない場合、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
ポリシーを調べると、次の 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
セキュリティ ポリシーにルールを追加する
Cloud Armor セキュリティ ポリシーは、外部に公開されるアプリケーションやサービスを保護するために、レイヤ 7 の属性と照合されるルールのセットです。各ルールは受信トラフィックについて評価されます。
これらの属性は、セキュリティ ポリシーの HTTP リクエスト request.headers、request.method、request.path、request.scheme、request.query に使用できます。セキュリティ
ポリシー ルールの式を記述する方法については、
Cloud Armor カスタムルール言語リファレンスをご覧ください。
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
既存の Cloud Armor ポリシーを
Media CDN サービスに接続するには、
gcloud edge-cache services update コマンドを使用します。
gcloud edge-cache services update MY_SERVICE \
--edge-security-policy=SECURITY_POLICY
セキュリティ ポリシーのルールを更新する
以下の手順を使用して、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 サービスに接続されている 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 に記録されます。拒否されたリクエストをフィルタするには、
Logging クエリ
で prod-video-service 構成を使用します。
resource.type="edge_cache_service" jsonPayload.statusDetails="denied_by_security_policy"
例: レスポンス コードをカスタマイズする
特定のルールに関連付けられたアクションとして特定のステータス コードを返すように Cloud Armor ルールを構成できます。ほとんどの場合、HTTP 403 DENY ステータス コードを返して、クライアントがルールによってブロックされたことを明確に示すことをおすすめします。
サポートされているステータス コードは次のとおりです。
- HTTP
403 Forbidden - HTTP
404 Not Found - HTTP
502 Bad Gateway
次の例は、返されるステータス コードを構成する方法を示しています。
ルールに関連付けられたアクションとして [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 アドレス(コンテンツ パートナーとお客様の従業員)のみを許可し、それ以外はすべて拒否する場合があります。
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 からのトラフィックをブロックする
次の Cloud Armor カスタムルール言語式は、不正と識別された IP アドレスからのトラフィックを ブロックします。
evaluateThreatIntelligence('iplist-known-malicious-ips')
この式は、Google が常に更新している既知の不正な IP アドレスのリストに対して受信リクエストをチェックするように Cloud Armor に指示し、堅牢な自動保護を提供します。
不正な IP アドレスを自動的にブロックするには、Google Threat Intelligence ルールを使用してエッジ セキュリティ ポリシーを構成します。
次の Google Cloud CLI コマンドは、my-edge-policy などの既存のポリシーに新しい Google Threat Intelligence ルールを追加する方法を示しています。
gcloud compute security-policies create my-edge-policy \
--type=CLOUD_ARMOR_EDGE
gcloud edge-cache services update my-edge-cache-service \
--edge-security-policy "my-edge-policy"
gcloud compute security-policies rules create 1000 \
--security-policy "my-edge-policy" \
--expression "evaluateThreatIntelligence('iplist-known-malicious-ips')" \
--action "deny-403"
例: IP アドレスと IP 範囲で不正なクライアントをブロックする
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 演算子 || を使用して一致条件を組み合わせることができます。
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 サービスをターゲットとするすべてのリクエストに適用されます。このポリシーの適用は、キャッシュ検索の前に行われます。エッジ セキュリティ ポリシーで許可されていないリクエストは、構成されたステータス コードで拒否されます。
次の式は、IP アドレス 1.2.3.4 からのリクエストを照合し、user-agent ヘッダーに文字列 user1 を含めます。
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.enable が true に設定されていることを確認します。ログが有効になっていないサービスでは、セキュリティ ポリシー イベントはログに記録されません。
クライアントが米国外にあり、米国外からのリクエストを拒否する deny-non-us-clients というセキュリティ ポリシーが適用されている場合の、拒否されたリクエストのログエントリを以下に示します。
enforcedSecurityPolicy: name: deny-non-us-clients outcome: DENY
Cloud Armor ポリシーが接続されていないサービスには、enforcedSecurityPolicy.name の値として no_policy が含まれ、outcome は ALLOW になります。たとえば、ポリシーが接続されていないサービスのリクエストログ エントリは次の値を持ちます。
enforcedSecurityPolicy: name: no_policy outcome: ALLOW
GeoIP 分類について
Media CDN は、Google の内部 IP 分類データソースを使用して、IP アドレスからロケーション(リージョン、州、県、市)を導出します。複数のプロバイダから移行するか、複数のプロバイダ間でトラフィックを分割する場合、少数の IP アドレスが異なるロケーションに関連付けられることがあります。
- Cloud Armor は、ISO 3166-1 alpha 2 地域コードを使用して、クライアントを地理的位置に関連付けます。
- たとえば、米国の場合は
US、オーストラリアの場合はAUです。 - 1 つのリージョンは 1 つの国に対応する場合がありますが、必ずしもそうならない場合もあります。たとえば、
USコードには米国のすべての州、1 つの特別区、6 つの海外領土が含まれます。 - 詳細については、Unicode 技術標準の unicode_region_subtag をご覧ください。
- ロケーションを導出できないクライアントの場合、
origin.region_codeはZZに設定されます。
Media CDN エンドポイント(routing.routeRules[].headerActions[].responseHeadersToAdd[] を使用)に地域ヘッダーをレスポンス ヘッダーに追加したり、に提供した地域データを反映したりできます。最初の統合とテストで geoIP データソースの違いを検証するための Cloud Function の関数をご覧ください。
また、Media CDN リクエストログには、既存のデータソースと照合できる clientRegion やその他のクライアント固有のデータが含まれています。
次のステップ
- 署名付きリクエストを使用して、 ユーザー単位でコンテンツを承認する方法を学習する。
- Cloud Armor ルールリファレンス を確認して、IP と地理的な照合ルールをどのように表現して 組み合わせることができるかを理解する。
- ロギングのドキュメントにアクセスして、 リクエストログをクエリする方法と、ブロックされたリクエストを確認する。