メニュー
Amazon Redshift
管理ガイド (API Version 2012年12月1日)

HTTP リクエストへの署名

Amazon Redshift では、管理 API に送信するすべてのリクエストが署名によって認証されている必要があります。このトピックでは、リクエストに署名する方法について説明します。

いずれかの AWS Software Development Kit (SDK) または AWS コマンドラインインターフェイスを使用する場合、リクエストは自動的に署名されるため、このセクションは省略してかまいません。AWS SDK の使用方法の詳細については、「Amazon Redshift 管理インターフェイスの使用」を参照してください。Amazon Redshift コマンドラインインターフェイスの詳細な使用方法については、Amazon Redshift コマンドラインリファレンスを参照してください。

リクエストに署名するには、暗号化ハッシュ関数を使用してデジタル署名を計算します。暗号化ハッシュは、入力データから一意のハッシュ値生成して返す関数です。ハッシュ関数に渡される入力データとしては、リクエストのテキスト、およびシークレットアクセスキーが該当します。ハッシュ関数から返されるハッシュ値をリクエストに署名として含めます。署名は、リクエストの Authorization ヘッダーの一部です。

注記

For API access, you need an access key ID and secret access key. Use IAM user access keys instead of AWS root account access keys. IAM lets you securely control access to AWS services and resources in your AWS account. For more information about creating access keys, see How Do I Get Security Credentials? in the AWS General Reference.

Amazon Redshift は、リクエストを受け取ると、リクエストの署名に使用されたものと同じハッシュ関数と入力データを使用して署名を再計算します。再計算された署名がリクエストに含まれる署名と一致した場合、Amazon Redshift はリクエストを処理します。それ以外の場合、リクエストは拒否されます。

Amazon Redshift は、AWS 署名バージョン 4 を使用した認証をサポートします。署名を計算するプロセスは 3 つのタスクで構成されます。これらのタスクをこの後の例に示します。

  • タスク 1: 正規リクエストを作成する

    HTTP リクエストを正規形式に変換します。正規形式を使用する必要がある理由は、送信した署名と比較するために、Amazon Redshift で同じ正規形式を使用して署名が計算されるためです。

  • タスク 2: 署名文字列を作成する

    暗号化ハッシュ関数への入力値の 1 つとして使用する文字列を作成します。署名文字列と呼ばれる文字列は、ハッシュアルゴリズムの名前、要求日付、認証情報スコープの文字列、および前のタスクで正規化されたリクエストを結合したものです。認証情報スコープの文字列自体は、日付、リージョン、およびサービス情報を結合したものです。

  • タスク 3: 署名を作成する

    2 つの入力文字列 (署名文字列と派生キー) を受け取る暗号化ハッシュ関数を使用して、リクエストの署名を作成します。シークレットアクセスキーから、認証情報スコープの文字列を使用して一連のハッシュベースのメッセージ認証コード (HMAC-SHA256) を作成することで、派生キーが計算されます。

署名の計算例

次の例に、CreateCluster リクエストの署名を作成する詳細な手順を示します。この例を参考にして実際の署名の計算方法を確認できます。その他の参考計算例については、アマゾン ウェブ サービス用語集の「Signature Version 4 Test Suite」を参照してください。

GET または POST リクエストを使用してリクエストを Amazon Redshift に送信できます。この 2 つの違いとして、GET リクエストではパラメータがクエリ文字列パラメータとして送信されるのに対し、POST リクエストではパラメータがリクエストの本文に含まれます。次の例は POST リクエストを示しています。

例では、次のように想定しています。

  • リクエストのタイムスタンプは Fri, 07 Dec 2012 00:00:00 GMT

  • エンドポイントは米国東部 (バージニア北部) リージョン us-east-1

汎用リクエスト構文:

Copy
https://redshift.us-east-1.amazonaws.com/ ?Action=CreateCluster &ClusterIdentifier=examplecluster &MasterUsername=masteruser &MasterUserPassword=12345678Aa &NumberOfNode=2 &NodeType=ds1.xlarge &Version=2012-12-01 &x-amz-algorithm=AWS4-HMAC-SHA256 &x-amz-credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request &x-amz-date=20121207T000000Z &x-amz-signedheaders=content-type;host;x-amz-date

タスク 1: 正規リクエストを作成する」で計算されるリクエストの正規形式は次のとおりです。

Copy
POST / content-type:application/x-www-form-urlencoded; charset=utf-8 host:redshift.us-east-1.amazonaws.com x-amz-date:20121207T000000Z content-type;host;x-amz-date 55141b5d2aff6042ccd9d2af808fdf95ac78255e25b823d2dbd720226de1625d

正規リクエストの最後の行はリクエスト本文のハッシュです。この API にはクエリパラメータがないため、正規リクエストの 3 行目は空です。

タスク 2: 署名する文字列を作成する」で署名する文字列は次のとおりです。

Copy
AWS4-HMAC-SHA256 20121207T000000Z 20121207/us-east-1/redshift/aws4_request 06b6bef4f4f060a5558b60c627cc6c5b5b5a959b9902b5ac2187be80cbac0714

署名する文字列の最初の行はアルゴリズム、2 行目はタイムスタンプ、3 行目は認証情報スコープ、最後の行は「タスク 1: 正規リクエストを作成する」で作成した正規リクエストのハッシュです。認証情報スコープで使用するサービス名は redshift です。

タスク 3: 署名を作成する」について、派生キーは次のように表されます。

Copy
derived key = HMAC(HMAC(HMAC(HMAC("AWS4" + YourSecretAccessKey,"20121207"),"us-east-1"),"redshift"),"aws4_request")

派生キーは連続するハッシュ関数として計算されます。上記の式の内側の HMAC ステートメントでは、「AWS4」というフレーズをシークレットアクセスキーと連結し、それをキーとして使用して「us-east-1」データをハッシュ処理します。このハッシュの結果が次のハッシュ関数のキーになります。

派生キーを計算した後、署名する文字列と派生キーという 2 つの入力文字列を受け取るハッシュ関数でそのキーを使用します。例えば、シークレットアクセスキー wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY を使用し、前述の文字列に署名する場合、計算された署名は次のようになります。

Copy
9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920

最後のステップは、Authorization ヘッダーの構築です。デモンストレーションのアクセスキー AKIAIOSFODNN7EXAMPLE の場合、ヘッダーは次のとおりです (読みやすいように改行しています)。

Copy
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20121207/us-east-1/redshift/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920

このページの内容: