SJ blog
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サービスが自動的に作成・削除を管理するため、ユーザーが意識することは少ないが、プログラムからの権限委任が必要な場合に有効な機能だ。