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

上次更新时间:2019 年 7 月 17 日

我想与其他 AWS 账户共享我的 AWS Secrets Manager 密钥。我该如何操作?  

简短描述

在本示例中,Security_Account 用户会管理您的凭证,而 Dev_Account 用户由开发人员使用。AWS Identity and Access Management (IAM) 用户或在您 Dev_Account 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例中运行的应用程序会检索 Security_Account 用户账户中的密钥。您可以对密钥使用基于资源的策略,它允许您将权限策略附加到密钥。您可以使用此策略来允许 Dev_Account 中的 IAM 实体访问 Security_Account 中的密钥。

您的 Security_Account 中名为 DevSecret 的密钥使用客户主密钥 (CMK) DevSecretCMK 进行加密。然后,该密钥会与您的 Dev_Account 进行共享。

注意:您不能将 CMK 默认密钥用于该账户。CMK 默认密钥由与 AWS Key Management Service (KMS) 集成的 AWS 服务代表您创建、管理和使用。CMK 默认密钥在您的 AWS 账户和区域中具有唯一性。只有创建 AWS 托管 CMK 的服务才能使用它。有关更多信息,请参阅客户主密钥

解决方法

重要提示:开始之前,您必须已经安装配置了 AWS 命令行界面 (AWS CLI)。

1.    如果您没有密钥,请按照创建基本密钥的说明进行操作。请务必在 --kms-key-id 参数中指定 KMS CMK ARN。

2.    如果您有使用别名的现有密钥,请按照修改密钥的说明进行操作。请务必在 --kms-key-id 参数中指定 KMS CMK ARN。

注意:您必须使用完整的 KMS 密钥 ARN 才能从其他 AWS 账户访问密钥。

3.    将权限附加到 IAM 身份的命令如下所示:

注意:请将 your-region 替换为您的 AWS 区域

{
      "Version" : "2012-10-17",
      "Statement" : [
        {
          "Effect": "Allow",
          "Action": "secretsmanager:GetSecretValue",
          "Resource": " arn:aws:secretsmanager:us-west-2:Security_Account:secret:DevSecret"
        },
        {
          "Effect": "Allow",
          "Action": "kms:Decrypt",
          "Resource": "arn:aws:kms:your-region:Security_Account:key/DevSecretCMK"
        }
      ]
}

Dev_Account 中的 IAM 用户 SecretsUser 会检索密钥。SecretsUser 必须拥有 secretsmanager:GetSecretValue 权限。SecretsUser 必须具有 AWS 解密权限,因为 DevSecret 是使用 DevSecretKey 加密的。

4.    在 CMK 密钥策略中授予权限。默认情况下,Secrets Manager 会加密密钥。检索这些密钥的身份需要具有解密权限。由于 DevSecret 是使用 DevSecretCMK 加密的,因此您必须通过添加以下权限来更新密钥策略

{
       "Sid": "AllowUseOfTheKey",
       "Effect": "Allow",
       "Principal": 
               {"AWS": "arn:aws:iam::Dev_Account:user/SecretsUser"},
       "Action": [
       "kms:Decrypt",
       "kms:DescribeKey"
        ],
       "Resource": "arn:aws:kms:your-region:Security_Account:key/DevSecretCMK"
}

此策略可授予 SecretsUser 使用 DevSecretCMK 的权限。此策略还会使 SecretsUser 能够在 DevSecretCMK 中使用 decrypt 和 describe-key 命令。

5.    授予 IAM 实体访问密钥的权限。从 Security_Account 中,附加基于资源的策略,向 SecretsUser 授予检索 DevSecret 的权限。您可以将以下策略复制到 -ResourcePolicySecret.json 文件中以授予权限。

注意:目前,此基于资源的策略只能附加到使用 AWS CLI 或 AWS 开发工具包的密钥。

{
  "Version" : "2012-10-17",
  "Statement" : [
    {
      "Effect": "Allow",
       "Principal": {"AWS": "arn:aws:iam::Dev_Account:user/SecretsUser"},
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "*",
      "Condition": {"ForAnyValue:StringEquals": {"secretsmanager:VersionStage": "AWSCURRENT"}}
    }
  ]
}

6.    将基于资源的策略附加到 DevSecret:

$aws secretsmanager put-resource-policy --secret-id DevSecret --resource-policy file://ResourcePolicySecret.json

7.    以 SecretsUser 的身份检索密钥:

$aws secretsmanager get-secret-value --secret-id 
arn:aws:secretsmanager:us-west-2:Security_Account:secret:DevSecret 
--version-stage AWSCURRENT

注意:您可以将这些说明用于所有 IAM 实体。例如,对于 Amazon EC2 实例配置文件或角色,应在资源策略中替换或添加 Amazon 资源名称 (ARN),并编辑附加到 IAM 实体的权限。