AWS 跨账号 KMS 授权概述
跨账号 KMS(Key Management Service)授权允许一个 AWS 账户中的资源访问另一个 AWS 账户中的 KMS 密钥。这种机制在共享加密资源(如 S3 桶、EBS 卷或 Lambda 环境变量)时非常有用,同时保持密钥管理的集中控制。
跨账号 KMS 授权核心步骤
创建 KMS 密钥并配置权限策略
在密钥管理账户中创建 KMS 密钥,并在密钥策略中授予目标账户的访问权限。密钥策略需包含类似以下声明:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::目标账户ID:root"
},
"Action": [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
],
"Resource": "*"
}
]
}
目标账户 IAM 策略配置
在目标账户中,为需要访问 KMS 密钥的 IAM 角色或用户附加策略,明确允许对跨账号密钥的操作。例如:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": [
"kms:Encrypt",
"kms:Decrypt"
],
"Resource": "arn:aws:kms:区域:源账户ID:key/密钥ID"
}
}
资源级权限配置(如 S3 桶)
若目标账户的资源(如 S3 桶)需使用跨账号密钥,需在资源策略中声明。例如 S3 桶策略需包含:
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::目标账户ID:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::桶名/*",
"Condition": {
"StringEquals": {
"s3:x-amz-server-side-encryption": "aws:kms",
"s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:区域:源账户ID:key/密钥ID"
}
}
}
验证与监控
- 验证访问:通过目标账户的 IAM 实体尝试加密/解密操作,使用 AWS CLI 命令如:
aws kms encrypt --key-id arn:aws:kms:区域:源账户ID:key/密钥ID --plaintext fileb://明文文件 --output text --query CiphertextBlob
- 监控日志:启用 AWS CloudTrail 记录 KMS API调用,检查跨账号访问事件。
安全最佳实践
- 最小权限原则:仅授予必要的密钥操作权限(如仅
kms:Decrypt
而非完全权限)。 - 使用条件限制:在密钥策略中添加
Condition
块,限制访问来源 IP 或特定 IAM 角色。 - 定期审计:通过 IAM Access Analyzer 检查密钥策略中的外部账户权限。
通过以上步骤,可实现安全且可控的跨账号 KMS 密钥共享。