リクエストの認証: クエリパラメータの使用 (AWS 署名バージョン 4)
認証の概要 (認証方法 を参照) で説明されているように、クエリ文字列パラメータを使用して認証情報を指定できます。リクエストを完全に URL で表現したい場合、クエリパラメータを使用してリクエストを認証するのが便利です。このメソッドは、URL の事前署名とも呼ばれます。
署名付き URL のユースケースシナリオでは、Amazon S3 リソースへの一時的なアクセスを許可できます。例えば、署名付き URL をウェブサイトに埋め込んだり、コマンドラインクライアント (Curl など) で使用してオブジェクトをダウンロードしたりすることができます。
注記
AWS CLI を使用して署名付き URL を作成することもできます。詳細については、AWS CLI コマンドリファレンスの「presign」を参照してください。
署名付き URL の例を次に示します。
https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=<your-access-key-id>/20130721/us-east-1/s3/aws4_request &X-Amz-Date=20130721T201207Z &X-Amz-Expires=86400 &X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
例の URL では、以下の点に注意してください。
-
読みやすくするために、ラインフィードが追加されています。
-
URL 内の
X-Amz-Credential値には、読みやすさのためにのみ挿入された「/」文字が表示されています。実際には、%2Fとしてエンコードする必要があります。例えば、次のようになります。&X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request
次の表では、認証情報を提供する URL 内のクエリパラメータについて説明します。
| クエリ文字列パラメータ名 | 値の例 |
|---|---|
X-Amz-Algorithm |
AWS 署名のバージョンと署名の計算に使用したアルゴリズムを識別します。 AWS 署名バージョン 4 では、このパラメータ値を |
X-Amz-Credential |
このパラメータは、アクセスキー ID の他に、署名が有効なスコープ (AWS リージョンおよびサービス) も指定します。この値は、次のセクションで説明する署名計算で使用するスコープと一致する必要があります。このパラメータ値の一般的な形式は次のとおりです。
例えば、次のようになります。
Amazon S3 の場合、 |
X-Amz-Date |
日付と時刻の形式は ISO 8601 規格に準拠している必要があるため、「 |
X-Amz-Expires |
生成された署名付き URL が有効な期間を秒単位で指定します。例えば、 署名計算に使用する署名キーは最大 7 日間有効であるため、署名付き URL は最大 7 日間有効です。 |
X-Amz-SignedHeaders |
署名の計算に使用したヘッダーを一覧表示します。署名計算には次のヘッダーが必要です。
注記セキュリティの強化のために、リクエストに含める予定のすべてのリクエストヘッダーに署名する必要があります。 |
X-Amz-Signature |
リクエストを認証するための署名を指定します。この署名は、Amazon S3 が計算する署名と一致する必要があります。一致しない場合、Amazon S3 はリクエストを拒否します。例: 署名計算については、次のセクションで説明します。 |
X-Amz-Security-Token |
STS サービスから取得した認証情報を使用する場合のオプションの認証情報パラメータ。 |
署名の計算
次の図は、署名計算プロセスを示しています。
次の表では、図に示されている関数について説明します。これらの関数のコードを実装する必要があります。
| 関数 | 説明 |
|---|---|
Lowercase() |
文字列を小文字に変換します。 |
Hex() |
16 進数の小文字エンコード。 |
SHA256Hash() |
セキュアハッシュアルゴリズム (SHA) 暗号化ハッシュ関数。 |
HMAC-SHA256() |
指定した署名キーで SHA256 アルゴリズムを使用して HMAC を計算します。これが最後の署名です。 |
Trim() |
先頭または末尾の空白をすべて削除します。 |
UriEncode() |
すべてのバイトが URI でエンコードされます。UriEncode() は、以下のルールを適用する必要があります。
重要開発プラットフォームが提供する標準の UriEncode 関数は、実装の違いや基礎となる RFC のあいまいさにより動作しない場合があります。エンコードが確実に機能するように、独自のカスタム UriEncode 関数を作成することをお勧めします。 Java の UriEncode() 関数の例を次に示します。
|
署名プロセスの詳細 (正規リクエストの作成、署名する文字列、署名計算の詳細) については、「Authorization ヘッダーの署名計算: 単一チャンクでのペイロードの転送 (AWS 署名バージョン 4)」を参照してください。このプロセスは一般的には同じですが、署名付き URL での CanonicalRequest の作成方法は、次のように異なります。
-
署名付き URL を作成する際、URL が任意のペイロードのアップロードに使用されるため、ペイロードの内容を事前に特定できません。そのため、正規リクエストにはペイロードハッシュを含めません。代わりに、定数文字列
UNSIGNED-PAYLOADを使用します。 -
正規クエリ文字列には、
X-Amz-Signatureを除く前述のテーブルのすべてのクエリパラメータを含める必要があります。 -
S3 では、STS サービスから取得された認証情報を使用する場合は、URL に
X-Amz-Security-Tokenクエリパラメータを含める必要があります。 -
正規ヘッダーには HTTP
hostヘッダーを含める必要があります。いずれかのx-amz-*ヘッダーを含める場合は、署名計算のためにこれらのヘッダーも追加する必要があります。必要に応じて、リクエストに含める予定の他のすべてのヘッダーを追加できます。セキュリティを強化するには、できるだけ多くのヘッダーに署名する必要があります。署名付きヘッダーを追加し、それが署名付きクエリパラメータでも指定されている場合、それぞれの値が異なる場合、入力が競合しているためInvalidRequestエラーが発生します。
例
examplebucket バケットにオブジェクト test.txt があるとします。署名付き URL を作成して、このオブジェクトを 24 時間 (86,400 秒間) 他のユーザーと共有したいと考えています。
https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
次のステップでは、まず署名の計算を行い、次に署名付き URL の構築について説明します。この例では、さらに次を前提としています。
-
リクエストのタイムスタンプは
Fri, 24 May 2013 00:00:00 GMTです。 -
バケットは米国東部 (バージニア北部) リージョンにあり、認証情報
ScopeとSigning Keyの計算ではリージョン指定子としてus-east-1が使用されます。リージョンの詳細については、https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_regionの「AWS 全般のリファレンスリージョンとエンドポイント」を参照してください。
この例をテストケースとして使用して、お客様のコードで計算された署名を検証できます。ただし、同じバケット名、オブジェクトキー、タイムスタンプ、および次の認証情報の例を使用する必要があります。
| パラメータ | 値 |
|---|---|
AWSAccessKeyId |
AKIAIOSFODNN7EXAMPLE |
AWSSecretAccessKey |
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
-
StringToSign
-
CanonicalRequest
GET /test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host host:examplebucket.s3.amazonaws.com host UNSIGNED-PAYLOAD -
StringToSign
AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04
-
-
SigningKey
signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request") -
Signature
aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404これで、署名付き URL を作成するためのすべての情報が揃いました。この例の結果得られる URL は次のとおりです (これを使用して署名付き URL と比較できます)。
https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404
例 2
以下は、X-Amz-Security-Token パラメータを含む署名付き URL を示す例です (前の例とは無関係です)。
https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>