如何通过KMS Grants跨账户共享AWS KMS密钥以共享加密快照?
使用KMS Grants实现加密EBS快照跨账户共享
要通过KMS Grants替代密钥策略实现加密EBS快照的跨账户共享,你需要明确Grant的权限范围和正确参数配置——这和直接修改密钥策略的逻辑存在差异,以下是具体解决方案:
为什么你的尝试失败
- CreateGrant不支持授予ListGrants/RevokeGrant:这两个操作属于Grant的管理权限,仅能由KMS密钥管理员或Grant创建者执行,无法通过Grant将这类权限授予其他主体。
- 仅传CreateGrant参数无效:单独指定
kms:CreateGrant没有实际意义,EBS快照共享需要的是解密、生成数据密钥等核心操作权限,而非创建Grant的权限。
正确的Grant配置
要让目标账户正常使用共享的加密快照,需为其授予以下KMS操作权限,并添加AWS资源绑定约束:
kms:Decrypt:解密快照中的加密数据kms:DescribeKey:允许目标账户验证密钥基本信息kms:GenerateDataKey*:从快照创建新卷时,生成新的加密数据密钥
AWS CLI示例
aws kms create-grant \ --key-id <你的客户托管KMS密钥ARN> \ --grantee-principal arn:aws:iam::<目标账户ID>:root \ --operations "kms:Decrypt" "kms:DescribeKey" "kms:GenerateDataKey*" \ --constraints '{"Bool": {"kms:GrantIsForAWSResource": true}}' \ --name "EBS-Snapshot-Share-Grant"
参数说明
KeyId:替换为加密快照所用的客户托管KMS密钥ARNGranteePrincipal:目标AWS账户的root用户ARN(格式为arn:aws:iam::<账户ID>:root)Constraints:通过kms:GrantIsForAWSResource条件,确保该Grant仅用于AWS托管资源(如EBS),避免权限滥用Name:可选,自定义Grant名称,方便后续管理
关键注意事项
- 目标账户IAM策略需配合授权:虽然Grant已赋予权限,但IAM的显式拒绝会覆盖Grant权限,需确保目标账户的IAM实体(用户/角色)未被拒绝相关KMS操作。
- Grant生命周期管理:默认Grant无过期时间,可通过
--expiration-date参数设置过期时间,适配临时共享场景。 - Grant管理操作:你可通过
aws kms list-grants查看已创建的Grant,使用aws kms revoke-grant撤销无用权限,这些操作仅能由密钥管理员或Grant创建者执行。
内容的提问来源于stack exchange,提问作者Kerenz
相关产品推荐
相关产品推荐

