IAMポリシーでのKMSキーの復号化と暗号化アクションの許可設定について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
今回は、IAMのカスタム管理ポリシーが、特定のKMSキーで復号化(kms:Decrypt
)や再暗号化(kms:ReEncrypt*
)アクションを許可している状態について、そのリスクと対策を解説します。

リスク
AWS Key Management Service (KMS) は、暗号化キーを簡単に作成および管理するためのサービスです。IAMポリシーは、誰がどのアクションを実行できるかを定義しますが、KMSキーポリシーは、誰がどのキーにアクセスできるかを定義します。セキュリティのベストプラクティスは、最小特権の原則に従うことです。これは「IAMポリシーとKMSキーポリシーの両方で権限を制限する」という形で実装されます。
IAMのカスタム管理ポリシーで、KMSキーで復号化(kms:Decrypt
)や再暗号化(kms:ReEncrypt*
)を許可している場合、以下のような重大なリスクが発生します。
- 過剰な権限の付与: IAMカスタム管理ポリシーは、複数のIAMプリンシパル(ユーザー、グループ、ロール)にアタッチされる可能性があります。このポリシーでKMSキーへのアクセスを広範に許可してしまうと、そのポリシーを使用するすべてのプリンシパルが、本来アクセスすべきでない機密データまで復号化できるようになる可能性があります。これにより、データ漏洩のリスクが高まります。
- 権限管理の複雑化と追跡の困難さ: IAMポリシーとKMSキーポリシーの両方で権限を管理するのが最も安全な方法ですが、IAMポリシーでKMSアクションを許可すると、権限の管理が分散し、複雑になります。どのプリンシパルがどのキーにアクセスできるのかを追跡するのが難しくなり、セキュリティ監査が困難になります。
- 意図しないキーの使用: IAMポリシーで特定のKMSキーに限定されていない場合、ユーザーがデータに適さないキー(例えば、テスト環境のデータ用キーで本番環境のデータを復号化するなど)を意図せず使用してしまう可能性があります。これは、セキュリティの脆弱性や運用のミスにつながります。
対策
IAMのカスタム管理ポリシーでは、KMSキーへの復号化・再暗号化アクションを禁止し、代わりにKMSキーポリシーでこれらのアクションを許可することが、上記のすべてのリスクを軽減し、セキュリティを強化するための重要なベストプラクティスです。
- IAM管理ポリシーとKMSキーポリシーの役割を分離:
- IAMポリシーでは、特定のKMSキーの使用を必要とするIAMプリンシパルに、
kms:GenerateDataKey
などのアクションを許可します。しかし、kms:Decrypt
やkms:ReEncrypt*
といったアクションは許可しません。 - KMSキーポリシーでは、特定のIAMプリンシパルに対して、そのキーへの復号化アクセスを明示的に許可します。
- これにより、「どのユーザーが、どのキーに対して、どの操作を許可されているか」という権限の二重チェック体制が構築されます。
- IAMポリシーでは、特定のKMSキーの使用を必要とするIAMプリンシパルに、
- 最小特権の原則の徹底: KMSキーポリシーで許可するアクションは、特定のIAMプリンシパルに限定し、必要なアクションのみを明示的に指定します。
- IAM Access Analyzerの活用: IAM Access Analyzerを使用して、KMSキーへの意図しないアクセス許可がないかを定期的にレビューします。
ポリシーの説明
修復方法
IAMのカスタム管理ポリシーで、KMSキーへの復号化・再暗号化アクションを許可しているステートメントを削除し、代わりにKMSキーポリシーで権限を付与する方法は、AWSコンソールまたはTerraformで行えます。
AWSコンソールでの修復手順
AWSコンソールを使用して、IAMカスタム管理ポリシーから不要なKMSアクションを削除し、KMSキーポリシーを編集します。
ステップ 1: IAMカスタム管理ポリシーの編集
- IAMサービスへ移動: AWSコンソールにログインし、IAM サービスを開きます。
- ポリシーを選択: 左側のナビゲーションペインで「ポリシー」を選択します。 検索バーで、修正したいカスタム管理ポリシーを検索し、選択します。
- ポリシーの編集:
- ポリシーの詳細ページで、「ポリシーの編集」をクリックします。
- 「JSON」タブを選択します。
- JSON形式でポリシーを編集:
- 以下のJSONポリシーを例とします。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*"
],
"Resource": "arn:aws:kms:*:123456789012:key/mrk-1234567890abcdef"
}
]
}
- このポリシーから、
kms:Decrypt
とkms:ReEncrypt*
アクションを削除します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Encrypt",
"kms:GenerateDataKey*"
],
"Resource": "arn:aws:kms:*:123456789012:key/mrk-1234567890abcdef"
}
]
}
- 変更のレビューと保存:
- 編集したJSONを確認し、「変更の保存」をクリックします。
ステップ 2: KMSキーポリシーの編集
- KMSサービスへ移動: AWSコンソールでKMS サービスを開きます。
- キーを選択: 左側のナビゲーションペインで「カスタマー管理キー」を選択し、該当するKMSキーを選択します。
- キーポリシーの編集:
- キーの詳細ページで、「キーポリシー」タブに移動し、「編集」をクリックします。
- プリンシパルへの権限付与:
- JSON形式でポリシーが表示されます。ここに、対象のIAMプリンシパルが
kms:Decrypt
アクションを実行できるようにするステートメントを追加します。JSON{ "Sid": "Allow user to decrypt data", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/MySecureRole" }, "Action": [ "kms:Decrypt", "kms:ReEncryptFrom" ], "Resource": "*" }
- 変更内容を確認し、「変更の保存」をクリックします。
- JSON形式でポリシーが表示されます。ここに、対象のIAMプリンシパルが

これで、IAMポリシーでは復号化アクションが禁止され、権限の管理がKMSキーポリシーに一元化されます。
Terraformでの修復手順
TerraformでIAMカスタム管理ポリシーのJSONドキュメントを更新し、kms:Decrypt
やkms:ReEncrypt*
アクションを削除します。
# (既存の過剰な権限を持つIAM管理ポリシーの例)
resource "aws_iam_policy" "overly_permissive_policy" {
name = "overly-permissive-policy"
description = "An IAM policy with a wide range of KMS permissions"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow",
Action = [
"kms:Encrypt",
"kms:Decrypt", # **このアクションを削除**
"kms:ReEncrypt*", # **このアクションを削除**
"kms:GenerateDataKey*"
],
Resource = "arn:aws:kms:*:123456789012:key/mrk-1234567890abcdef"
}
]
})
}
# --- 修正後のIAM管理ポリシーの例 ---
resource "aws_iam_policy" "my_secure_kms_policy" {
name = "my-secure-kms-policy"
description = "A secure IAM policy for KMS actions"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow",
# **重要: 復号化/再暗号化アクションを削除**
Action = [
"kms:Encrypt",
"kms:GenerateDataKey*"
],
Resource = "arn:aws:kms:*:123456789012:key/mrk-1234567890abcdef"
}
]
})
}
# --- KMSキーポリシーの更新 ---
resource "aws_kms_key" "my_secure_key" {
description = "KMS key for application data"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "Enable IAM User Permissions",
Effect = "Allow",
Principal = {
AWS = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:root"
},
Action = "kms:*",
Resource = "*"
},
# **重要: 権限を付与したいIAMプリンシパルをキーポリシーに追加**
{
Sid = "Allow application role to decrypt"
Effect = "Allow"
Principal = {
AWS = aws_iam_role.my_app_role.arn
},
Action = [
"kms:Decrypt",
"kms:ReEncryptFrom"
],
Resource = "*"
}
]
})
}
# 権限を付与したいIAMロールの定義
resource "aws_iam_role" "my_app_role" {
name = "my-app-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Principal = {
Service = "ec2.amazonaws.com"
}
Action = "sts:AssumeRole"
}
]
})
}
上記のTerraformコードでは、aws_iam_policy
リソースのJSONポリシーから、kms:Decrypt
やkms:ReEncrypt*
アクションを削除し、代わりにaws_kms_key
リソースのpolicy
パラメータで、これらのアクションを特定のIAMロールに許可しています。
terraform apply
を実行することで、IAMポリシーが更新され、KMSキーポリシーが変更され、よりセキュアな権限管理体制が構築されます。
最後に
この記事では、IAMのカスタム管理ポリシーでKMSキーへの復号化・再暗号化アクションを許可することのリスクと、それをKMSキーポリシーで管理することの重要性について解説しました。権限の管理をKMSキーポリシーに一元化することで、最小特権の原則を徹底し、より安全で追跡しやすいセキュリティ体制を構築できます。
貴社のIAMポリシーは、KMSキーへの復号化アクセスを許可していませんか?この機会にぜひ設定を確認・強化してみてください。
こちらの内容の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。運用が非常にラクに出来る製品になっていますのでぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。