デュアル トークン認証を使用する

閲覧者がストリーミング リソースにアクセスするときにデュアル トークン認証を適用するには、個別のルートを構成します。ルートは、Media CDN のリクエストと一致し、HTTP トラフィックを送信元に転送する構成です。Media CDN は、HTTP Live Streaming(HLS)リソースまたは Dynamic Adaptive Streaming over HTTP(DASH)リソースのルートをサポートしています。Media CDN のルートの詳細については、サービスルートの構成をご覧ください。

HLS ストリームの場合、Media CDN は Cookie と URL クエリ パラメータ(Cookie なし)によるデュアル トークン認証をサポートします。DASH ストリームの場合、Media CDN は Cookie ベースのデュアル トークン認証のみをサポートします。

このページでは、デュアル トークン認証を使用してコンテンツを保護するための Media CDN ルートの構成方法について説明します。

始める前に

手順は次のとおりです。

  1. 短期トークンの場合は、次のいずれかの署名アルゴリズムを選択します。

    • Ed25519 署名
    • 対称鍵ハッシュベースのメッセージ認証コード(HMAC)

    対称 HMAC 署名アルゴリズムは、新しい長期トークンを生成するように構成されたルートでのみ有効にできます。最適なパフォーマンスとセキュリティのために Ed25519 署名を使用し、対称鍵 HMAC は、他の CDN との互換性のために必要な場合にのみ使用することをおすすめします。

  2. 必要な鍵を EdgeCacheKeyset リソースに含めます。

    トークンは、EdgeCacheKeyset リソースの鍵で署名または検証される必要があります。鍵セットに、選択した署名アルゴリズムの正しい鍵が含まれている必要があります。次の表に、各署名アルゴリズムと必要な鍵を示します。

    署名アルゴリズム 鍵セット内の必要な鍵
    Ed25519 公開鍵
    HMAC-SHA1 共有検証鍵
    HMAC-SHA256 共有検証鍵

    ベスト プラクティスとして、短期トークン用と長期トークン用の 2 つの別々の鍵セットを作成します。

    ただし、DASH と 動的 Media Presentation Description(MPD)ファイルを使用している場合は、長期トークンと短期トークンの両方に同じ鍵セットを使用する必要があります。

  3. 長期トークンの場合は、次のいずれかのトークン形式を選択します。

    • Cookie
    • URL クエリ パラメータ

短期トークンを設定する

使用する署名アルゴリズムに応じて、次のいずれかのオプションを使用して短期トークンを設定します。

