AWS API リクエストの署名
重要
AWS SDK (「サンプルコードとライブラリ
複数の署名バージョンをサポートするリージョンでは、リクエストに手動で署名する場合、使用する署名バージョンを指定する必要があります。マルチリージョンアクセスポイントにリクエストを送信すると、SDK と CLI は Signature Version 4A の使用に自動的に切り替えます。追加の設定は不要です。
リクエストで送信する認証情報には、署名が含まれている必要があります。署名を計算するには、選択されているリクエストの要素を連結し、文字列を作成します。これは、署名する文字列と呼ばれます。次に、署名キーを使用して、署名する文字列の Hash-based Message Authentication Code (HMAC) を計算します。
AWS の署名バージョン 4 では、リクエストの署名にシークレットアクセスキーは使用しません。代わりに、まずシークレットアクセスキーを使用して署名キーを生成します。生成される署名キーは、日付、サービス、およびリージョンによって異なります。さまざまなプログラミング言語の署名キーを取得する方法の詳細については、「リクエスト署名の例」を参照してください。
署名バージョン 4 は、AWS 署名プロトコルです。AWS は、マルチリージョン API リクエストの署名をサポートする署名バージョン 4A という拡張機能もサポートしています。詳細については、GitHub で「sigv4a-signing-examples
次の図は、署名を計算する一般的なプロセスを示しています。

-
署名する文字列はリクエストのタイプによって異なります。たとえば、認証に HTTP Authorization ヘッダーまたはクエリパラメータを使用する場合、リクエスト要素のさまざまな組み合わせを使用して、署名する文字列を作成します。HTTP POST リクエストでは、リクエスト内の
POST
ポリシーは、署名する文字列です。 -
署名キーについては、図に一連の計算が示されており、各手順の結果は次の手順に入力されます。最後の手順は署名キーです。
-
AWS サービスが認証されたリクエストを受け取ると、リクエストに含まれる認証情報を使用して署名が再作成されます。署名が一致すると、サービスはリクエストを処理します。それ以外の場合、リクエストを拒否します。
内容
リクエストに署名するタイミング
AWS に API リクエストを送信するためのカスタムコードを記述するときは、リクエストに署名するためのコードを含める必要があります。カスタムコードを書く理由には、以下のような場合が考えられます。
-
AWS SDK がないプログラミング言語を使用しているためです。
-
AWS にリクエストを送る方法を完全に管理する必要がある場合。
リクエストに署名する理由
署名プロセスは、次のような点でリクエストのセキュリティ確保に役立ちます。
-
リクエスタの ID の確認
認証されたリクエストには、アクセスキー (アクセスキー ID、シークレットアクセスキー) を使用して作成した署名が必要です。一時的なセキュリティ認証情報を使用している場合、署名の計算にはセキュリティトークンも必要です。詳細については、「AWS security credentials programmatic access」(セキュリティ認証情報のプログラムによるアクセス) を参照してください。
-
送信中のデータの保護
送信中のリクエストの改ざんを防ぐために、一部のリクエスト要素からリクエストのハッシュ (ダイジェスト) を計算し、得られたハッシュ値をリクエストの一部として含めます。AWS のサービス がリクエストを受け取ると、同じ情報を使用してハッシュを計算し、リクエストに含まれているハッシュ値と比較します。ハッシュ値が一致しない場合、AWS はそのリクエストを拒否します。
-
潜在的なリプレイ攻撃の防止
多くの場合、リクエストは、リクエストのタイムスタンプの 5 分以内に AWS に到達する必要があります。その条件を満たさない場合、AWS はリクエストを拒否します。