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

上次更新时间:2020 年 10 月 14 日

我想与其他 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 的服务才能使用它。有关更多信息,请参阅客户主密钥 (CMK)

解决方法

1.    如果您没有密钥,请按照创建基本密钥的说明进行操作。请务必在密钥的 KMS key ID 参数中指定 KMS CMK Amazon 资源名称 (ARN)。

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

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

3.    将权限附加到 IAM 身份,如以下所示:

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

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowGetSecretValue",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": [
                "arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret-??????"
            ]
        },
        {
            "Sid": "AllowKMSDecrypt",
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:your-region:Security_Account:key/DevSecretCMK_id"
            ]
        }
    ]
}

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

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

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

{
    "Sid": "AllowUseOfTheKey",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::Dev_Account:user/SecretsUser"
    },
    "Action": [
        "kms:Decrypt"
    ],
    "Resource": "*",
    "Condition": {
        "StringEquals": {
            "kms:ViaService": "secretsmanager.your-region.amazonaws.com"
        },
        "StringLike": {
            "kms:EncryptionContext:SecretARN": "arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret-??????"
        }
    }
}

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

5.    授予 IAM 实体访问密钥的权限。从 Security_Account 中,附加一个基于资源的策略,向 SecretsUser 授予检索 DevSecret 的权限。

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

6.    以 SecretsUser 的身份检索密钥。

注意:第 5 步中的策略显式要求引用 AWSCURRENT 版本阶段。与以下类似,无论 SecretsUser 在哪里检索到密钥,都必须显式要求此引用:

$ aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:your-region:Security_Account:secret:DevSecret --version-stage AWSCURRENT

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