API リクエストに対する AWS Signature Version 4
重要
AWS SDK (「サンプルコードとライブラリ
複数の署名バージョンをサポートするリージョンでは、リクエストに手動で署名する場合、使用する署名バージョンを指定する必要があります。マルチリージョンアクセスポイントにリクエストを送信すると、SDK と CLI は Signature Version 4A の使用に自動的に切り替えます。追加の設定は不要です。
リクエストで送信する認証情報には、署名が含まれている必要があります。AWSSignature Version 4 (SigV4) は、AWS API リクエストに認証情報を追加するための AWS 署名プロトコルです。
API リクエストの署名には、シークレットアクセスキーを使用しません。そうではなく、SigV4 署名プロセスを使用します。リクエストを署名するには、以下の手順を実行します。
-
リクエストの詳しい情報に基づいて正規リクエストを作成します。
-
自分の AWS 認証情報を使用して署名を計算します。
-
求めた署名を認証ヘッダーとしてリクエストに追加します。
AWS は、このプロセスをレプリケートして署名を検証し、検証結果に応じてアクセスを許可または拒否します。
注記
AWS は、マルチリージョン API リクエストの署名をサポートする Signature Version 4A という拡張機能もサポートしています。詳細については、GitHub で「sigv4a-signing-examples
AWS SigV4 の仕組み
次の図は、署名を計算する一般的なプロセスを示しています。
![署名する文字列、署名キー、計算された署名など、署名の各部分の画像。](images/signing-overview.png)
-
署名する文字列はリクエストのタイプによって異なります。例えば、認証に HTTP Authorization ヘッダーまたはクエリパラメータを使用する場合、リクエスト要素を組み合わせて、署名文字列を作成します。HTTP POST リクエストでは、リクエスト内の
POST
ポリシーは、署名する文字列です。 -
署名キーは、一続きの計算で求められ、各ステップの結果が次の計算に送られます。最後の手順は署名キーです。
-
AWS サービスが認証されたリクエストを受け取ると、リクエストに含まれる認証情報を使用して署名が再作成されます。署名が一致すると、サービスはリクエストを処理します。それ以外の場合、リクエストを拒否します。
詳細については、「AWS API リクエスト署名の要素」を参照してください。
リクエストに署名するタイミング
AWS に API リクエストを送信するためのカスタムコードを記述するときは、リクエストに署名するためのコードを含める必要があります。カスタムコードを書く理由には、以下のような場合が考えられます。
-
AWS SDK がないプログラミング言語を使用しているためです。
-
AWS にリクエストを送る方法を完全に管理する必要がある場合。
API リクエストは AWS SigV4 でアクセスを認証しますが、AWS SDK と AWS CLI はユーザーが指定したアクセスキーを使用してリクエストを認証します。AWS SDK と AWS CLI による認証の詳細については、「追加リソース」を参照してください。
リクエストに署名する理由
署名プロセスは、次のような点でリクエストのセキュリティ確保に役立ちます。
-
リクエスタの ID の確認
認証されたリクエストには、アクセスキー (アクセスキー ID、シークレットアクセスキー) を使用して作成した署名が必要です。一時的なセキュリティ認証情報を使用している場合、署名の計算にはセキュリティトークンも必要です。詳細については、「AWS security credentials programmatic access」(セキュリティ認証情報のプログラムによるアクセス) を参照してください。
-
送信中のデータの保護
送信中のリクエストの改ざんを防ぐために、一部のリクエスト要素からリクエストのハッシュ (ダイジェスト) を計算し、得られたハッシュ値をリクエストの一部として含めます。AWS サービス がリクエストを受け取ると、同じ情報を使用してハッシュを計算し、リクエストに含まれているハッシュ値と比較します。ハッシュ値が一致しない場合、AWS はそのリクエストを拒否します。
-
潜在的なリプレイ攻撃の防止
多くの場合、リクエストは、リクエストのタイムスタンプの 5 分以内に AWS に到達する必要があります。その条件を満たさない場合、AWS はリクエストを拒否します。
AWS SigV4 は、HTTP 認証ヘッダーに表現することも、URL にクエリ文字列として表現することもできます。詳細については、「認証方法」を参照してください。
追加リソース
-
さまざまなサービスの SigV4 署名プロセスの詳細については、「リクエスト署名の例」を参照してください。
-
AWS CLI でプログラマティックにアクセスできるように認証情報を設定するには、「AWS コマンドラインインターフェイスユーザーガイド」の「認証とアクセス認証情報」を参照してください。
-
AWS SDK には、AWS API リクエストに署名する方法を示す GitHub のソースコードが含まれています。コードの例については、「AWS サンプルリポジトリ内のプロジェクト例」を参照してください。
-
AWS SDK for .NET – AWS4Signer.cs
-
AWS SDK for C++ – AWSAuthV4Signer.cpp
-
AWS SDK for Go – v4.go
-
AWS SDK for Java – BaseAws4Signer.java
-
AWS SDK for JavaScript – v4.js
-
AWS SDK for PHP – SignatureV4.php
-
AWS SDK for Python (Boto) – signers.py
-
AWS SDK for Ruby – signer.rb
-