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

2 分钟阅读
0

我想检索或访问 AWS Secrets Manager 密钥,但收到一个错误。

解决方案

如果无法检索或访问 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 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新版本的 AWS CLI

在访问其他账户中的密钥时,请确认密钥未使用 AWS KMS 托管式密钥进行加密。

无法编辑 AWS 托管式密钥策略,因为这些是只读策略。但是,您可以查看 AWS Key Management Service(AWS KMS)托管式密钥和客户自主管理型密钥策略。由于 AWS KMS 托管式密钥策略无法编辑,因此无法向这些密钥策略授予跨账户权限。其他 AWS 账户无法访问采用 AWS KMS 托管式密钥加密的 Secrets Manager 密钥。

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

身份策略应允许主体访问 AWS KMS 密钥,类似于以下内容:

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

基于资源的策略应允许主体访问 AWS 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 密钥后,验证密钥是否已使用新的 AWS KMS 密钥加密。

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

**注意:**默认情况下,使用 Secrets Manager 控制台更改与密钥关联的 AWS KMS 密钥会创建密钥的新版本,并使用新的 AWS KMS 密钥对其进行加密。有关详细信息,请参阅 Secret encryption and decryption in AWS Secrets Manager

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

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

AWS 管理控制台

1.    打开 Secrets Manager 控制台

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

3.    选择操作,然后选择下拉列表,选择 AWS KMS 密钥,选中使用新加密密钥创建新版本的密钥复选框,然后选择保存

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 命令,以重新加密加密密钥,如下所示:

.    **注意:**如果使用客户自主管理型密钥,则还必须对该密钥拥有 kms:GenerateDataKeykms:Decrypt 权限。

$ 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"}

相关信息

如何在 AWS Secrets Manager 控制台中使用基于资源的策略来安全地访问各个 AWS 账户的密钥

如何在 AWS 账户之间共享 AWS Secrets Manager 密钥?

不同账户中的用户对 AWS Secrets Manager 密钥的权限

AWS 官方
AWS 官方已更新 2 年前