カスタムポリシーを使用して署名付き URL を作成する - Amazon CloudFront

カスタムポリシーを使用して署名付き URL を作成する

カスタムポリシーを使用して署名付き URL を作成するには、次の手順を実行します。

カスタムポリシーを使用して署名付き URL を作成するには
  1. .NET または Java を使用して署名付き URL を作成しており、キーペアのプライベートキーをデフォルトの .pem 形式から .NET または Java 対応の形式に変更していない場合は、それを変換します。詳細については、「プライベートキーの形式を変更する (.NET および Java のみ)」を参照してください。

  2. 以下の値を、リストされた順に連結し、この署名付き URL の例に示されている形式を複製します。

    https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIyMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F

    すべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。すべての値の型は String です。

    1. ファイルのベース URL

    ベース URL は、署名付き URL を使用しなかった場合にファイルへのアクセスに使用する CloudFront URL であり、独自のクエリ文字列パラメータを含みます (ある場合)。前の例で、ベース URL は https://d111111abcdef8.cloudfront.net/image.jpg です。ディストリビューション用の URL 形式の詳細については、「CloudFront でファイルの URL 形式をカスタマイズする」を参照してください。

    以下の例は、ディストリビューションで指定する値を示しています。

    • 以下の CloudFront URL は、ディストリビューション内のイメージファイルの URL です (CloudFront ドメイン名を使用)。image.jpgimages ディレクトリにあります。URL 内のファイルへのパスは、HTTP サーバーまたは Amazon S3 バケットのファイルへのパスに一致する必要があります。

      https://d111111abcdef8.cloudfront.net/images/image.jpg

    • 以下の CloudFront URL には、クエリ文字列が含まれます。

      https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large

    • 以下の CloudFront URL は、ディストリビューション内のイメージファイルの URL です。両方の URL で代替ドメイン名が使用されており、2 番目の URL にはクエリ文字列が含まれています。

      https://www.example.com/images/image.jpg

      https://www.example.com/images/image.jpg?color=red

    • 以下の CloudFront URL は、代替ドメイン名と HTTPS プロトコルを使用するディストリビューション内のイメージファイルの URL です。

      https://www.example.com/images/image.jpg

    2. ?

    ? は、クエリ文字列パラメータがベース URL の後に続くことを示します。独自のクエリ文字列パラメータがない場合も ? を含めます。

    3. クエリ文字パラメータ (ある場合) &

    この値はオプションです。独自のクエリ文字列パラメータ、たとえば次のクエリ文字列パラメータを追加すると仮定します。

    color=red&size=medium

    この場合、? の後、かつ Policy パラメータの前に追加します。特定のまれな状況では、Key-Pair-Id の後にクエリ文字列パラメータを配置する必要があります。

    重要

    パラメータに PolicySignature、または Key-Pair-Id という名前を付けることはできません。

    独自のパラメータを追加する場合は、各パラメータの後に & を付加します (最後のパラメータにも付加します)。

    4. Policy=ポリシーステートメントの base64 エンコードバージョン

    空白が削除されて base64 エンコードされた、JSON 形式のポリシーステートメント。詳細については、「カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成する」を参照してください。

    ポリシーステートメントは、署名付き URL によってユーザーに許可されるアクセスをコントロールします。これには、ファイルの URL、有効期限切れ日時、URL が有効になる日時 (オプション)、ファイルへのアクセスが許可されている IP アドレスまたは IP アドレス範囲 (オプション) が含まれます。

    5. &Signature=ハッシュ化および署名されたバージョンのポリシーステートメント

    ハッシュ化され、署名された base64 エンコードバージョンの JSON ポリシーステートメント。詳細については、「カスタムポリシーを使用する署名付き URL の署名を作成する」を参照してください。

    6. &Key-Pair-Id=署名の生成に使用しているプライベートキーに対応する CloudFront パブリックキーのパブリックキー ID

    CloudFront パブリックキーの ID (K2JCJMDEHXQW5F など)。パブリックキー ID は、署名付き URL の検証に使用するパブリックキーを CloudFront に通知します。CloudFront は、署名内の情報をポリシーステートメント内の情報と比較して、URL が改ざんされていないことを確認します。

    このパブリックキーは、ディストリビューションの信頼された署名者であるキーグループに属している必要があります。詳細については、「署名付き URL と署名付き Cookie を作成できる署名者を指定する」を参照してください。

カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成する

カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには、以下の手順を実行します。

さまざまな方法でファイルへのアクセスを制御するポリシーステートメントの例については、「カスタムポリシーを使用する署名付き URL のポリシーステートメントの例」を参照してください。

カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには
  1. 以下の JSON 形式を使用してポリシーステートメントを構築します。小なり記号 (<) と大なり記号 (>)、およびそれらの中の説明は、独自の値に置き換えます。詳細については、「カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値」を参照してください。

    { "Statement": [ { "Resource": "<Optional but recommended: URL of the file>", "Condition": { "DateLessThan": { "AWS:EpochTime": <Required: ending date and time in Unix time format and UTC> }, "DateGreaterThan": { "AWS:EpochTime": <Optional: beginning date and time in Unix time format and UTC> }, "IpAddress": { "AWS:SourceIp": "<Optional: IP address>" } } } ] }

    次の点に注意してください。

    • ポリシーには、1 つのステートメントのみを含めることができます。

    • UTF-8 文字エンコードを使用します。

    • すべての句読点およびパラメータ名を、指定されたとおりに正確に含めます。パラメータ名の省略形は受け付けられません。

    • Condition セクションのパラメータの順序は問題ではありません。

    • ResourceDateLessThanDateGreaterThan、および IpAddress の値については、「カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値」を参照してください。

  2. ポリシーステートメントからすべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。

  3. MIME base64 エンコーディングを使用してポリシーステートメントを Base64 エンコードします。詳細については、RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message BodiesSection 6.8, Base64 Content-Transfer-Encoding を参照してください。

  4. URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。

    無効な文字 (置換元) 有効な文字 (置換先)

    +

    - (ハイフン)

    =

    _ (下線)

    /

    ~ (チルダ)

  5. 結果の値を署名付き URL の Policy= の後に付加します。

  6. ポリシーステートメントのハッシュ化、署名、および base64 エンコードを行って、署名付き URL の署名を作成します。詳細については、「カスタムポリシーを使用する署名付き URL の署名を作成する」を参照してください。

カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値

カスタムポリシーのポリシーステートメントを作成する場合、以下の値を指定します。

リソース

クエリ文字列 (ある場合) が含まれる URL。ただし、CloudFront の PolicySignature、および Key-Pair-Id パラメータが除外されます。例:

https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes

Resource の URL の値は 1 つだけ指定できます。

重要

ポリシーで、Resource パラメータを省略できますが、その場合、署名付き URL を持つすべてのユーザーが、署名付き URL の作成に使用するキーペアに関連付けられたあらゆるディストリビューションのすべてのファイルにアクセスできることになります。

次の点に注意してください。

  • プロトコル – 値は http://https://、または *:// で始まっている必要があります。

  • クエリ文字列パラメータ – URL にクエリ文字列パラメータがある場合は、バックスラッシュ文字 (\) を使用してクエリ文字列の最初の疑問符 (?) をエスケープします。例:

    https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes

  • ワイルドカード文字 – ポリシーの URL にはワイルドカード文字を使用できます。次のワイルドカード文字がサポートされています。

    • アスタリスク (*) は、0 個以上の文字に一致します

    • 疑問符 (?) は、1 つの文字に一致します

    CloudFront がポリシー内の URL を HTTP リクエスト内の URL と照合すると、ポリシー内の URL は次のように 4 つのセクション (プロトコル、ドメイン、パス、クエリ文字列) に分割されます。

    [protocol]://[domain]/[path]\?[query string]

    ポリシーの URL にワイルドカード文字を使用する場合、ワイルドカードマッチングはワイルドカードを含むセクションの境界内でのみ適用されます。例えば、次のようなポリシーの URL を考えてみます。

    https://www.example.com/hello*world

    この例では、アスタリスクワイルドカード (*) はパスセクション内にのみ適用されるため、URL https://www.example.com/helloworldhttps://www.example.com/hello-world には一致しますが、URL https://www.example.net/hello?world には一致しません。

    ワイルドカードマッチングのセクションの境界には、次の例外が適用されます。

    • パスセクションの末尾にアスタリスクがある場合、クエリ文字列セクションにアスタリスクが付いていることを意味します。たとえば、http://example.com/hello*http://example.com/hello*\?* は同じです。

    • ドメインセクションの末尾にアスタリスクがある場合、パスセクションとクエリ文字列セクションの両方にアスタリスクが付いていることを意味します。たとえば、http://example.com*http://example.com*/*\?* は同じです。

    • ポリシーの URL では、プロトコルセクションを省略し、ドメインセクションをアスタリスクで始めることができます。その場合、プロトコルセクションは暗黙的にアスタリスクに設定されます。例えば、ポリシーの URL *example.com*://*example.com/ と同等です。

    • アスタリスク ("Resource": "*") 単独の場合は、どの URL にも一致します。

    例えば、ポリシーの値 https://d111111abcdef8.cloudfront.net/*game_download.zip* は、次の URL すべてに一致します。

    • https://d111111abcdef8.cloudfront.net/game_download.zip

    • https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes

    • https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp

  • 代替ドメイン名 – ポリシーの URL で代替ドメイン名 (CNAME) を指定する場合、HTTP リクエストはウェブページまたはアプリケーション内の代替ドメイン名を使用する必要があります。ポリシーのファイルの Amazon S3 URL を指定しないでください。

