CloudFront の署名付き URL または署名付き Cookie に関連する問題をトラブルシューティングする方法を教えてください。

所要時間3分
0

Amazon CloudFront と署名付き URL または署名付き Cookie を使用してプライベートコンテンツを保護しています。しかし、403 アクセス拒否エラーが表示されます。

解決策

Amazon CloudFront で署名付き URL または署名付き Cookie に関する問題が発生した場合、403 アクセス拒否エラーが表示される可能性があります。

署名付き URL または署名付き Cookie に正しい署名者が含まれていない

動作の [Restrict Viewer Access] (閲覧者のアクセス制限) をオンにする場合は、署名者を決定する必要があります。署名者は、CloudFront で作成した信頼されたキーグループ、または CloudFront キーペアを含む AWS アカウントのいずれかです。次の 403 エラーメッセージは、署名者情報がないか、正しくないことを示しています。

エラーには、「Missing Key Pair-ID query parameter or cookie value」(Key-Pair-Id クエリパラメータまたは Cookie 値が見つかりません) というメッセージが含まれます。

このメッセージは、署名付き URL を使用しているときに Key-Pair-Id クエリパラメータがないか空であることを示しています。または、署名付き cookie に CloudFront-Key-Pair-ID クエリ文字列パラメータがないことを示します。

エラーには「Unknown Key」(不明なキー) というメッセージが含まれます。

このメッセージは、CloudFront が Key-Pair-ID (署名付き URL の場合) または CloudFront-Key-Pair-ID (署名付き cookie の場合) を使用して署名者情報を検証できないことを示しています。この問題を解決するには、署名付き URL に正しい Key-Pair-ID 値が使用されているか、署名付き cookie に CloudFront-Key-Pair-ID が使用されていることを確認します。

署名付き URL を使用する場合は、Key-Pair-ID の値を調べて書き留めてください。

-または-

署名付き cookie を使用する場合は、CloudFront-Key-Pair-ID の値を見つけて書き留めておいてください。

次に、Key ID を見つけて、それが Key-Pair-ID または CloudFront-Key-Pair-ID と一致することを確認します。

1.    CloudFront コンソールを開きます。ナビゲーションメニューで、[Distributions] (ディストリビューション) を選択します。

2.    ディストリビューションを選択します。次に、[Behaviors] (動作) タブを選択します。

3.    動作名を選択し、[Edit] (編集) を選択します。

4.    [Ristrict viewer access] (閲覧者のアクセスを制限) 設定を見つけます。  : [Yes] (はい) に設定されている場合、このキャッシュ動作のパスパターンに一致するファイルへのリクエストには、署名付き URL または署名付き cookie を使用する必要があります。

5.    [Restrict vew access] (表示アクセスを制限) フィールドが [Yes] (はい) に設定されていることを確認したら、[Trusted authorization type] (信頼された認証タイプ) フィールドを確認します。

6.    [Trusted authorization type] (信頼された認証タイプ) の値設定が [Trusted key groups] (信頼されたキーグループ) である場合は、信頼キーグループの名前を書き留めます。
信頼キーグループのパブリックキー ID を検索してください。
CloudFront コンソールを開きます。[Key Groups] (キーグループ) を選択します。
キーグループのリストで、メモしておいた信頼されたキーグループの名前を選択します。
ステップ 1 でメモした Key-Pair-Id または CloudFront-Key-Pair-Id の値が、信頼されたキーグループのパブリックキー ID のいずれかと一致することを確認します。

7.    [Trusted authorization] (信頼された認証) タイプが [Trusted Signer] (信頼された署名者) である場合は、CloudFront は AWS が生成する認証情報を使用します。この場合、ステップ 1 でメモした Key-Pair-Id または CloudFront-Key-Pair-Id の値は、CloudFront 認証情報のアクセスキー ID と一致する必要があります。  CloudFront 認証情報の**[Access Key ID]** (アクセスキー ID) を確認するには、「署名者のキーペアの作成」を参照してください。

署名付き URL または署名付き cookie が有効な時刻に送信されない

署名付き URL または署名付き cookie を作成するとき、JSON 形式のポリシーステートメントは署名付き URL の制限を指定します。このステートメントは、URL の有効期間を決定します。CloudFront は、以下のいずれかのシナリオで 403 アクセス拒否エラーを返します。

  • 既定ポリシーを使用する署名付き URL の Expires 値よりも大きい署名付き URL が送信されます。
  • 署名付き cookie は、既定ポリシーを使用する署名 cookie の CloudFront-Expires 値よりも大きい時点で送信されます。
  • 署名付き URL または署名付き cookie は、カスタムポリシーの DateLessThan 値よりも大きい時点で送信されます。または、DateGreaterThan 値よりも小さい時点で送信されます。

**注:**ExpiresCloudFront-ExpiresDateLessThan、および DateGreaterThan 値は Unix 時間形式 (秒単位) および協定世界時 (UTC) です。例えば、2013 年 1 月 1 日の午前 10 時 (UTC) は Unix 時間形式では 1357034400 に変換されます。エポックタイムを使用する場合は、2147483647 (2038 年 1 月 19 日 03:14:07 UTC) までの日付に 32 ビットの整数を使用してください。

