0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS KMS グラントを試してみた

0
Last updated at Posted at 2026-02-15

はじめに

AWS KMS のグラントという機能を実際に触ってみたので、その記録を残しておきます。
(AWS SCS-C03 の更新の学習であまり知らなかったので、備忘録として)

KMS グラントとは

KMS グラントは、KMS キーへのアクセス権限を他のAWSプリンシパルに一時的に付与するための仕組みです。

unnamed (4).png

キーポリシーとの違い

  • キーポリシー: 恒久的な権限設定。キー管理者が設定
  • グラント: 一時的な権限付与。アプリケーションから動的に作成・削除可能

ユースケース

  • アプリケーションが一時的に他の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

試してみてわかったこと

グラントの特徴

  1. 動的に作成可能: API経由でプログラマティックに権限付与できる
  2. 特定の操作のみ許可: Encrypt, Decrypt, GenerateDataKeyなど、必要な操作だけを指定できる
  3. 削除が容易: revoke-grantで即座に削除可能
  4. グラントトークン: 作成直後はグラントトークンを使うことで即座に利用可能(伝搬待ちなし)

ユースケース例

実際の利用シーンとしては:

# Lambda関数が起動時にグラントを作成
GRANT_ID=$(aws kms create-grant ...)

# データ処理(暗号化/復号化)
aws kms encrypt ...

# 処理完了後にグラントを削除
aws kms revoke-grant --grant-id $GRANT_ID

このように、必要な時だけ権限を付与し、不要になったら即座に削除できるのが便利です。

まとめ

AWS KMS グラントは、キーポリシーよりも柔軟で動的な権限管理を実現できる機能でした。

  • プログラマティックに権限付与・削除が可能
  • 最小権限の原則に従った細かい操作制御
  • 一時的なアクセス権限の付与に最適

特にアプリケーションから動的に暗号化キーへのアクセスを制御したい場合には、グラントを活用すると良さそうです。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?