カスタムポリシーを使用して署名付き Cookie を設定する
カスタムポリシーを使用する署名付き Cookie を設定するには、以下の手順を実行します。
カスタムポリシーを使用して署名付き Cookie を設定するには
-
.NET または Java を使用して署名付き URL を作成しており、キーペアのプライベートキーをデフォルトの .pem 形式から .NET または Java 対応の形式に変更していない場合は、それを変換します。詳細については、「プライベートキーの形式を変更する (.NET および Java のみ)」を参照してください。
-
承認されたビューワーに 3 つの
Set-Cookie
ヘッダーを送信するアプリケーションをプログラムします。各Set-Cookie
ヘッダーには名前と値のペアを 1 つだけ含めることができ、CloudFront 署名付き Cookie では 3 つの名前と値のペアが必要であるため、3 つのSet-Cookie
ヘッダーが必要です。名前と値のペアは、CloudFront-Policy
、CloudFront-Signature
、およびCloudFront-Key-Pair-Id
です。アクセスを制御するファイルに対してユーザーが最初のリクエストを行う前に、値がビューワーに存在している必要があります。注記
一般的に、
Expires
属性とMax-Age
属性を除外することをお勧めします。これにより、ユーザーがブラウザを閉じたときに、ブラウザで Cookie が削除されるため、ユーザーがコンテンツに不正アクセスする可能性が低くなります。詳細については、「署名付き Cookie の悪用を防止する」を参照してください。Cookie の属性の名前では、大文字と小文字が区別されます。
改行は、属性を判読しやすくするためにのみ含まれています。
Set-Cookie: CloudFront-Policy=
base64 encoded version of the policy statement
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly Set-Cookie: CloudFront-Signature=hashed and signed version of the policy statement
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly- (オプション)
Domain
-
リクエストされたファイルのドメイン名。
Domain
属性を指定しない場合、デフォルト値は URL のドメイン名で、指定されたドメイン名にのみ適用され、サブドメインには適用されません。Domain
属性を指定する場合、サブドメインにも適用されます。ドメイン名の先頭のドット (例えば、Domain=.example.com
) はオプションです。さらに、Domain
属性を指定する場合は、URL のドメイン名とDomain
属性の値が一致している必要があります。CloudFront がディストリビューションに割り当てたドメイン名 (d111111abcdef8.cloudfront.net など) を指定することはできますが、*.cloudfront.net をドメイン名として指定することはできません。
URL で代替ドメイン名 (example.com など) を使用する場合は、
Domain
属性を指定するかどうかにかかわらず、代替ドメイン名をディストリビューションに追加する必要があります。詳細については、トピック「ディストリビューション設定リファレンス」の「代替ドメイン名 (CNAME)」を参照してください。 - (オプション)
Path
-
リクエストされたファイルのパス。
Path
属性を指定しない場合、デフォルト値は URL のパスです。 Secure
-
リクエストを送信する前に、ビューワーが Cookie を暗号化することを要求します。Cookie の属性を中間者攻撃から保護するために、HTTPS 接続で
Set-Cookie
ヘッダーを送信することをお勧めします。 HttpOnly
-
ビューワーが HTTP または HTTPS リクエストでのみ Cookie を送信することを要求します。
CloudFront-Policy
-
空白が削除されて base64 エンコードされた、JSON 形式のポリシーステートメント。詳細については、「カスタムポリシーを使用する署名付き Cookie の署名を作成する」を参照してください。
ポリシーステートメントは、署名付き Cookie によってユーザーに許可されるアクセスをコントロールします。これには、ユーザーがアクセスできるファイル、有効期限切れ日時、URL が有効になる日時 (オプション)、ファイルへのアクセスが許可されている IP アドレスまたは IP アドレス範囲 (オプション) が含まれます。
CloudFront-Signature
-
ハッシュ化され、署名された base64 エンコードバージョンの JSON ポリシーステートメント。詳細については、「カスタムポリシーを使用する署名付き Cookie の署名を作成する」を参照してください。
CloudFront-Key-Pair-Id
-
CloudFront パブリックキーの ID (
K2JCJMDEHXQW5F
など)。パブリックキー ID は、署名付き URL の検証に使用するパブリックキーを CloudFront に通知します。CloudFront は、署名内の情報をポリシーステートメント内の情報と比較して、URL が改ざんされていないことを確認します。このパブリックキーは、ディストリビューションの信頼された署名者であるキーグループに属している必要があります。詳細については、「署名付き URL と署名付き Cookie を作成できる署名者を指定する」を参照してください。
- (オプション)
カスタムポリシーの Set-Cookie
ヘッダーの例
以下の Set-Cookie
ヘッダーペアの例を参照してください。
代替ドメイン名 (example.org など) を URL で使用する場合は、Domain
属性を指定するかどうかにかかわらず、代替ドメイン名をディストリビューションに追加する必要があります。詳細については、トピック「ディストリビューション設定リファレンス」の「代替ドメイン名 (CNAME)」を参照してください。
例 1
ディストリビューションに関連するドメイン名をファイルの URL で使用している場合、1 つの署名付き Cookie で Set-Cookie
ヘッダーを使用できます。
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
例 2
代替ドメイン名 (example.org) をファイルの URL で使用している場合、1 つの署名付き Cookie で Set-Cookie
ヘッダーを使用できます。
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
例 3
ディストリビューションに関連するドメイン名をファイルの URL で使用している場合、1 つの署名付きリクエストで Set-Cookie
ヘッダーペアを使用できます。
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=dd111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
例 4
ディストリビューションに関連付けられた代替ドメイン名をファイルの URL で使用している場合、1 つの署名付きリクエストで Set-Cookie
ヘッダーペアを使用できます。
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
既定ポリシーを使用する署名付き Cookie のポリシーステートメントを作成する
カスタムポリシーのポリシーステートメントを作成するには、以下の手順を実行します。さまざまな方法でファイルへのアクセスを制御するポリシーステートメントのいくつかの例については、「カスタムポリシーを使用する署名付き Cookie のポリシーステートメントの例」を参照してください。
カスタムポリシーを使用する署名付き Cookie のポリシーステートメントを作成するには
-
以下の JSON 形式を使用してポリシーステートメントを構築します。
{ "Statement": [ { "Resource": "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
セクションのパラメータの順序は問題ではありません。 -
Resource
、DateLessThan
、DateGreaterThan
、およびIpAddress
の値については、「署名付き Cookie のカスタムポリシーのポリシーステートメントで指定する値」を参照してください。
-
-
ポリシーステートメントからすべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。
-
MIME base64 エンコーディングを使用してポリシーステートメントを Base64 エンコードします。詳細については、RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies の Section 6.8, Base64 Content-Transfer-Encoding
を参照してください。 -
URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。
無効な文字 (置換元) 有効な文字 (置換先) +
- (ハイフン)
=
_ (下線)
/
~ (チルダ)
-
結果の値を、
Set-Cookie
ヘッダーのCloudFront-Policy=
の後に含めます。 -
ポリシーステートメントのハッシュ化、署名、および base64 エンコードを行って、
Set-Cookie
用にCloudFront-Signature
ヘッダーの署名を作成します。詳細については、「カスタムポリシーを使用する署名付き Cookie の署名を作成する」を参照してください。
署名付き Cookie のカスタムポリシーのポリシーステートメントで指定する値
カスタムポリシーのポリシーステートメントを作成する場合、以下の値を指定します。
- リソース
-
クエリ文字列 (存在する場合) を含むベース URL。
https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes
重要
Resource
パラメータを省略した場合、ユーザーは、署名付き URL の作成に使用するキーペアに関連付けられたあらゆるディストリビューションに関連付けられるすべてのファイルにアクセスできます。Resource
の日付形式は 1 つだけ指定できます。次の点に注意してください。
-
プロトコル – 値は
http://
またはhttps://
で始まっている必要があります。 -
クエリ文字列パラメータ – クエリ文字列パラメータがない場合は、疑問符を省略します。
-
ワイルドカード – 0 個以上の文字に一致するワイルドカード文字 (*)、または 1 つの文字に一致するワイルドカード文字 (?) を使用できます。文字列のどこにでも含めることができます。次に例を示します。この値は、
https://d111111abcdef8.cloudfront.net/*game_download.zip*
たとえば、次のファイルを含みます。
-
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) を指定する場合は、ウェブページまたはアプリケーション内のファイルを参照するときに代替ドメイン名を指定する必要があります。ファイルの Amazon S3 URL を指定しないでください。
-
- DateLessThan
-
URL の有効期限切れ日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。値を引用符で囲まないでください。
たとえば、UTC の 2015 年 3 月 16 日午前 10 時 00 分は、UNIX 時間形式の 1426500000 に変換されます。
詳細については、「CloudFront が署名付き Cookie の有効期限切れ日時を確認するタイミング」を参照してください。
- DateGreaterThan (オプション)
-
オプションの URL 開始日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。ユーザーは、指定された日時が過ぎるまでファイルにアクセスできません。値を引用符で囲まないでください。
- IpAddress (オプション)
-
GET リクエストを実行するクライアントの IP アドレス。次の点に注意してください。
-
ファイルへのアクセスをすべての IP アドレスに許可するには、
IpAddress
パラメータを省略します。 -
IP アドレスまたは IP アドレス範囲を 1 つ指定できます。たとえば、2 つの別々の範囲のどちらかにクライアントの IP アドレスが入っている場合にアクセスを許可するようなポリシーを設定することはできません。
-
1 つの IP アドレスからのアクセスを許可するには、以下のように指定します。
"
IPv4 IP アドレス
/32"
-
IP アドレス範囲は標準の IPv4 CIDR 形式 (
192.0.2.0/24
など) で指定する必要があります。詳細については、RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan (https://tools.ietf.org/html/rfc4632) を参照してください。 重要
IPv6 形式の IP アドレス (例: 2001:0db8:85a3::8a2e:0370:7334) はサポートされていません。
IpAddress
を含むカスタムポリシーを使用する場合、ディストリビューションで IPv6 は有効にしません。一部のコンテンツへのアクセスを IP アドレスによって制限し、他のコンテンツで IPv6 リクエストをサポートする場合、2 つのディストリビューションを作成します。詳細については、トピック「ディストリビューション設定リファレンス」の「IPv6 を有効にする」を参照してください。
-
カスタムポリシーを使用する署名付き Cookie のポリシーステートメントの例
以下のポリシーステートメントの例は、特定のファイル、ディレクトリ内のすべてのファイル、またはキーペア ID に関連付けられたすべてのファイルへのアクセスを制御する方法を示しています。また、この例は、個々の IP アドレスまたは IP アドレス範囲からのアクセスを制御する方法、および指定された日時以降にユーザーが署名付き Cookie を使用することを禁止する方法も示しています。
これらの例のいずれかをコピーして貼り付ける場合は、すべての空白 (タブと改行文字を含む) を削除し、値を独自の値で置き換え、右の中かっこ ( } ) の後に改行文字を含めます。
詳細については、「署名付き Cookie のカスタムポリシーのポリシーステートメントで指定する値」を参照してください。
トピック
ポリシーステートメントの例: IP アドレス範囲から 1 つのファイルにアクセスする
次の署名付き Cookie 内のカスタムポリシーの例では、UTC の 2023 年 1 月 1 日午前 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": 1357034400 } } } ] }
ポリシーステートメントの例: IP アドレス範囲からディレクトリ内のすべてのファイルにアクセスする
以下のカスタムポリシーの例では、Resource
パラメータの * ワイルドカード文字が示すとおり、training
ディレクトリ内のあらゆるファイルを対象とする署名付き Cookie を作成できます。UTC の 2013 年 1 月 1 日午前 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": 1357034400 } } } ] }
このポリシーを使用する各署名付き Cookie には、たとえば次のように、特定のファイルを識別するベース URL が含まれます。
https://d111111abcdef8.cloudfront.net/training/orientation.pdf
ポリシーステートメントの例: キーペア ID に関連付けられたすべてのファイルに 1 つの IP アドレスからアクセスする
以下のカスタムポリシーの例では、Resource
パラメータの * ワイルドカード文字が示すとおり、あらゆるディストリビューションに関連付けられたあらゆるファイルを対象とする署名付き Cookie を設定できます。ユーザーは IP アドレス 192.0.2.10/32
を使用する必要があります。(CIDR 表記の値 192.0.2.10/32
は 1 つの IP アドレス 192.0.2.10
を参照します)。ファイルは、UTC の 2013 年 1 月 1 日午前 10 時 00 分から UTC の 2013 年 1 月 2 日午前 10 時 00 分まで使用できます。
{ "Statement": [ { "Resource": "https://*", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.10/32" }, "DateGreaterThan": { "AWS:EpochTime": 1357034400 }, "DateLessThan": { "AWS:EpochTime": 1357120800 } } } ] }
このポリシーを含める各署名付き Cookie には、たとえば次のように、特定の CloudFront ディストリビューション内の特定のファイルを識別するベース URL が含まれます。
https://d111111abcdef8.cloudfront.net/training/orientation.pdf
署名付き Cookie にはキーペア ID も含まれます。キーペア ID は、ベース URL に指定されたディストリビューション (d111111abcdef8.cloudfront.net) 内の信頼されたキーグループに関連付けられる必要があります。
カスタムポリシーを使用する署名付き Cookie の署名を作成する
カスタムポリシーを使用する署名付き Cookie の署名は、ハッシュ化、署名、および base64 エンコードが行われたバージョンのポリシーステートメントです。
ポリシーステートメントのハッシュ化、署名、およびエンコードを行う方法の詳細および例については、以下の各資料を参照してください。
カスタムポリシーを使用して署名付き Cookie の署名を作成するには
-
「カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには」の手順で作成した JSON ポリシーステートメントを、SHA-1 ハッシュ関数と RSA を使用してハッシュ化し、署名します。空白は含まれていないが、まだ base64 エンコードされていないバージョンのポリシーステートメントを使用します。
ハッシュ関数に必要なプライベートキーには、対応するパブリックキーがディストリビューション内のアクティブな信頼されたキーグループにあるものを使用してください。
注記
ポリシーステートメントをハッシュ化および署名するための方法は、プログラミング言語およびプラットフォームによって異なります。サンプルコードについては、「署名付き URL の署名を作成するためのコード例」を参照してください。
-
ハッシュ化および署名された文字列から、空白 (タブや改行文字を含む) を削除します。
-
MIME base64 エンコーディングを使用して文字列を Base64 エンコードします。詳細については、RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies の Section 6.8, Base64 Content-Transfer-Encoding
を参照してください。 -
URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。
無効な文字 (置換元) 有効な文字 (置換先) +
- (ハイフン)
=
_ (下線)
/
~ (チルダ)
-
結果の値を、
Set-Cookie
の名前と値のペアのCloudFront-Signature=
ヘッダーに含めて、「カスタムポリシーを使用して署名付き Cookie を設定するには」に戻り、Set-Cookie
のCloudFront-Key-Pair-Id
ヘッダーを追加します。