如何解决访问加密的 AWS Secrets Manager 密钥时遇到的问题?

上次更新日期:2022 年 3 月 23 日

我尝试检索或访问一个 AWS Secrets Manager 密钥,但收到了与以下类似的错误消息:

  • “You can't access a secret from a different AWS account if you encrypt the secret with the default KMS service key.(如果您使用原定设置 KMS 服务密钥对密钥进行加密,则无法从其他 AWS 账户访问该密钥。)”
  • “Access to KMS is not allowed(不允许访问 KMS)”、“InternalFailure(内部故障)”或“An unknown error occurred(出现未知错误)”
  • “Access to KMS is not allowed.This version of secret is not encrypted with the current KMS key.(不允许访问 KMS。此版本的密钥未使用当前 KMS 密钥加密。)”

解决方法

注意:如果您在运行 AWS Command Line Interface(AWS CLI)命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

在访问其他账户中的密钥时,验证密钥未使用 AWS Key Management Service(AWS KMS)托管密钥加密。

无法编辑 AWS 托管密钥策略,因为它们是只读的,但您可以查看 AWS 托管密钥策略和客户托管密钥策略。由于 AWS 托管 KMS 密钥策略无法编辑,因此无法向这些密钥策略赋予跨账户权限。其他 AWS 账户无法访问使用 AWS 托管 KMS 密钥进行加密的 Secrets Manager 密钥。

对于跨账户,验证基于身份的策略和基于资源的策略是否允许主体访问 KMS 密钥。

身份策略应允许主体访问 KMS 密钥,如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:Region:AccountID:key/EncryptionKey"
    }
  ]
}

基于资源的策略应允许主体访问 KMS 密钥,如下所示:

{
  "Effect": "Allow",
  "Principal": {
    "AWS": [
      "arn:aws:iam::AccountID:user/UserName",
      "arn:aws:iam::AccountID:role/RoleName"
    ]
  },
  "Action": [
    "kms:Decrypt",
    "kms:DescribeKey"
  ],
  "Resource": "*"
}

更新 KMS 密钥后,验证密钥是否已使用新的 KMS 密钥加密。

使用 AWS CLI 更新与 Secrets Manager 密钥关联的 KMS 密钥不会使用新的 KMS 密钥重新加密当前或以前版本的密钥。这意味着,由于该密钥尚未使用新的 KMS 密钥重新加密,外部账户(也可以说跨账户)无法访问该密钥。您必须使用新的 AWS KMS 密钥重新加密该密钥,才能从跨账户中检索到该密钥的值。

注意:默认情况下,使用 Secrets Manager 控制台更改与密钥关联的 KMS 密钥会创建新版本的密钥,并使用新的 KMS 密钥对其进行加密。有关更多信息,请参阅密钥加密和解密

使用新的 KMS 密钥重新加密密钥。

按照以下步骤使用 AWS 管理控制台或 AWS CLI 使用新的 KMS 密钥重新加密密钥。

AWS 管理控制台

1.    打开 Secrets Manager 控制台

2.    在密钥名称中,选择您的密钥。

3.    选择 Actions(操作),然后选择下拉列表,选择 KMS 密钥,选中 Create new version of secret with new encryption key(使用新加密密钥创建密钥的新版本)复选框,然后选择 Save(保存)。

AWS CLI

在密钥所在的源账户中执行以下步骤。

1.    运行 AWS CLI 命令 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"}

2.    创建一个名为 creds.txt 的文件。

$ cat creds.txt

    {"CrossAccount":"DefaultEncryption"}

3.    运行 AWS CLI 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"
    }

4.    在跨账户中运行 AWS CLI 命令 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"}