在 AWS 中跨主账号(Cross-Account)共享 KMS 密钥,核心在于**“双重授权”**:
- 不仅要在账号 A 的 KMS 密钥策略(Key Policy) 中允许账号 B 访问
- 还要在账号 B 的 IAM 策略 中给对应的子账号赋权
以下是实现步骤:
第一步:在账号 A 中配置 KMS 密钥策略#
修改密钥 1 的策略,将账号 B(或其特定子账号)添加为“外部使用者”。
- 登录账号 A,进入 KMS 控制台。
- 选择密钥 1,点击 Key Policy (密钥策略) -> Edit。
- 在
Statement 中添加如下配置(将 111122223333 替换为账号 B 的 ID):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| {
"Sid": "AllowCrossAccountUse",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::账号B的ID:root"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}
|
注意: Principal 指定为账号 B 的 root 意味着账号 A 信任账号 B,但具体的权限控制由账号 B 内部的 IAM 策略决定。

第二步:在账号 B 中配置 IAM 策略#
即使账号 A 开了门,账号 B 下的子账号默认也没有权限去碰外部账号的密钥。
- 登录账号 B,找到需要使用密钥的子账号或角色。
- 为其附加(Attach)一个自定义内联策略:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "arn:aws:kms:region:账号A的ID:key/密钥ID"
}
]
}
|

关键点与限制#
- 对称密钥 vs 非对称密钥:上述配置适用于大多数场景。如果是用于加密 EBS 卷等服务,通常还需要
kms:CreateGrant 权限。 - 不支持别名(Alias):跨账号调用时,不能使用
alias/my-key,必须使用 密钥的完整 ARN。 - 自动轮换:跨账号共享不影响密钥的自动轮换逻辑。
第三步:在账号 B 中使用账号 A 的 KMS 密钥#
AWS CLI 示例:
1
2
| # 注意:不能用 alias/my-key,必须用完整的 ARN
aws kms encrypt --key-id arn:aws:kms:ap-northeast-1:353472442111:key/5cfaf9cd-6159-4312-9449-7c57f075e628 --plaintext fileb://hello.txt --region ap-northeast-1 --profile myself-aws
|

–profile myself-aws的含义为指定AWS读取AWS凭据文件