- AWS を利用していると遭遇することがある SigV4(AWS Signature Version 4)。 この仕組みについて「どのように使われ、何を保証していて、どこでハマるのか」など整理する。
1. SigV4 は何を解決する仕組みか?
AWS API では、次の 3 つが必須になる。
- “誰が送ったか” を証明する(真正性)
- リクエストが途中で改ざんされていない(完全性)
- 盗聴されても再送できない(リプレイ防止)
SigV4 はこの 3 つを 署名アルゴリズムによって成立させる。
AWS CLI, SDK, CDK, CloudFormation などの内部では SigV4 が利用されている。
2. SigV4 が使われる実務シーン
AWS ユーザーは、知らないうちに SigV4 に依存している(AWS API 呼び出し”が SigV4 上で動作している)。
例:
S3: 署名付き URL(Presigned URL)
- アプリは AWS 認証情報を持たずにアップロードできる
- URL に署名(SigV4)を埋め込む
- 有効期限すぎたら無効 → リプレイ防止
Lambda → DynamoDB / SQS / Bedrock
- Lambda ランタイムが自動的に SigV4 署名して AWS API を叩く。
API Gateway の IAM 認証
- リクエストは IAM 認証を使用する場合、SigV4 署名必須。
AWS CLI の各コマンド
- CLI は全ての API を SigV4 で署名する。
3. SigV4 と SigV4a の違い
| 項目 | SigV4 | SigV4a |
|---|---|---|
| 方式 | HMAC(対称鍵) | ECDSA(非対称鍵) |
| リージョン依存 | リージョン固定 | 複数リージョン対応 |
| 利用場面 | 標準的な単一リージョン API | MRAP(Multi-Region Access Point)、グローバルサービス、フェイルオーバー |
| 鍵管理 | クライアントが秘密鍵 | AWS は公開鍵のみ保持 |
使い分け
- ほとんどのケース → SigV4
- S3 Multi-Region Access Point など、リージョンに依存できない場面 → SigV4a
4. SigV4 が署名する情報
AWS はリクエストを 正規化(Canonicalization)した上で署名する。
-
HTTP メソッド
-
パス(URI)
-
クエリパラメータ(ソート・エンコード)
-
小文字化・整形された全ヘッダ
-
ペイロードの SHA-256 ハッシュ
-
この「正規化リクエスト」をハッシュし、 アクセスキーの秘密鍵から導出した署名鍵で HMAC-SHA256 署名する。
-
AWS は受信後、同じ処理を再現し署名が一致することを確認する。
5. SigV4 のハマりポイント
SigV4 の Canonicalization(正規化)エラー。
失敗例
- URI エンコードが 1 文字違う
- クエリパラメータがバイト順にソートされていない
- 余分な空白
- ヘッダを SignedHeaders に入れ忘れる
- STS の
X-Amz-Security-Tokenを入れ忘れる - ローカルの時計がズレる(±5 分許容)
6. SigV4 署名リクエスト(AWS CLI 例)
AWS CLI に --debug をつければ、実際の署名リクエストを確認することができる。
例:
GET /my-bucket?list-type=2
Host: s3.ap-northeast-1.amazonaws.com
X-Amz-Date: 20251109T020015Z
X-Amz-Content-Sha256: UNSIGNED-PAYLOAD
Authorization: AWS4-HMAC-SHA256 \
Credential=AKIA.../20251109/ap-northeast-1/s3/aws4_request, \
SignedHeaders=host;x-amz-content-sha256;x-amz-date, \
Signature=1a9ef2e...
署名の構造を理解するとデバッグが楽になる。
7. まとめ
SigV4 は、
AWS API 呼び出しの「真正性・改ざん防止・再利用防止」を低コストに成立させるための署名プロトコル
であり、 「AWS を利用する」という行為そのものを支えている基盤技術。
実務では、
- S3 署名付き URL
- Lambda → DynamoDB
- API Gateway IAM 認証
- Bedrock 呼び出し
- CLI コマンド
など 日常の多くのAWS活用場面で動いている。