はじめに
AWS KMS のグラントという機能を実際に触ってみたので、その記録を残しておきます。
(AWS SCS-C03 の更新の学習であまり知らなかったので、備忘録として)
KMS グラントとは
KMS グラントは、KMS キーへのアクセス権限を他のAWSプリンシパルに一時的に付与するための仕組みです。
キーポリシーとの違い
- キーポリシー: 恒久的な権限設定。キー管理者が設定
- グラント: 一時的な権限付与。アプリケーションから動的に作成・削除可能
ユースケース
- アプリケーションが一時的に他のAWSサービスに暗号化権限を委譲する場合
- Lambda 関数が特定の KMS キーを使って暗号化/復号化する場合
- EC2 インスタンスが起動時のみ KMS キーにアクセスする必要がある場合
実際に試してみる
1. KMSキーの作成
まず検証用の KMS キーを作成します。
# KMSキーを作成
aws kms create-key \
--description "Test key for grant trial" \
--key-usage ENCRYPT_DECRYPT
# 出力からKeyIdをメモ
# 例: "KeyId": "12345678-1234-1234-1234-123456789012"
便利のため、メモしておいた KeyId を環境変数に設定しておきます。
export KEY_ID="your-key-id-here"
2. グラントの作成
IAM ロールまたはユーザーに対してグラントを作成してみます。
# 現在のユーザーARNを取得
GRANTEE_PRINCIPAL=$(aws sts get-caller-identity --query Arn --output text)
# グラントを作成
aws kms create-grant \
--key-id $KEY_ID \
--grantee-principal $GRANTEE_PRINCIPAL \
--operations Encrypt Decrypt DescribeKey
実行結果の例:
{
"GrantToken": "AQpAM2RhODc4...",
"GrantId": "abcd1234ef5678gh90i..."
}
GrantId を環境変数に保存しておきます。
export GRANT_ID="your-grant-id-here"
3. グラント一覧の確認
作成したグラントを確認してみます。
# キーに紐づくグラント一覧を取得
aws kms list-grants --key-id $KEY_ID
出力例:
{
"Grants": [
{
"KeyId": "arn:aws:kms:ap-northeast-1:123456789012:key/12345678-...",
"GrantId": "abcd1234...",
"GranteePrincipal": "arn:aws:iam::123456789012:user/testuser",
"Operations": [
"Encrypt",
"Decrypt",
"DescribeKey"
],
"CreationDate": "2025-02-15T12:34:56+09:00"
}
]
}
4. グラントを使った暗号化・復号化
グラントで付与された権限を使って実際に暗号化・復号化してみます。
# 平文ファイルを作成
echo -n "Hello KMS Grant" > plaintext.txt
# 暗号化(ファイルから読み込む)
aws kms encrypt \
--key-id $KEY_ID \
--plaintext fileb://plaintext.txt \
--output text \
--query CiphertextBlob | base64 --decode > encrypted.bin
# 復号化
aws kms decrypt \
--ciphertext-blob fileb://encrypted.bin \
--output text \
--query Plaintext | base64 --decode
結果:Hello KMS Grant が表示されればOK!
5. グラントの削除
検証が終わったらグラントを削除します。
aws kms revoke-grant \
--key-id $KEY_ID \
--grant-id $GRANT_ID
削除確認:
# グラント一覧を再確認(空になっているはず)
aws kms list-grants --key-id $KEY_ID
6. クリーンアップ
最後にKMSキーをスケジュール削除します。
# 7日後に削除されるようスケジュール
aws kms schedule-key-deletion \
--key-id $KEY_ID \
--pending-window-in-days 7
試してみてわかったこと
グラントの特徴
- 動的に作成可能: API経由でプログラマティックに権限付与できる
-
特定の操作のみ許可:
Encrypt,Decrypt,GenerateDataKeyなど、必要な操作だけを指定できる -
削除が容易:
revoke-grantで即座に削除可能 - グラントトークン: 作成直後はグラントトークンを使うことで即座に利用可能(伝搬待ちなし)
ユースケース例
実際の利用シーンとしては:
# Lambda関数が起動時にグラントを作成
GRANT_ID=$(aws kms create-grant ...)
# データ処理(暗号化/復号化)
aws kms encrypt ...
# 処理完了後にグラントを削除
aws kms revoke-grant --grant-id $GRANT_ID
このように、必要な時だけ権限を付与し、不要になったら即座に削除できるのが便利です。
まとめ
AWS KMS グラントは、キーポリシーよりも柔軟で動的な権限管理を実現できる機能でした。
- プログラマティックに権限付与・削除が可能
- 最小権限の原則に従った細かい操作制御
- 一時的なアクセス権限の付与に最適
特にアプリケーションから動的に暗号化キーへのアクセスを制御したい場合には、グラントを活用すると良さそうです。