Ed25519 署名

  1. 秘密鍵を生成します。

    openssl genpkey -algorithm ed25519 -outform PEM -out SSL_KEY_NAME.private.key
    

    SSL_KEY_NAME は、鍵名で置き換えます。

  2. 秘密鍵から公開鍵を生成します。

    openssl pkey -outform DER -pubout -in SSL_KEY_NAME.private.key |\
    tail -c +13 |\
    python3 -c "import base64, sys; print(('%s' % base64.urlsafe_b64encode(sys.stdin.buffer.read()))[2:-1])"
    
  3. 単一の公開鍵を持つ新しい鍵セットを作成します。

    コンソール

    1. Google Cloud コンソールで、[Media CDN] ページに移動します。

      Media CDN に移動

    2. [鍵セット] タブをクリックします。

    3. [鍵セットを作成] をクリックします。

    4. [名前] に、一意の鍵セット名を入力します。

    5. 省略可: [説明] に、鍵セットの説明を入力します。

    6. 省略可: [ラベルを追加] をクリックして、鍵セットの Key-Value ペアを 1 つ以上入力します。

    7. [公開鍵を追加] をクリックして、次の操作を行います。

      1. [ID] に英数字の ID を入力します。
      2. [値を入力] を選択し、Ed25519 公開鍵の base64 でエンコードされた値を指定します。
    8. [鍵セットを作成] をクリックします。

    gcloud

    gcloud edge-cache keysets create コマンドを使用します。

    gcloud edge-cache keysets create SHORT_KEYSET_NAME \
      --public-key='id=SSL_PUBLIC_KEY_NAME,value=SSL_PUBLIC_KEY_VALUE'
    

    次のように置き換えます。

    • SHORT_KEYSET_NAME: 一意の鍵セット名(例: prod-vod-keyset
    • SSL_PUBLIC_KEY_NAME: SSL 公開鍵の名前
    • SSL_PUBLIC_KEY_VALUE: SSL 公開鍵の値

    鍵セットに関連付けられている鍵を確認するには、gcloud edge-cache keysets describe コマンドを使用します。

    gcloud edge-cache keysets describe prod-vod-keyset
    

    出力は次のようになります。

    name: prod-vod-keyset
    description: "Keyset for prod.example.com"
    publicKeys:
    - id: "key-20200918"
      value: "DThVLjhAKm3VYOvLBAwFZ5XbjVyF98Ias8NZU0WEM9w"
    - id: "key-20200808"
      value: "Lw7LDSaDUrbDdqpPA6JEmMF5BA5GPtd7sAjvsnh7uDA="
    

    Terraform

    resource "google_network_services_edge_cache_keyset" "default" {
      name        = "prod-vod-keyset"
      description = "Keyset for prod.example.com"
      public_key {
        id    = "key-20200918"
        value = "FHsTyFHNmvNpw4o7-rp-M1yqMyBF8vXSBRkZtkQ0RKY" # Update Ed25519 public key
      }
      public_key {
        id    = "key-20200808"
        value = "Lw7LDSaDUrbDdqpPA6JEmMF5BA5GPtd7sAjvsnh7uDA=" # Update Ed25519 public key
      }
    }

対称鍵 HMAC

  1. Secret Manager を初めて使用する場合は、Secret Manager を構成します。

  2. シークレットを作成します

  3. バイナリ形式のシークレット バージョンを追加します。

  4. Secret Manager アクセスロールroles/secretmanager.secretAccessor)を Media CDN サービス アカウントに付与します。

    コンソール

    1. Google Cloud コンソールで、[Secret Manager] ページに移動します。

      Secret Manager に移動

    2. シークレットの名前の横にあるチェックボックスをオンにします。

    3. [情報パネルを表示] をクリックします。

    4. 情報パネルで [プリンシパルを追加] をクリックします。

    5. [新しいプリンシパル] に、Media CDN サービス アカウントを次の形式で入力します。

      service-PROJECT_NUMBER@gcp-sa-mediaedgefill.iam.gserviceaccount.com
      

      PROJECT_NUMBER は、使用するプロジェクト番号に置き換えます。

    6. [ロールを選択] で [Secret Manager] を選択し、[Secret Manager のシークレット アクセサー] を選択します。

    gcloud

    gcloud secrets add-iam-policy-binding コマンドを使用する

    gcloud secrets add-iam-policy-binding projects/PROJECT_NUMBER/secrets/SECRET_ID \
      --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-mediaedgefill.iam.gserviceaccount.com" \
      --role="roles/secretmanager.secretAccessor"
    

    次のように置き換えます。

    • PROJECT_NUMBER: プロジェクトの番号
    • SECRET_ID: シークレットの ID
  5. シークレット バージョンにアクセスし、バージョン番号を含むシークレットのパスをコピーします。

  6. 検証の共有鍵で共有シークレットを含む新しい鍵セットを作成します。

    コンソール

    1. Google Cloud コンソールで、[Media CDN] ページに移動します。

      Media CDN に移動

    2. [鍵セット] タブをクリックします。

    3. [鍵セットを作成] をクリックします。

    4. [名前] に、一意の鍵セット名を入力します。

    5. 省略可: [説明] に、鍵セットの説明を入力します。

    6. 省略可: [ラベルを追加] をクリックして、鍵セットの Key-Value ペアを 1 つ以上入力します。

    7. 検証の共有キーを指定するには、[検証の共有キーを追加] をクリックして、次の操作を行います。

      1. [シークレット] で、リストからシークレットを選択し、リソース ID を指定して手動でシークレットを入力するか、新しいシークレットを作成して選択します。

      2. [シークレットのバージョン] で、リストからシークレット バージョンを選択するか、新しいシークレット バージョンを作成して選択します。

    8. [鍵セットを作成] をクリックします。

    gcloud

    gcloud edge-cache keysets create コマンドを使用します。

    gcloud edge-cache keysets create SHORT_KEYSET_NAME \
      --validation-shared-key='secret_version=projects/PROJECT_NUMBER/secrets/SECRET_ID/versions/KEY_VERSION'
    

    次のように置き換えます。

    • SHORT_KEYSET_NAME: 鍵セットの一意の名前(例: prod-vod-keyset
    • PROJECT_NUMBER: プロジェクト ID
    • SECRET_ID: シークレットのリソース ID
    • KEY_VERSION: 使用するシークレットのバージョン

長期トークンを設定する

Google が管理する鍵は、鍵セットでスコープを設定されます。つまり、2 つの異なる鍵セットには、Google が管理する異なる鍵があります。Google が管理する鍵は定期的にローテーションされます。

次のいずれかの方法で、長期トークンを設定します。

コンソール

  1. 鍵セットを作成または変更します

  2. [] セクションで、[デュアル トークン認証に Google が管理する鍵を使用する] を選択します。

gcloud と YAML

以下のいずれかの方法を選択します。

  • Google が管理する署名鍵を作成します。

    gcloud edge-cache keysets create LONG_KEYSET_NAME \
        --public-key='id=google-managed-key,managed=true'
    

    LONG_KEYSET_NAME は、キー名(例: prod-vod-keyset-long)に置き換えます。

  • 既存の鍵セットを変更します。

    1. 鍵セットを YAML ファイルにエクスポートします。gcloud edge-cache keysets export コマンドを使用します。

      gcloud edge-cache keysets export LONG_KEYSET_NAME \
         --destination=prod-vod-keyset-long.yaml
      
    2. テキスト エディタまたは構成管理ツールで、鍵セットの構成を次のように編集します。

      name: projects/my-project/locations/global/edgeCacheKeysets/LONG_KEYSET_NAME
      publicKeys:
      - id: some-key
        value: MC4CAQAwBQYDK2VwBCIEINV2iYugIWBuvGBJUQ_Ab69E4v4zcVqvgYHw-iZxGzcd
      - id: google-managed-key
        managed: true
      
    3. 編集した鍵セットをインポートします。gcloud edge-cache keysets import コマンドを実行します。

      gcloud edge-cache keysets import LONG_KEYSET_NAME \
          --source=prod-vod-keyset-long.yaml
      

長期トークン鍵セットには、追加の公開鍵を含めることができます。鍵セットに設定できる公開鍵は 3 つまでです。実際には、鍵セットにはユーザーが管理する鍵を 2 つ、Google が管理する鍵を 1 つ含めることができます。

Media CDN は、常に Google が管理する鍵を使用してトークンを生成します。 ユーザーが管理する鍵は検証にのみ使用できます。

追加の公開鍵を指定すると、独自の秘密鍵によって生成された署名付きリクエストを使用して、プレーヤー アプリケーションでメディア再生リストとメディア セグメントにアクセスできるようになります。

トークン交換を構成する

このセクションでは、複数のルートを作成してトークン交換を構成する方法について説明します。 ルートを使用すると、コンテンツの種類、クライアント属性、鮮度の要件に基づいて動作を最適化できます。次の例では、ルートを使用してメディア リクエストの各部分のトークン交換を構成します。

短期トークンを要求するようにプライマリ マニフェスト ルートを構成する

プライマリ マニフェスト ルートで短期トークンを要求するように Media CDN を構成します。

Console

プライマリ マニフェスト ルートで短期トークン認証を有効にします。

  1. Google Cloud コンソールで、[Media CDN] ページに移動します。

    Media CDN に移動

  2. サービスの [詳細] ページを開くには、サービス名をクリックします。

  3. 編集モードに切り替えるには、[編集] ボタンをクリックします。

  4. [ルーティング] セクションに移動するには、[次へ] をクリックします。

  5. プライマリ マニフェスト ルートルールを追加するホストルールを展開します。

  6. [ルートルールを追加] をクリックします。

    または、ルートルールを編集するには、それぞれの行で [編集] をクリックします。

  7. [ルートルールを編集] ペインの [優先度] に、値(例: 1)を設定します。

  8. [説明] には、ルールのリストでルールを識別できる簡単な説明を入力します。

  9. [一致] セクションで、[一致条件を追加] をクリックします。次に、以下の操作を行います。

    1. [一致タイプ] で、[パス テンプレートの一致] を選択します。
    2. [パスの一致] では、HLS プライマリ再生リスト(M3U8)または DASH マニフェスト(MPD)ファイルの名前またはパス テンプレートを指定します。詳細については、パスマッチングをご覧ください。
  10. [詳細構成] をクリックします。

  11. [ルート アクション] セクションで、[項目を追加] をクリックします。

  12. [タイプ] で [CDN ポリシー] を選択します。

  13. [署名付きリクエスト] セクションの [署名付きリクエスト モード] で、[トークンを要求] を選択します。

  14. [署名付きリクエスト鍵セット] セクションで、次の操作を行います。

    1. 短期トークンの鍵セットを指定するには、[鍵セットを選択] をクリックして、短期トークン鍵セットを選択します。

      または、必要な鍵を持つ新しい鍵セットを作成するには、[新しい鍵セットを作成] をクリックします。次にそれを選択します。

    2. [署名アルゴリズム] で、[公開鍵を使用した Ed25519] を選択します。

    3. [トークン クエリ パラメータ] は、デフォルト値 edge-cache-token のままにします。

      または、認証に Cookie ではなく HLS マニフェスト URL クエリ パラメータを使用する場合は、リクエスト トークンを保存するパラメータを指定します。

    4. [最大有効期間] で、受信リクエスト トークンの最大存続期間を秒単位で指定します。

  15. [ルート アクション] セクションで変更を保存するには、[完了] をクリックします。

  16. ルートルールの変更を保存するには、[保存] をクリックします。

gcloud と YAML

  1. YAML ファイルに Media CDN 構成をエクスポートします。gcloud edge-cache services export コマンドを使用します。

    gcloud edge-cache services export SERVICE_NAME \
        --destination=FILENAME.yaml
    

    次のように置き換えます。

    • SERVICE_NAME: サービスの名前
    • FILENAME : YAML ファイルの名前
  2. プライマリ マニフェスト ルートルールで短期トークン認証を有効にするには、YAML ファイルのルートの cdnPolicy セクションで、signedTokensOptions 構成を指定します。

      pathMatchers:
      - name: "ROUTE_NAME"
        routeRules:
        - priority: 1
          description: "ROUTE_DESCRIPTION"
          origin: "ORIGIN_NAME"
          matchRules:
          - pathTemplateMatch: "/MANIFEST_OR_PLAYLIST"
          routeAction:
            cdnPolicy:
              cacheMode: CACHE_ALL_STATIC
              signedRequestMode: REQUIRE_TOKENS
              signedRequestKeyset: SHORT_KEYSET_NAME
              signedRequestMaximumExpirationTtl: SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME
              signedTokenOptions:
                tokenQueryParameter: SHORT_TOKEN_NAME
    

    次のように置き換えます。

    • ROUTE_NAME: ルートルールの名前
    • ROUTE_DESCRIPTION: ルートルールの説明
    • ORIGIN_NAME: 送信元の名前
    • MANIFEST_OR_PLAYLIST: HLS プライマリ再生リスト(M3U8)または DASH マニフェスト(MPD)ファイルの名前。詳細については、パスマッチングをご覧ください。
    • SHORT_KEYSET_NAME: 短期トークンに使用する鍵セット名
    • SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME: 署名付きリクエストの有効期限(例: 600s)。詳細については、signedRequestMaximumExpirationTtl ご覧ください。
    • 省略可: SHORT_TOKEN_NAME: 短いトークンを検索するクエリ パラメータ。デフォルト値は edge-cache-token です。詳細については、SignedTokenOptions をご覧ください。

    対称鍵 HMAC を使用する場合は、signedTokenOptions セクションで値を HMAC_SHA_256 として allowedSignatureAlgorithms を追加します。

           allowedSignatureAlgorithms:
           - HMAC_SHA_256
    
  3. サービスを更新するには、YAML ファイルから Media CDN の構成をインポートします。gcloud edge-cache services import コマンドを使用します。

    gcloud edge-cache services import SERVICE_NAME \
        --source=FILENAME.yaml
    

これで、単一トークン認証を有効にするプロセスが完了しました。

デュアル トークン認証を構成するには、以降のセクションに進みます。

長期トークンを生成するようにプライマリ マニフェスト ルートルールを構成する

プライマリ マニフェスト ルートで長期トークンを生成するように Media CDN を構成します。Cookie または URL のクエリ パラメータを選択して、これらのトークンを生成します。

Console

Media CDN がルートに長期トークンを生成できるように、プライマリ マニフェスト ルートルールを変更します。

  1. [ルートルールを編集] ページで、[詳細構成] をクリックします。
  2. [タイプ] で [CDN ポリシー] を選択します。
  3. [デュアル トークン認証] を開きます。
  4. [署名アクション] で [新しい長期トークンを生成する] を選択します。
  5. [署名タイプ] で、次のいずれかのオプションを選択します。

    • Cookie 経由(HLS と DASH ストリーミングの場合): プライマリ マニフェスト レスポンスを含む Edge-Cache-Cookie を返すように Media CDN を構成します。
    • HLS マニフェスト URL クエリ パラメータ経由(Cookie なし): 各 URL に長期トークンを追加して、HLS プライマリ マニフェストを操作するように Media CDN を構成します。
  6. [新しい長期トークンを生成する] セクションで、次の操作を行います。

    1. 長期トークンの鍵セットを指定するには、[鍵セットを選択] をクリックして、長期トークン鍵セットを選択します。

      あるいは、[新しい鍵セットを作成] をクリックして、必要な鍵を持つ新しい鍵セットを作成します。次にそれを選択します。

    2. [トークン TTL] で、長期トークンの最大有効期間を秒単位で指定します。

    3. [署名タイプ] で、[Cookie 経由] オプションを選択した場合は、[コピーされたパラメータ] セクションで、Media CDN に短期トークンから長期トークンにコピーさせるパラメータを選択します。デュアル トークン認証を使用するには、PathGlobs(またはそのエイリアス、acl または paths のいずれか)または URLPrefix を選択する必要があります。

      [HLS マニフェスト URL クエリ パラメータ経由] オプションを選択した場合は、[トークン クエリ パラメータ] でデフォルト値の edge-cache-token をそのまま使用します。

  7. [ルート アクション] セクションで変更を保存するには、[完了] をクリックします。

  8. ルートルールの変更を保存するには、[保存] をクリックします。

    メディア再生リストとセグメントのルートを自動または手動で作成するかどうかを尋ねるメッセージが表示されます。自動オプションを選択すると、Cookie 署名用に 1 つの新しいルートが作成され、Cookie を使用しない署名用に 2 つのルートが作成されます。手動オプションを選択した場合は、次のセクションに進みます。

gcloud と YAML

Media CDN がルートで長期トークンを生成できるように、プライマリ マニフェスト ルートルールの addSignatures セクションを変更します。

Cookie

          addSignatures:
            actions:
              - GENERATE_COOKIE
            keyset: LONG_KEYSET_NAME
            tokenTtl: TOKEN_EXPIRATION_TIME
            copiedParameters:
              - PathGlobs
              - SessionID

次のように置き換えます。

  • LONG_KEYSET_NAME: 長期トークン鍵セットの名前

  • TOKEN_EXPIRATION_TIME: 長期トークンの有効期限。たとえば、1 日の有効期限の場合は 86400s

このサンプルコードでは、次の変更を実装します。

  • addSignatures.actions: GENERATE_COOKIE: プライマリ マニフェスト レスポンスで Edge-Cache-Cookie を返すように Media CDN を構成します。

  • copiedParameters.PathGlobs: PathGlobs を短期トークンから長期トークンにコピーするように Media CDN を構成します。デュアル トークン認証を使用するには、copiedParameters.PathGlobs または copiedParameters.URLPrefix を使用する必要があります。詳細については、copiedParameters をご覧ください。

  • 省略可: copiedParameters.SessionID: 短期トークンから長期トークンに SessionID をコピーするように Media CDN を構成する

GENERATE_COOKIE アクションが適用されると、Media CDN はプライマリ マニフェスト レスポンスとともに次のような Set-Cookie ヘッダーを返します。

Set-Cookie: Edge-Cache-Cookie=PathGlobs=PATHS~SessionID=SESSION_ID~Expires=EXPIRATION~_GO=Generated~Signature=SIGNATURE

URL クエリ パラメータ

          addSignatures:
            actions:
              - GENERATE_TOKEN_HLS_COOKIELESS
            keyset: LONG_KEYSET_NAME
            tokenTtl: TOKEN_EXPIRATION_TIME
            copiedParameters:
              - PathGlobs
              - SessionID
            tokenQueryParameter: LONG_TOKEN_NAME

次のように置き換えます。

  • LONG_KEYSET_NAME: 長期鍵セットの名前

  • TOKEN_EXPIRATION_TIME: 長期トークンの有効期限。たとえば、1 日の有効期限の場合は 86400s

このサンプルコードでは、次の変更を実装します。

  • addSignatures.actions: GENERATE_TOKEN_HLS_COOKIELESS: 存在する各 URI に長期トークンを追加して、HLS プライマリ マニフェストを操作するように Media CDN を構成します。

  • copiedParameters.PathGlobs: PathGlobs を短期トークンから長期トークンにコピーするように Media CDN を構成します。デュアル トークン認証を使用するには、copiedParameters.PathGlobs または copiedParameters.URLPrefix のいずれかを使用する必要があります。詳細については、copiedParameters をご覧ください。

  • 省略可: copiedParameters.SessionID: 短期トークンから長期トークンに SessionID をコピーするように Media CDN を構成します。

  • 省略可: LONG_TOKEN_NAME: 生成された長期トークンを配置するクエリ パラメータ。デフォルト値は edge-cache-token です。詳細については、tokenQueryParameter をご覧ください。

次のマニフェスト ファイルは、適用された GENERATE_TOKEN_HLS_COOKIELESS アクションを示しています。

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=1280000,AVERAGE-BANDWIDTH=1000000
http://example.com/HLS_PRIMARY_PLAYLIST.m3u8?LONG_TOKEN_NAME=PathGlobs=PATHS~SessionID=SESSION_ID~Expires=EXPIRATION~_GO=Generated~Signature=SIGNATURE

Media CDN は、短期トークンを検証し、長期トークンを生成して LONG_TOKEN_NAME クエリ パラメータに保存します。

長期トークンを要求するようにメディア再生リストとセグメント ルートを構成する

長期トークンを要求するようにメディア再生リストとセグメント ルートを構成します。

Console

Cookie

メディア再生リストとセグメント ルートのルートルールを作成します。

  1. [エッジキャッシュ サービスを編集] ページの [ルーティング] セクションで、プライマリ マニフェスト ルートを持つホストルールをクリックします。
  2. [ルートルールを追加] をクリックします。
  3. [ルートルールを編集] ペインの [優先値] に、プライマリ マニフェスト ルートより大きい値(例: 2)を設定します。 値が高いほど、優先度は低くなります。
  4. [説明] には、ルールのリストでルールを識別できる簡単な説明を入力します。
  5. 次のフィールドを推奨に従って設定します。

    • 送信元を選択: プライマリ マニフェスト ルートルールと同じ
    • 一致条件を追加: プライマリ マニフェスト ルートルールと同じ
    • タイプ: CDN ポリシー
    • 署名付きリクエスト モード: トークンを要求
    • 鍵セットを選択: 長期トークンと同じ
    • 署名アルゴリズム: プライマリ マニフェスト ルートルールと同じ
  6. [デュアル トークン認証] を開きます。

  7. [署名アクション] は、デフォルト値の [なし] のままにします。

  8. [完了] をクリックし、[保存] をクリックします。

URL クエリ パラメータ

  1. メディア再生リストのルートルールを作成します。

    1. [エッジキャッシュ サービスを編集] ページの [ルーティング] セクションで、プライマリ マニフェスト ルートを持つホストルールをクリックします。
    2. [ルートルールを追加] をクリックします。
    3. [ルートルールを編集] ペインの [優先値] に、プライマリ マニフェスト ルートより大きい値(例: 2)を設定します。値が高いほど、優先度は低くなります。
    4. [説明] には、ルールのリストでルールを識別できる簡単な説明を入力します。
    5. 次のフィールドを推奨に従って設定します。

      • 送信元を選択: プライマリ マニフェスト ルートルールと同じ
      • 一致条件を追加: プライマリ マニフェスト ルートルールと同じ
      • タイプ: CDN ポリシー
      • 署名付きリクエスト モード: トークンを要求
      • 鍵セットを選択: 長期トークンと同じ
      • 署名アルゴリズム: プライマリ マニフェスト ルートルールと同じ
      • トークン クエリ パラメータ: 長期トークンと同じ
    6. [デュアル トークン認証] を開きます。

    7. [署名アクション] で [既存の長期トークンを伝播] を選択します。

      このオプションは、HLS マニフェスト URL クエリ パラメータ(Cookie なし)経由の署名タイプを使用して長期トークンが生成されたことを Media CDN が確認した後にのみ有効になります。

    8. [トークン クエリ パラメータ] は、デフォルト値 edge-cache-token のままにします。

    9. [完了] をクリックし、[保存] をクリックします。

  2. メディア セグメントのルートルールを作成します。

    このルートはメディア再生リストのルートと似ていますが、主な違いは次のとおりです。

    • [優先度] には、メディア再生リストのルートルールよりも大きい値を設定します(例: 3)。
    • [説明] には、ルールのリストでルールを識別できる簡単な説明を入力します。
    • [デュアルトークン認証] セクションの [署名アクション] で、デフォルト値の [なし] のままにします。

gcloud と YAML

YAML ファイルを編集します。

Cookie

長期 Cookie を要求するようにメディア再生リストとセグメントを設定します。

    - priority: 2
      description: "SEGMENTS_ROUTE_DESCRIPTION"
      origin: "ORIGIN_NAME"
      matchRules:
      - pathTemplateMatch: "/**.m3u8" # HLS media playlists
      - pathTemplateMatch: "/**.ts" # HLS segments
      - pathTemplateMatch: "/**.m4s" # DASH / CMAF segments
      routeAction:
        cdnPolicy:
          cacheMode: CACHE_ALL_STATIC
          signedRequestMode: REQUIRE_TOKENS
          signedRequestKeyset: LONG_KEYSET_NAME

SEGMENTS_ROUTE_DESCRIPTION はルートの説明に置き換えます。

このサンプルコードでは、次の変更を実装します。

  • priority: 2: ルートの優先度。値が高いほど、優先度は低くなります。メディア再生リストとメディア セグメントのルートは .m3u8 で終わるファイル名と一致するため、ルートの優先度はプライマリ マニフェスト用に作成したルートよりも低くする必要があります。
  • signedRequestMode: REQUIRE_TOKENS: メディア 再生リストとメディア セグメントにトークンを適用します。静的 Media Presentation Description(MPD)ファイルを使用している場合、長期と短期の鍵セットが異なる場合があります。動的 MPD ファイルを使用している場合は、長期と短期の鍵セットを同じにする必要があります。
  • signedRequestKeyset: LONG_KEYSET_NAME: Media CDN は、長期鍵セットを使用して、メディア再生リストとメディア セグメントのリクエストに対してユーザー エージェントが提供する長期 Cookie を検証します。

URL クエリ パラメータ

2 つのルート構成を追加します。

  1. 長期トークンを伝播するように HLS メディア マニフェストのルートを構成します。

       - priority: 2
         description: "PLAYLIST_ROUTE_DESCRIPTION"
         origin: "ORIGIN_NAME"
         matchRules:
         - pathTemplateMatch: "/**.m3u8" # HLS media playlists
         routeAction:
           cdnPolicy:
           cacheMode: CACHE_ALL_STATIC
           signedRequestMode: REQUIRE_TOKENS
           signedRequestKeyset: LONG_KEYSET_NAME
           addSignatures:
             actions:
             - PROPAGATE_TOKEN_HLS_COOKIELESS
    

    PLAYLIST_ROUTE_DESCRIPTION はルートの説明に置き換えます。

    このサンプルコードでは、次の変更を実装します。

    • priority: 2: ルートの優先度。値が高いほど、優先度は低くなります。メディア再生リストのルートは .m3u8 で終わるファイル名と一致するため、ルートの優先度はプライマリ マニフェスト用に作成したルートよりも低くする必要があります。
    • signedRequestMode: REQUIRE_TOKENS: メディア 再生リストとメディア セグメントにトークンを適用します。静的 Media Presentation Description(MPD)ファイルを使用している場合、長期と短期の鍵セットが異なる場合があります。動的 MPD ファイルを使用している場合は、長期と短期の鍵セットを同じにする必要があります。
    • signedRequestKeyset: LONG_KEYSET_NAME: Media CDN は、長期鍵セットを使用して、メディア再生リストとメディア セグメントのリクエストに対してユーザー エージェントが提供する長期 Cookie を検証します。
    • addSignatures.actions: PROPAGATE_TOKEN_HLS_COOKIELESS: 長期トークンをメディア再生リストのメディア セグメントの URI にコピーするように Media CDN を構成します。
  2. 長期トークンを要求するようにセグメント ルートを構成します。

       - priority: 3
         description: "SEGMENTS_ROUTE_DESCRIPTION"
         origin: "ORIGIN_NAME"
         matchRules:
         - pathTemplateMatch: "/**.ts" # HLS segments
         routeAction:
           cdnPolicy:
             cacheMode: CACHE_ALL_STATIC
             signedRequestMode: REQUIRE_TOKENS
             signedRequestKeyset: LONG_KEYSET_NAME
    

    SEGMENTS_ROUTE_DESCRIPTION はルートの説明に置き換えます。

    このサンプルコードでは、次の変更を実装します。

    • priority: 3: ルートの優先度。値が高いほど、優先度は低くなります。このルートの優先度は、メディア再生リスト用に以前に作成したルートよりも低くする必要があります。
    • signedRequestMode: REQUIRE_TOKENS: メディア再生リストとメディア セグメントにトークンを適用します。
    • signedRequestKeyset: LONG_KEYSET_NAME: Media CDN は、長期鍵セットを使用して、メディア再生リストとメディア セグメントのリクエストに対してユーザー エージェントが提供する長期署名付きトークンを検証します。

例: 構成ファイル

次のコードサンプルは完成した構成ファイルを示しています。

Cookie

name: SERVICE_NAME
routing:
  hostRules:
  - hosts:
    - DOMAIN_NAME
    pathMatcher: routes
  pathMatchers:
    - name: "ROUTE_NAME"
      routeRules:
      - priority: 1
        description: "ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/HLS_MASTER_PLAYLIST.m3u8" # HLS primary playlists
        - pathTemplateMatch: "/DASH_MANIFESTS.mpd" # DASH manifests
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: SHORT_KEYSET_NAME
            signedRequestMaximumExpirationTtl: SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME
            addSignatures:
              actions:
                - GENERATE_COOKIE
              keyset: LONG_KEYSET_NAME
              tokenTtl: TOKEN_EXPIRATION_TIME
              copiedParameters:
                - PathGlobs
                - SessionID
      - priority: 2
        description: "SEGMENTS_ROUTE_DESCRIPTION"
        origin: "ORIGN_NAME"
        matchRules:
        - pathTemplateMatch: "/**.m3u8" # HLS media playlists
        - pathTemplateMatch: "/**.ts" # HLS segments
        - pathTemplateMatch: "/**.m4s" # DASH / CMAF segments
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: LONG_KEYSET_NAME

URL クエリ パラメータ

name: SERVICE_NAME
routing:
  hostRules:
  - hosts:
    - DOMAIN_NAME
    pathMatcher: routes
  pathMatchers:
    - name: "ROUTE_NAME"
      routeRules:
      - priority: 1
        description: "ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/HLS_PRIMARY_PLAYLIST.m3u8" # HLS primary playlists
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: SHORT_KEYSET_NAME
            signedRequestMaximumExpirationTtl: SIGNED_REQUEST_MAXIMUM_EXPIRATION_TIME
            signedTokenOptions:
              tokenQueryParameter: SHORT_TOKEN_NAME
            addSignatures:
              actions:
                - GENERATE_TOKEN_HLS_COOKIELESS
              keyset: LONG_KEYSET_NAME
              tokenTtl: TOKEN_EXPIRATION_TIME
              tokenQueryParameter: LONG_TOKEN_NAME
              copiedParameters:
                - PathGlobs
                - SessionID
      - priority: 2
        description: "PLAYLIST_ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/**.m3u8" # HLS media playlists
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: LONG_KEYSET_NAME
            addSignatures:
              actions:
                - PROPAGATE_TOKEN_HLS_COOKIELESS
      - priority: 3
        description: "SEGMENTS_ROUTE_DESCRIPTION"
        origin: "ORIGIN_NAME"
        matchRules:
        - pathTemplateMatch: "/**.ts" # HLS segments
        routeAction:
          cdnPolicy:
            cacheMode: CACHE_ALL_STATIC
            signedRequestMode: REQUIRE_TOKENS
            signedRequestKeyset: LONG_KEYSET_NAME

アプリケーション サーバーで短期トークンを生成する

トークンの生成の詳細については、トークンを生成するをご覧ください。

多層防御のコンテンツ保護を適用する

ベストプラクティスとして、送信元の認証は次のように有効にすることをおすすめします。