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

所要時間3分
0

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

解決策

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

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

動作の**[ビューワーのアクセスを制限する]**をオンにする場合は、署名者を決定する必要があります。署名者は、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. ディストリビューションを選択します。次に、[動作] タブを選択します。
  3. 動作名を選択し、[編集] を選択します。
  4. [ビューワーのアクセスを制限する] 設定を見つけます。
    注:****[はい] に設定されている場合、このキャッシュ動作のパスパターンに一致するファイルへのリクエストには、署名付き URL または署名付き cookie を使用する必要があります。
  5. [信頼された認証タイプ] フィールドを確認してください。
  6. [信頼された認証タイプ] の値設定が [信頼されたキーグループ] である場合は、信頼キーグループの名前を書き留めます。信頼キーグループのパブリックキー ID を検索してください。
    CloudFront コンソールを開きます。
    [キーグループ] を選択します。書き留めた信頼されたキーグループの名前を選択します。
    Key-Pair-Id または CloudFront-Key-Pair-Id の値が、信頼されたキーグループのパブリックキー ID のいずれかと一致することを確認します。
  7. [信頼された認証] タイプが [信頼された署名者] である場合は、CloudFront は AWS が生成する認証情報を使用します。この場合、Key-Pair-Id または CloudFront-Key-Pair-ID の値は、CloudFront 認証情報のアクセスキー ID と一致する必要があります。
    **注:**CloudFront 認証情報の [アクセスキー ID] を確認するには、「署名者のキーペアの作成」を参照してください。

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

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

  • 既定ポリシーを使用する署名付き URLExpires 値よりも大きい署名付き URL が送信されます。
  • 署名付き cookie は、既定ポリシーを使用する署名 cookieCloudFront-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 "eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__" | tr -- '-_~' '+=/' | base64 -d

次のような出力が表示されます。

{ "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 が正しくない

ポリシー内のベース URL が正しくない場合、CloudFront は 403 アクセス拒否エラーを返します。

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

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

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

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

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

署名付き URL または署名付き Cookie が、サポートされていない IP アドレスまたは IP 範囲から送信された

署名付き URL または署名付きクッキーが IPv6 アドレスから送信されると、CloudFront は 403 アクセス拒否エラーを返します。または、カスタムポリシーで許可されていない IPv4 アドレスまたは IPv4 範囲から送信されます。

**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 を指定することはできません。example.com などの代替ドメイン名を使用するには、URL のディストリビューションに代替ドメイン名を追加します。

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

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