🎫

AWS KMS グラント(Grants)

暗号キーへの「一時入室許可証」を理解しよう

動的なアクセス許可の仕組み

🎯 結論:グラントとは?

KMSキーへの 「一時的なアクセス許可証」 のこと。
IAMポリシーを変更せずに、プログラムから動的に権限を付与・取り消しできる仕組みです。

AWSサービス(EBS、RDS、Lambdaなど)がKMSキーを使うとき、
自動的にグラントが発行 されて一時的に暗号化・復号の権限が与えられます

📖 たとえ話で理解するグラント

🏨 グラント = ホテルの「一時入室カード」

高級ホテルの金庫室を想像してください。通常、金庫室に入れるのは正規スタッフ(IAMポリシーで許可された人)だけです。 でも、ルームサービスのスタッフが一時的に金庫室の物を取り出す必要があるとき... 「一時入室カード」(グラント) を発行して、限られた操作だけを許可します。

🔐

金庫室 = KMSキー

大切なデータを暗号化・復号する「秘密の鍵」が保管されている場所

👔

正規スタッフ = IAMポリシー

事前に登録された人だけが入れる。変更には人事部(管理者)の承認が必要

🎫

一時入室カード = グラント

必要なときだけ発行。「取り出し」だけ許可など、操作を限定できる

🍽️

ルームサービス = AWSサービス

EBS、RDS、Lambdaなど。一時的にキーを使う必要があるサービス

📊 グラントの仕組みを図解

🔄 グラントによるアクセス許可の流れ
👤 グラント発行者
(管理者・サービス)
➡️
📝 グラント作成
CreateGrant
➡️
🤖 グラント受領者
(Grantee Principal)
⬇️ グラントで許可された操作のみ実行可能
🔑

KMS キー

暗号化・復号の実行

⬇️ 暗号化されたデータ
💾 EBSボリューム
🗄️ RDSデータベース
📦 S3オブジェクト

⚖️ IAMポリシー vs グラント

📋 IAMポリシー

  • 静的な権限管理
    事前に設定、変更には管理者の操作が必要
  • 永続的
    削除するまで有効
  • 管理が必要
    ポリシーの作成・変更・削除は管理者が行う
  • ユーザー/ロール向け
    人やアプリケーションに直接付与
  • 広範な権限
    複数のキーや操作をまとめて許可できる

🎫 グラント

  • 動的な権限管理
    プログラムから即座に作成・取り消し可能
  • 一時的
    使い終わったら取り消すのがベストプラクティス
  • 自動化向き
    AWSサービスが自動で作成・管理
  • サービス向け
    EBS、RDSなどが一時的に使用
  • 特定の操作のみ
    必要最小限の権限だけを付与

💡 使い分けのポイント

IAMポリシー :ユーザーやアプリケーションが継続的にキーを使う場合
グラント :AWSサービスが一時的にキーを使う場合、または動的に権限を付与したい場合

🔧 グラントで許可できる操作

🔒

Encrypt

データを暗号化

🔓

Decrypt

データを復号

🔑

GenerateDataKey

データキーを生成

🔄

ReEncryptFrom/To

別のキーで再暗号化

🎫

CreateGrant

さらにグラントを作成

📋

DescribeKey

キー情報を取得

🗑️

RetireGrant

グラントを無効化

GenerateDataKeyWithoutPlaintext

暗号化済みキーのみ生成

📦 グラントの構成要素

要素 説明
Key ID 対象となるKMSキーのID arn:aws:kms:ap-northeast-1:123456789012:key/xxxx
Grantee Principal 権限を受け取るプリンシパル IAMロール、AWSサービス
Operations 許可する操作のリスト Decrypt, Encrypt
Retiring Principal グラントを無効化できるプリンシパル IAMユーザー、ロール
Constraints 追加の制約条件 暗号化コンテキストの制限
Grant Token グラント作成直後に使用するトークン 即時利用時に必要

🎯 グラントが使われる主なシーン

💾 EBSボリュームの暗号化

EC2インスタンスがEBSボリュームをアタッチするとき、EC2サービスがKMSキーへのグラントを自動作成。ボリュームのデータを復号できるようになります。

🗄️ RDSデータベースの暗号化

RDSインスタンスが暗号化されたデータベースを起動するとき、RDSサービスがグラントを取得。データの読み書き時に自動で暗号化・復号が行われます。

⚡ Lambda関数の実行

Lambda関数が暗号化された環境変数や、KMSで暗号化されたS3オブジェクトにアクセスするとき、一時的なグラントで復号権限を取得します。

🔄 クロスアカウントアクセス

別のAWSアカウントのサービスがKMSキーを使う必要があるとき、グラントで一時的なアクセス権を付与できます。

⚙️ グラントの動作フロー

1

グラントの作成

CreateGrant APIでグラントを作成。誰が(Grantee)、どのキーで、何の操作ができるかを指定します。AWSサービスの場合は自動で作成されます。

2

グラントトークンの発行

グラント作成直後は反映に数分かかる場合があります。即座に使いたい場合は「グラントトークン」を使って操作を実行します。

3

操作の実行

Granteeがグラントで許可された操作(Encrypt、Decryptなど)をKMSキーに対して実行できるようになります。

4

グラントの無効化(Retire)

使い終わったらRetireGrant APIでグラントを無効化。セキュリティのベストプラクティスとして、不要になったグラントは速やかに削除しましょう。

💻 AWS CLIでのグラント操作

📝 グラントの作成
# グラントを作成(Decrypt操作を許可) aws kms create-grant \ --key-id "arn:aws:kms:ap-northeast-1:123456789012:key/xxxx" \ --grantee-principal "arn:aws:iam::123456789012:role/MyAppRole" \ --operations "Decrypt" "GenerateDataKey"
📋 グラントの一覧表示
# キーに関連付けられたグラントを表示 aws kms list-grants \ --key-id "arn:aws:kms:ap-northeast-1:123456789012:key/xxxx"
🗑️ グラントの無効化
# グラントを無効化(retire) aws kms retire-grant \ --grant-token "AQpAM2..." # または grant-id を使用 aws kms revoke-grant \ --key-id "arn:aws:kms:ap-northeast-1:123456789012:key/xxxx" \ --grant-id "1234567890abcdef..."

⚠️ グラント利用時の注意点

⚡ 知っておくべきポイント

  • 反映時間 :グラント作成後、最大5分程度で反映。即座に使いたい場合はグラントトークンを使用
  • クォータ制限 :1つのKMSキーに対して最大10,000個までのグラントを作成可能
  • 自動作成 :EBS、RDSなどのサービスはグラントを自動作成するため、意図せず増える場合がある
  • クリーンアップ :不要なグラントは定期的に削除(retire/revoke)することを推奨
  • 監査 :グラントの作成・使用はCloudTrailでログが記録される

💡 ベストプラクティス

✅ 最小権限の原則:必要な操作のみを許可する
✅ 暗号化コンテキスト:制約条件(Constraints)を使って範囲を限定
✅ 定期的な棚卸し:list-grantsで不要なグラントがないか確認
✅ Retiring Principalの設定:誰がグラントを無効化できるか明確にする

📝 まとめ

KMSグラントは、暗号キーへの 「一時的な入室許可証」
AWSサービスが自動で使用し、動的な権限管理を実現します

🎫 一時的なアクセス許可 🤖 AWSサービスが自動作成 🔧 動的な権限管理 📋 IAMポリシーを補完 🔒 最小権限の実現

EBS、RDS、Lambdaなどを使っているなら、
裏側でグラントが活躍していることを覚えておきましょう! 🎉

Created by SSuzuki1063

AWS SAP Learning Resources