DateLessThan

URL の有効期限切れ日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。ポリシーでは、値を引用符で囲まないでください。UTC の詳細については、「Date and Time on the Internet: Timestamps」を参照してください。

たとえば、UTC の 2023 年 1 月 31 日午前 10 時 00 分は、Unix 時間形式の 1675159200 に変換されます。

これは、Condition セクションにおける唯一の必須パラメータです。CloudFront では、プライベートコンテンツへの永久的なアクセスがユーザーに許可されることのないよう、この値の指定が要求されます。

詳細については、「CloudFront が署名付き URL の有効期限切れの日時を確認するタイミング」を参照してください。

DateGreaterThan (オプション)

オプションの URL 開始日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。ユーザーは、指定された日時が過ぎるまでファイルにアクセスできません。値を引用符で囲まないでください。

IpAddress (オプション)

HTTP リクエストを実行するクライアントの IP アドレス。次の点に注意してください。

  • ファイルへのアクセスをすべての IP アドレスに許可するには、IpAddress パラメータを省略します。

  • IP アドレスまたは IP アドレス範囲を 1 つ指定できます。2 つの別々の範囲のどちらかにクライアントの IP アドレスが入っている場合にアクセスを許可するようなポリシーを使用することはできません。

  • 1 つの IP アドレスからのアクセスを許可するには、以下のように指定します。

    "IPv4 IP アドレス/32"

  • IP アドレス範囲は標準の IPv4 CIDR 形式 (192.0.2.0/24 など) で指定する必要があります。詳細については、「Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan」を参照してください。

    重要

    IPv6 形式の IP アドレス (例: 2001:0db8:85a3::8a2e:0370:7334) はサポートされていません。

    IpAddress を含むカスタムポリシーを使用する場合、ディストリビューションで IPv6 は有効にしません。一部のコンテンツへのアクセスを IP アドレスによって制限し、他のコンテンツで IPv6 リクエストをサポートする場合、2 つのディストリビューションを作成します。詳細については、トピック「ディストリビューション設定リファレンス」の「IPv6 を有効にする」を参照してください。

カスタムポリシーを使用する署名付き URL のポリシーステートメントの例

以下のポリシーステートメントの例は、特定のファイル、ディレクトリ内のすべてのファイル、またはキーペア ID に関連付けられたすべてのファイルへのアクセスを制御する方法を示しています。また、この例は、個々の IP アドレスまたは IP アドレス範囲からのアクセスを制御する方法、および指定された日時以降にユーザーが署名付き URL を使用することを禁止する方法も示しています。

これらの例のいずれかをコピーして貼り付ける場合は、すべての空白 (タブと改行文字を含む) を削除し、値を独自の値に置き換えて、右の中かっこ (}) の後に改行文字を含めます。

詳細については、「カスタムポリシーを使用する署名付き URL のポリシーステートメントで指定する値」を参照してください。

ポリシーステートメントの例: IP アドレス範囲から 1 つのファイルにアクセスする