署名付き URL の Policy パラメータ、または署名付き cookie の CloudFront-Policy 属性は、カスタムポリシーを使用していることを示しています。ポリシーステートメントは JSON 形式で、base64 でエンコードされています。DateLessThan または DateGreaterThan の値を確認するには、64base デコードコマンドを使用してください。

base64 でエンコードされたカスタムポリシーの例:

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

base64 でエンコードされた形式のカスタムポリシーを JSON 形式にデコードするには、次の Linux コマンドを実行します。この例では、前の例の値を使用します。ポリシー値を独自のカスタムポリシー値に置き換えます。

$ echo -n eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__ | base64 -di

次のメッセージのような出力が表示されます。

{ "Statement": [{ "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1426500000 } } }] }

署名付き URL または署名付き cookie には、ポリシーに複数のステートメントがある

既定ポリシーまたはカスタムポリシーに複数のステートメントが含まれている場合、CloudFront は 403 アクセス拒否エラーを返します。

この問題をトラブルシューティングするには、前のセクションの Linux コマンドを実行してカスタムポリシーステートメントを確認してください。コードの詳細を確認してから、既定ポリシーまたはカスタムポリシーに含まれるステートメントが 1 つのみであることを確認します。

署名付き URL または署名付き cookie のポリシー内のベース URL が正しくない

CloudFront は、以下のいずれかのシナリオで 403 アクセス拒否エラーを返します。

  • ポリシーステートメントの Resource キーでは、ベース URL は省略されている (www.example.com)。完全な URL (http://www.example.com) を使用してください。
  • ベース URL には UTF-8 文字エンコーディングがない。
  • ベース URL には、すべての句読点とパラメータ名が含まれているわけではありません。
  • ベース URL の HTTP または HTTPS プロトコルが、署名付き URL または署名付き cookie を送信するリクエストで使用されるプロトコルと一致しない。
  • ベース URL のドメイン名が、ユーザーエージェントが署名付き URL または署名付き cookie を送信するために使用するホストヘッダーと一致しない。
  • ベース URL クエリ文字列には、無効な文字が含まれている。

署名付き URL または署名付き cookie のポリシーの署名が間違っている

CloudFront は、以下のいずれかのシナリオで 403 アクセス拒否エラーを返します。

  • ポリシーステートメントにスペース (タブや改行文字を含む) が含まれている。
  • 既定ポリシーまたはカスタムポリシーが、ハッシュされる前に文字列としてフォーマットされていない。これは、AWS SDK を使用せずに署名付き URL または署名付き ocokie を作成した場合に発生します。
  • ポリシーが署名を生成する前にハッシュされていない。これは、AWS SDK を使用せずに署名付き URL または署名付き cookie を作成した場合に発生します。

署名付き URL または署名付き cookie を使用する場合の署名のベストプラクティスについては、「署名付き URL の署名を作成するためのコード例」を参照してください。

カスタムポリシーで許可されていない IP アドレスまたは IP 範囲から署名付き URL または署名付き cookie が送信された

CloudFront は、以下のいずれかのシナリオで 403 アクセス拒否エラーを返します。

  • 署名付き URL または署名付き cookie が IPv6 IP アドレスから送信された。
  • 署名付き URL または署名付き cookie は、カスタムポリシーで指定されている IPv4 IP アドレスまたは IPv4 IP 範囲からは送信されません。

**IpAddress ** キーは、署名付き URL または署名付き cookie に含まれるカスタムポリシーでのみ使用できます。IPv6 形式の IP アドレスはサポートされていません。IpAddress を含むカスタムポリシーを使用する場合は、ディストリビューションの IPv6 を有効にしないでください。

署名付き cookie には、Set-cookie レスポンスヘッダーにドメイン属性と Path 属性が含まれていない

CloudFront から返された cookie が、同じドメインへの今後のリクエストに含まれていない場合、CloudFront は 403 アクセス拒否エラーを返します。この場合、Set-Cookie レスポンスヘッダーの Domain および Path cookie 属性を確認してください。

Domain 値は、リクエストされたファイルのドメイン名です。Domain 属性を指定しない場合、デフォルト値は URL のドメイン名です。これは指定されたドメイン名にのみ適用され、サブドメインには適用されません。Domian 属性を指定すると、サブドメインにも適用されます。

Domain 属性を指定する場合、URL のドメイン名と Domain 属性の値が一致する必要があります。CloudFront がディストリビューションに割り当てるドメイン名 (例えば、d111111abcdef8.cloudfront.net) を指定することはできますが、ドメイン名に *.cloudfront.net を指定することはできません。URL で example.com などの代替ドメイン名を使用するには、ディストリビューションに代替ドメイン名を追加します。

Path 属性は、リクエストされたファイルのパスです。Path 属性を指定しない場合、デフォルト値は URL 内のパスです。

AWS公式
AWS公式更新しました 1年前