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
ポリシーを調べると、次の 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.headers
、request.method
、request.path
、request.scheme
、request.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.enable
が true
に設定されていることを確認します。ログが有効になっていない場合、サービスはセキュリティ ポリシー イベントをログに記録しません。
クライアントが米国外にあり、米国外からのリクエストを拒否する deny-non-us-clients
というセキュリティ ポリシーが適用されている場合の、拒否されたリクエストのログエントリを以下に示します。
enforcedSecurityPolicy: name: deny-non-us-clients outcome: DENY
Google Cloud Armor ポリシーが適用されていないサービスには、enforcedSecurityPolicy.name
の値として no_policy
が含まれ、outcome
は ALLOW
です。たとえば、ポリシーが接続されていないサービスのリクエストログ エントリは次の値を持ちます。
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_code
はZZ
に設定されます。
Media CDN エンドポイント(routing.routeRules[].headerActions[].responseHeadersToAdd[]
を使用)に地域ヘッダーをレスポンス ヘッダーに追加したり、に提供した地域データを反映したりできます。最初の統合とテストで geoIP データソースの違いを検証するための Cloud Function の関数をご覧ください。
さらに、Media CDN リクエスト ログには、既存のデータソースと照合できる clientRegion
などのクライアント固有のデータが含まれます。
次のステップ
- 署名付きリクエストを使用して、ユーザーごとにコンテンツを承認する方法について学習する。
- Google Cloud Armor ルールのリファレンスで、IP と地理的な一致ルールを表現して組み合わせる方法を確認します。
- ロギングのドキュメントにアクセスして、リクエストログをクエリする方法と、ブロックされたリクエストを確認する。