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

視聴者がストリーミング リソースにアクセスするときにデュアルトークン認証を適用するには、個別のルートを構成します。ルートは、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 署名を使用し、他の CDN との互換性が必要な場合にのみ対称鍵 HMAC を使用することをおすすめします。

  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 つの公開鍵を持つ新しい Keyset を作成します。

    コンソール

    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. Media CDN サービス アカウントに Secret Manager アクセス ロールroles/secretmanager.secretAccessor)を付与します。

    コンソール

    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. [Max time to live] で、受信リクエスト トークンの最大存続時間を秒単位で指定します。

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

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

gcloud と YAML

  1. Media CDN 構成を YAML ファイルにエクスポートします。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. [署名アクション] は、デフォルト値の [None] のままにします。

  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

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

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

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

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