我试图检索或访问加密的 AWS Secrets Manager 密钥,但我收到了 AWS Key Management Service (AWS KMS) 密钥访问错误。
解决方法
如果由于 AWS KMS 密钥权限问题而无法检索或访问 Secrets Manager 密钥,则可能会收到以下错误之一:
- “You can't access a secret from a different AWS account if you encrypt the secret with the default KMS service key.”
- “Access to KMS is not allowed”
- “InternalFailure”
- “An unknown error occurred”
- “Access to KMS is not allowed.This version of secret is not encrypted with the current KMS key.”
要解决此问题,请使用正确的权限更新 AWS KMS 密钥策略以检索加密密钥。然后,使用更新的 AWS KMS 密钥重新加密密钥。
**注意:**如果在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
AWS KMS 托管密钥
要访问其他账户中的密钥,请验证密钥是否未使用 AWS KMS 托管式密钥进行加密。您无法从其他账户访问 AWS KMS 托管式密钥加密的密钥。
由于它们是只读的,因此您无法编辑 AWS 托管式密钥策略。因此,您无法为 AWS 托管式密钥策略授予跨账户权限。
跨账户访问
对于跨账户,请验证基于身份的策略和基于资源的策略是否显式允许主体访问 AWS KMS 密钥。
允许主体访问 AWS KMS 密钥的身份策略示例:
{ "Version": "2012-10-17", "Statement": [
{
"Effect": "Allow",
"Action": "kms:Decrypt",
"Resource": "arn:aws:kms:Region:AccountID:key/EncryptionKey"
}
]
}
允许主体访问 AWS KMS 密钥的基于 KMS 资源的策略示例:
{ "Effect": "Allow", "Principal": {
"AWS": [
"arn:aws:iam::AccountID:user/UserName",
"arn:aws:iam::AccountID:role/RoleName"
]
},
"Action": [
"kms:Decrypt",
"kms:DescribeKey"
],
"Resource": "*"
}
使用更新后的 AWS KMS 密钥重新加密密钥
使用 Secrets Manager 控制台或 AWS CLI 通过更新后的 AWS KMS 密钥重新加密密钥。
Secrets Manager 控制台
**注意:**如果您使用 Secrets Manager 控制台,则 Secrets Manager 会创建密钥的新版本并使用更新后的密钥对其进行加密。确保使用密钥的应用程序有权使用更新的密钥解密密钥。有关详细信息,请参阅在 Secrets Manager 中加密和解密密钥。
- 打开 Secrets Manager 控制台。
- 对于 Secret name(密钥名称),选择您的密钥。
- 选择 Actions(操作),然后选择 Edit encryption key(编辑加密密钥)。
- 选择 Create new version of secret with new encryption key(使用新加密密钥创建新版本的密钥),然后选择 Save(保存)。
AWS CLI
从密钥所在的源账户完成步骤 1-3,从其他账户完成步骤 4:
-
运行 get-secret-value 命令以获取密钥值:
aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --query SecretString --output text {"CrossAccount":"DefaultEncryption"}
-
创建名为 creds.txt 的文件:
cat creds.txt {"CrossAccount":"DefaultEncryption"}
-
运行 update-secret 命令以重新加密加密密钥:
aws secretsmanager update-secret --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --secret-string file://creds.txt {
"ARN": "arn:aws:secretsmanager:us-east-1:123456789012:cross-account",
"Name": "cross-account",
"VersionId": "f68246e8-1cfb-4c3b-952b-17c9298d3462"
}
****注意:****如果使用客户自主管理型密钥,则还必须对该密钥拥有 kms:GenerateDataKey 和 kms:Decrypt 权限。
-
从其他账户运行 get-secret-value 命令:
aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:us-east-1:123456789012:secret:cross-account --version-stage AWSCURRENT --profile {"CrossAccount":"DefaultEncryption"}
相关信息
如何在 AWS Secrets Manager 控制台中使用基于资源的策略来安全地访问各个 AWS 账户的密钥
如何在 AWS 账户之间共享 AWS Secrets Manager 密钥?
从其他账户访问 AWS Secrets Manager 密钥