security
A
信頼度ランク
| S | 公式ソース確認済み |
| A | 成功実績多数・失敗例少数 |
| B | 賛否両論 |
| C | 動作未確認・セキュリティリスク高 |
| Z | 個人所感 |
KMSグラントと一時的アクセス委任 — キーポリシーとの違い
KMSグラントの仕組み、CreateGrant/RetireGrant/RevokeGrant操作、グラントトークンの使用、AWSサービスによるグラント自動作成(EBS/S3)、キーポリシーとの適切な使い分けを解説。
一言結論
KMSグラントはキーポリシーを変更せずにプログラマティックで一時的なキー使用権限を付与できる仕組みで、AWSサービスによる自動暗号化や動的な権限委任に欠かせない。
KMSグラントとは
グラントはKMSキーへのプログラマティックな一時的アクセス委任の仕組みだ。キーポリシーを変更せずに特定のプリンシパルに特定の操作を許可できる。
グラントの用途:
→ AWSサービス(EBS、S3、Redshift等)がCMKを使って暗号化する際に自動作成
→ アプリケーションが一時的に別ユーザーにキー使用を委任
→ キーポリシーの変更なしに動的に権限を付与
グラント vs キーポリシー:
キーポリシー: 静的・永続的な権限(管理者が設定)
グラント: 動的・一時的な権限(プログラムから作成)
グラントの作成と使用
# グラントの作成(ECSタスクにDecrypt権限を一時付与)
aws kms create-grant \
--key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx \
--grantee-principal arn:aws:iam::123456789012:role/ECSTaskRole \
--operations Decrypt GenerateDataKey \
--name "ecs-task-decrypt-grant" \
--retiring-principal arn:aws:iam::123456789012:role/AdminRole
# グラントの一覧確認
aws kms list-grants \
--key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx
グラントで許可できる操作:
Decrypt / Encrypt
GenerateDataKey / GenerateDataKeyWithoutPlaintext
ReEncryptFrom / ReEncryptTo
CreateGrant(グラントの委任)
RetireGrant
DescribeKey
GenerateMac / VerifyMac
Sign / Verify
グラントトークン
グラントを作成直後に使用する場合、レプリケーション遅延で失敗することがある。グラントトークンを使って即時有効化する。
import boto3
kms = boto3.client('kms')
# グラントの作成
response = kms.create_grant(
KeyId='arn:aws:kms:ap-northeast-1:123456789012:key/xxx',
GranteePrincipal='arn:aws:iam::123456789012:role/TempRole',
Operations=['Decrypt']
)
grant_token = response['GrantToken']
# グラントトークンを使って即時利用
decrypted = kms.decrypt(
CiphertextBlob=b'...',
GrantTokens=[grant_token] # グラントトークンを明示的に指定
)
グラントの終了方法
# RetireGrant: グラントの受益者(GranteePrincipal)または退職プリンシパルが実行
aws kms retire-grant \
--key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx \
--grant-token "grant-token-value"
# または GrantId を使って退職
aws kms retire-grant \
--key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx \
--grant-id "grant-id-value"
# RevokeGrant: キーの管理者が強制的に削除
aws kms revoke-grant \
--key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx \
--grant-id "grant-id-value"
RetireGrant vs RevokeGrant:
RetireGrant: グラントの受益者や指定された退職プリンシパルが通常通り終了
RevokeGrant: キー管理者が強制的に取り消し(緊急時)
AWSサービスによる自動グラント作成
EBSやS3等のAWSサービスはCMK使用時に自動でグラントを作成する。
EBSボリュームにCMKを使用:
1. EC2がEBSボリュームを作成
2. EBSサービスプリンシパルが自動でKMSグラントを作成
3. EBSがそのグラントでボリュームを暗号化/復号
4. EC2インスタンス終了時にグラントが自動的にRetireされる
Redshift クラスターにCMKを使用:
→ Redshiftがグラントを自動作成
→ クラスター削除時に自動Retire
S3 SSE-KMS:
→ S3がアクセスのたびにKMSを呼び出す(グラントは常時維持)
グラントの委任(CreateGrant 権限)
グラントにCreateGrant操作を含めると、受益者がさらに別プリンシパルに権限を委任できる。
# 委任可能なグラントの作成
aws kms create-grant \
--key-id arn:aws:kms:ap-northeast-1:123456789012:key/xxx \
--grantee-principal arn:aws:iam::123456789012:role/ServiceRole \
--operations Decrypt GenerateDataKey CreateGrant \
--constraints '{
"EncryptionContextSubset": {
"Environment": "production"
}
}'
暗号化コンテキスト制約(Constraints):
EncryptionContextEquals: 完全一致の暗号化コンテキストのみ許可
EncryptionContextSubset: 指定したキー/値を含む場合のみ許可
→ グラントの適用範囲をさらに絞り込める
試験頻出ポイント
| シナリオ | 回答 |
|---|---|
| キーポリシー変更なしに一時的権限付与 | KMSグラント |
| グラント作成直後の即時利用 | グラントトークンを指定 |
| EBSがCMKを使って暗号化する仕組み | EBSがグラントを自動作成 |
| 緊急時にグラントを強制取り消し | RevokeGrant |
| グラントの通常終了 | RetireGrant |
まとめ
KMSグラントはキーポリシーを変更せずに動的・一時的なアクセス権限を付与する仕組みだ。AWSサービスが自動的に作成・削除を管理するため、ユーザーが意識することは少ないが、プログラムからの権限委任が必要な場合に有効な機能だ。