在 AWS 中跨主账号(Cross-Account)共享 KMS 密钥,核心在于**“双重授权”**:

  • 不仅要在账号 A 的 KMS 密钥策略(Key Policy) 中允许账号 B 访问
  • 还要在账号 B 的 IAM 策略 中给对应的子账号赋权

以下是实现步骤:

第一步:在账号 A 中配置 KMS 密钥策略

修改密钥 1 的策略,将账号 B(或其特定子账号)添加为“外部使用者”。

  1. 登录账号 A,进入 KMS 控制台。
  2. 选择密钥 1,点击 Key Policy (密钥策略) -> Edit
  3. 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 策略决定。

QQ_1772258479315

第二步:在账号 B 中配置 IAM 策略

即使账号 A 开了门,账号 B 下的子账号默认也没有权限去碰外部账号的密钥。

  1. 登录账号 B,找到需要使用密钥的子账号或角色。
  2. 为其附加(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"
        }
    ]
}

QQ_1772258622338

关键点与限制

  • 对称密钥 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

QQ_1772259551430

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