HTTP リクエストへの署名 - Amazon Redshift

HTTP リクエストへの署名

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

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

リクエストに署名するには、暗号化ハッシュ関数を使用してデジタル署名を計算します。暗号化ハッシュは、入力データから一意のハッシュ値生成して返す関数です。ハッシュ関数への入力には、リクエストのテキストと、一時的な認証情報から取得できるシークレットアクセスキーが含まれます。ハッシュ関数から返されるハッシュ値をリクエストに署名として含めます。署名は、リクエストの Authorization ヘッダーの一部です。

注記

AWS Management Console の外部で AWS を操作するには、ユーザーはプログラムによるアクセスが必要です。プログラムによるアクセスを許可する方法は、AWS にアクセスしているユーザーのタイプによって異なります。

ユーザーにプログラムによるアクセス権を付与するには、以下のいずれかのオプションを選択します。

どのユーザーがプログラムによるアクセスを必要としますか? To By

ワークフォース ID

(IAM Identity Center で管理されているユーザー)

一時的な認証情報を使用して、AWS CLI、AWS SDK、または AWS API へのプログラムによるリクエストに署名します。

使用するインターフェイス用の手順に従ってください。

IAM 一時的な認証情報を使用して、AWS CLI、AWS SDK、または AWS API へのプログラムによるリクエストに署名します。 IAM ユーザーガイド」の「AWS リソースでの一時的な認証情報の使用」の指示に従ってください。
IAM

(非推奨)

長期的な認証情報を使用して、AWS CLI、AWS SDK、AWS API へのプログラムによるリクエストに署名します。

使用するインターフェイス用の手順に従ってください。

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

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

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

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

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

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

  • タスク 3: 署名を計算する

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

署名の計算例

次の例に、CreateCluster リクエストの署名を作成する詳細な手順を示します。この例を参考にして実際の署名の計算方法を確認できます。その他の参考計算例は、「IAM ユーザーガイド」の「リクエスト署名の例」セクションに記載されています。

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

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

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

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

汎用リクエスト構文:

https://redshift.us-east-1.amazonaws.com/ ?Action=CreateCluster &ClusterIdentifier=examplecluster &MasterUsername=masteruser &MasterUserPassword=12345678Aa &NumberOfNode=2 &NodeType=ds2.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: 正規リクエストを作成する」で計算されるリクエストの正規形式は次のとおりです。

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: 署名する文字列を作成する」で署名する文字列は次のとおりです。

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

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

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

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

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

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

9a6b557aa9f38dea83d9215d8f0eae54100877f3e0735d38498d7ae489117920

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

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