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
ポリシーを調べると、次の 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
メソッドをご覧ください。
ポリシー アタッチメントを表示する
既存のサービスに接続されているポリシーを確認するには、そのサービスを検査(記述)します。
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.enable
が true
に設定されていることを確認します。ログが有効になっていないサービスは、セキュリティ ポリシー イベントをログに記録しません。
クライアントが米国外にあり、米国外からのリクエストを拒否する deny-non-us-clients
というセキュリティ ポリシーが適用されている場合の、拒否されたリクエストのログエントリを以下に示します。
enforcedSecurityPolicy: name: deny-non-us-clients outcome: DENY
Google Cloud Armor ポリシーが接続されていないサービスには、enforcedSecurityPolicy.name
の値として no_policy
と ALLOW
の outcome
が含まれます。たとえば、ポリシーが接続されていないサービスのリクエストログ エントリは次の値を持ちます。
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 ルールと地理的一致ルールの表現方法と組み合わせ方を理解する。
- ロギングのドキュメントにアクセスして、リクエストログをクエリする方法と、ブロックされたリクエストを確認する。