次の署名付き URL 内のカスタムポリシーの例では、UTC の 2023 年 1 月 31 日午前 10 時 00 分まで、範囲 192.0.2.0/24 の IP アドレスから、ユーザーがファイル https://d111111abcdef8.cloudfront.net/game_download.zip にアクセスできることを指定しています。

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

ポリシーステートメントの例: IP アドレス範囲からディレクトリ内のすべてのファイルにアクセスする

以下のカスタムポリシーの例では、Resource パラメータのアスタリスクワイルドカード文字 (*) が示すとおり、training ディレクトリ内のあらゆるファイルを対象とする署名付き URL を作成できます。UTC の 2023 年 1 月 31 日午前 10 時 00 分まで、範囲 192.0.2.0/24 の IP アドレスから、ユーザーはファイルにアクセスできます。

{ "Statement": [ { "Resource": "https://d111111abcdef8.cloudfront.net/training/*", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1675159200 } } } ] }

このポリシーを使用する各署名付き URL には、次のように、特定のファイルを識別する URL があります。

https://d111111abcdef8.cloudfront.net/training/orientation.pdf

ポリシーステートメントの例: キーペア ID に関連付けられたすべてのファイルに 1 つの IP アドレスからアクセスする

以下のカスタムポリシーの例では、Resource パラメータのアスタリスクワイルドカード文字 (*) が示すとおり、あらゆるディストリビューションに関連付けられたあらゆるファイルを対象とする署名付き URL を作成できます。署名付き URL には、http:// ではなく https:// プロトコルを使用する必要があります。ユーザーは IP アドレス 192.0.2.10/32 を使用する必要があります。(CIDR 表記の値 192.0.2.10/32 は 1 つの IP アドレス 192.0.2.10 を参照します)。ファイルは、UTC の 2023 年 1 月 31 日午前 10 時 00 分から UTC の 2023 年 2 月 2 日午前 10 時 00 分まで使用できます。

{ "Statement": [ { "Resource": "https://*", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.10/32" }, "DateGreaterThan": { "AWS:EpochTime": 1675159200 }, "DateLessThan": { "AWS:EpochTime": 1675332000 } } } ] }

このポリシーを使用する各署名付き URL には、次のように、特定の CloudFront ディストリビューション内の特定のファイルを識別する URL があります。

https://d111111abcdef8.cloudfront.net/training/orientation.pdf

署名付き URL にはキーペア ID も含まれます。キーペア ID は、URL に指定されたディストリビューション (d111111abcdef8.cloudfront.net) 内の信頼されたキーグループに関連付けられる必要があります。

カスタムポリシーを使用する署名付き URL の署名を作成する

カスタムポリシーを使用する署名付き URL の署名は、ハッシュ化、署名、および base64 エンコードが行われたバージョンのポリシーステートメントです。カスタムポリシーの署名を作成するには、以下の手順を実行します。

ポリシーステートメントのハッシュ化、署名、およびエンコードを行う方法の詳細および例については、以下の各資料を参照してください。

オプション 1: カスタムポリシーを使用して署名を作成するには
  1. カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには」の手順で作成した JSON ポリシーステートメントを、SHA-1 ハッシュ関数と RSA を使用してハッシュ化し、署名します。空白は含まれていないが、まだ base64 エンコードされていないバージョンのポリシーステートメントを使用します。

    ハッシュ関数に必要なプライベートキーには、対応するパブリックキーがディストリビューション内のアクティブな信頼されたキーグループにあるものを使用してください。

    注記

    ポリシーステートメントをハッシュ化および署名するための方法は、プログラミング言語およびプラットフォームによって異なります。サンプルコードについては、「署名付き URL の署名を作成するためのコード例」を参照してください。

  2. ハッシュ化および署名された文字列から、空白 (タブや改行文字を含む) を削除します。

  3. MIME base64 エンコーディングを使用して文字列を Base64 エンコードします。詳細については、RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message BodiesSection 6.8, Base64 Content-Transfer-Encoding を参照してください。

  4. URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。

    無効な文字 (置換元) 有効な文字 (置換先)

    +

    - (ハイフン)

    =

    _ (下線)

    /

    ~ (チルダ)

  5. 結果の値を署名付き URL の &Signature= の後に付加し、「カスタムポリシーを使用して署名付き URL を作成するには」に戻って、署名付き URL の各パートの連結を終了します。