将 Secrets Manager 与 VPC 终端节点结合使用 - AWS Secrets Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

将 Secrets Manager 与 VPC 终端节点结合使用

以下几节介绍了这些任务:

  • 连接 Secrets Manager 和 VPC 终端节点。

  • 创建 Secrets Manager VPC 终端节点。

  • 为 Secrets Manager 终端节点创建终端节点策略。

有关 VPC 终端节点的信息,请参阅的 VPC 服务文档中的 VPC 终端节点一文。

通过 VPC 终端节点连接到 Secrets Manager

您可以通过在 VPC 中配置的私有终端节点直接连接到 Secrets Manager,而不是将 VPC 连接到 Internet。在使用 VPC 服务终端节点时,VPC 和 Secrets Manager 之间的通信完全在 AWS 网络中进行,而不需要访问公有 Internet。

Secrets Manager 支持 AWS PrivateLink 提供的 Amazon VPC 接口终端节点。一个或多个 VPC 终端节点由您的 VPC 子网中一个或多个使用私有 IP 地址的弹性网络接口代表。

VPC 接口终端节点将您的 VPC 直接连接到 Secrets Manager,而无需 NAT 设备、VPN 连接或 AWS Direct Connect 连接。VPC 中的实例不需要使用公有 IP 地址以与 Secrets Manager 进行通信。

要使您的 Lambda 轮换函数可以查找私有终端节点,请执行以下步骤之一:

  • 您可在 Secrets Manager API 操作AWS CLI 命令中手动指定 VPC 终端节点。例如,以下命令使用 endpoint-url 参数在 Secrets Manager 的 AWS CLI 命令中指定 VPC 终端节点。

    $ aws secretsmanager list-secrets --endpoint-url https://vpce-1234a5678b9012c-12345678.secretsmanager.us-west-2.vpce.amazonaws.com
  • 如果为 VPC 私有终端节点启用私有 DNS 主机名,则不需要指定终端节点 URL。默认情况下,Secrets Manager CLI 和开发工具包使用的标准 Secrets Manager DNS 主机名 (https://secretsmanager.<region>.amazonaws.com) 自动解析为您的 VPC 终端节点。

您还可以使用 AWS CloudTrail 日志来审核您通过 VPC 终端节点使用密钥的情况。此外,您还可以使用 IAM 中的条件和基于资源的密钥策略,以拒绝访问不是来自于指定的 VPC 或 VPC 终端节点的任何请求。

注意

根据您的 VPC 终端节点创建 IAM 和密钥策略时要小心。如果策略语句要求请求来自于特定的 VPC 或 VPC 终端节点,则来自代表您与密钥交互的其他 AWS 服务的请求可能会失败。有关帮助信息,请参阅在具有 Secrets Manager 权限的策略中使用 VPC 终端节点条件

区域

Secrets Manager 支持 Amazon VPCSecrets Manager 在其中均可用的所有 AWS 区域中的 VPC 端点。

创建 Secrets Manager VPC 私有终端节点

创建 Secrets Manager VPC 私有终端节点

请按照以下选项卡之一中的步骤进行操作:

使用 AWS 管理控制台
  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航栏中,使用区域选择器来选择区域。

  3. 在导航窗格中,选择 Endpoints。在主窗格中,选择创建终端节点

  4. 对于服务类别,选择 AWS 服务

  5. 服务名称 列表中,选择区域中 Secrets Manager 接口终端节点的条目。例如,在美国东部 (弗吉尼亚北部) 区域,条目名称是 com.amazonaws.us-east-1.secretsmanager

  6. 对于 VPC,选择您的 VPC。

  7. 对于子网,请从每个可用区中选择一个要包括的子网。

    VPC 终端节点可以跨越多个可用区。AWS 为您选择的每个子网中的 VPC 终端节点创建一个弹性网络接口。每个网络接口有一个 DNS 主机名和私有 IP 地址。

  8. 默认情况下,AWS 启用启用私有 DNS 名称选项,标准 Secrets Manager DNS 主机名 (https://secretsmanager.<region>.amazonaws.com) 自动解析为您的 VPC 终端节点。此选项可让您更轻松地使用 VPC 终端节点。默认情况下,Secrets Manager CLI 和开发工具包使用标准 DNS 主机名,因此您不需要在应用程序和命令中指定 VPC 终端节点 URL。

    只有在您将 VPC 的 enableDnsHostnamesenableDnsSupport 属性设置为 true(默认值)时,该功能才会正常工作。要设置这些属性,请为您的 VPC 更新 DNS 支持

  9. 对于安全组,选择或创建一个安全组。

    您可以使用安全组来控制对您的终端节点的访问,就像您使用防火墙一样。

  10. 选择创建终端节点

结果显示 VPC 终端节点,包括 VPC 终端节点 ID 以及用于连接到 VPC 终端节点的 DNS 名称。

您也可以使用 Amazon VPC 工具来查看和管理终端节点。这包括创建终端节点的通知、更改终端节点的属性以及删除终端节点。有关说明,请参阅接口 VPC 终端节点

使用 AWS CLI 或开发工具包操作

您可以在 AWS CLI 中使用 create-vpc-endpoint 命令创建连接到 Secrets Manager 的 VPC 终端节点。

请确保使用 interface 作为 VPC 终端节点类型。此外,还要使用包含 secretsmanager 和 VPC 所在的区域的服务名称值。

命令不包括 PrivateDnsNames 参数,因为 VPC 默认为值 true。要禁用选项,您可以包含值为 false 的参数。仅当您的 VPC 的 enableDnsHostnamesenableDnsSupport 属性设置为 true 时,私有 DNS 名称才可用。要设置这些属性,请使用 ModifyVpcAttribute API。

下图显示了此命令的一般语法。

aws ec2 create-vpc-endpoint --vpc-id <vpc id> \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.<region>.secretsmanager \ --subnet-ids <subnet id> \ --security-group-id <security group id>

例如,以下命令使用位于 us-west-2 区域中的 VPC ID vpc-1a2b3c4d 在 VPC 中创建一个 VPC 终端节点。它只指定一个子网 ID 来表示可用区,但您可以指定多个 ID。VPC 终端节点需要安全组 ID。

输出包括可用于连接到新 VPC 终端节点的 VPC 终端节点 ID 和 DNS 名称。

$ aws ec2 create-vpc-endpoint --vpc-id vpc-1a2b3c4d \ --vpc-endpoint-type Interface \ --service-name com.amazonaws.us-west-2.secretsmanager \ --subnet-ids subnet-e5f6a7b8c9 \ --security-group-id sg-1a2b3c4d { "VpcEndpoint": { "PolicyDocument": "{\n \"Statement\": [\n {\n \"Action\": \"*\", \n \"Effect\": \"Allow\", \n \"Principal\": \"*\", \n \"Resource\": \"*\"\n }\n ]\n}", "VpcId": "vpc-1a2b3c4d", "NetworkInterfaceIds": [ "eni-abcdef12" ], "SubnetIds": [ "subnet-e5f6a7b8c9" ], "PrivateDnsEnabled": true, "State": "pending", "ServiceName": "com.amazonaws.us-west-2.secretsmanager", "RouteTableIds": [], "Groups": [ { "GroupName": "default", "GroupId": "sg-1a2b3c4d" } ], "VpcEndpointId": "vpce-1234a5678b9012c", "VpcEndpointType": "Interface", "CreationTimestamp": "2018-06-12T20:14:41.240Z", "DnsEntries": [ { "HostedZoneId": "Z7HUB22UULQXV", "DnsName": "vpce-1234a5678b9012c-12345678.secretsmanager.us-west-2.vpce.amazonaws.com" }, { "HostedZoneId": "Z7HUB22UULQXV", "DnsName": "vpce-1234a5678b9012c-12345678-us-west-2a.secretsmanager.us-west-2.vpce.amazonaws.com" }, { "HostedZoneId": "Z1K56Z6FNPJRR", "DnsName": "secretsmanager.us-west-2.amazonaws.com" } ] } }

连接到 Secrets Manager VPC 私有终端节点

由于在默认情况下,VPC 在您创建 VPC 私有终端节点时自动启用私有 DNS 名称,在为您的区域使用标准终端节点 DNS 名称之外,您无需执行任何操作。终端节点 DNS 名称自动解析为 VPC 中的正确终端节点:

https://secretsmanager.<region>.amazonaws.com

默认情况下,AWS CLI 和开发工具包使用此主机名,因此您可以开始使用 VPC 终端节点,而无需在您的脚本和应用程序中更改任何内容。

如果您未启用私有 DNS 名称,您仍然可以使用完整 DNS 名称连接到终端节点。

例如,此 list-secrets 命令使用 endpoint-url 参数指定 VPC 私有终端节点。要使用类似命令,请将示例中的 VPC 私有终端节点 ID 替换为您账户中的 ID。

aws secretsmanager list-secrets --endpoint-url https://vpce-1234a5678b9012c-12345678.secretsmanager.us-west-2.vpce.amazonaws.com

在策略语句中使用 VPC 私有终端节点

您可以使用 IAM 策略和 Secrets Manager 密钥策略来控制对您密钥的访问。还可以使用全局条件键来基于请求中的 VPC 终端节点或 VPC 限制这些策略。

  • 使用 aws:sourceVpce 条件键基于 VPC 终端节点授予或限制对密钥的访问。

  • 使用 aws:sourceVpc 条件键基于托管私有终端节点的 VPC 授予或限制对密钥的访问。

注意

根据您的 VPC 终端节点创建 IAM 和密钥策略时要小心。如果策略语句要求请求来自于特定的 VPC 或 VPC 终端节点,则代表您访问密钥的其他 AWS 服务的请求可能会失败。有关更多信息,请参阅在具有 Secrets Manager 权限的策略中使用 VPC 终端节点条件

此外,当请求来自 Amazon VPC 终端节点时,aws:sourceIP 条件键也不起作用。要限制对 VPC 终端节点的请求,请使用 aws:sourceVpceaws:sourceVpc 条件键。有关更多信息,请参阅 Amazon VPC 用户指南 中的 VPC 终端节点 – 控制终端节点的使用

例如,以下示例密钥策略仅在请求来自指定的 VPC 终端节点时,才允许用户执行 Secrets Manager 操作。

在用户向 Secrets Manager 发送请求时,Secrets Manager 将请求中的 VPC 终端节点 ID 与策略中的 aws:sourceVpce 条件键值进行比较。如果它们不匹配,则 Secrets Manager 拒绝请求。

要使用类似这样的策略,请将占位符 AWS 账户 ID 和 VPC 终端节点 ID 替换为您账户中的有效值。

{ "Id": "example-policy-1", "Version": "2012-10-17", "Statement": [ { "Sid": "EnableSecretsManagerpermissions", "Effect": "Allow", "Principal": {"AWS":["123456789012"]}, "Action": ["secretsmanager:*"], "Resource": "*" }, { "Sid": "RestrictGetSecretValueoperation", "Effect": "Deny", "Principal": "*", "Action": ["secretsmanager:GetSecretValue"], "Resource": "*", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpce-1234a5678b9012c" } } } ] }

您还可以使用 aws:sourceVpc 条件键,以根据 VPC 终端节点所在的 VPC 限制对密钥的访问。

以下示例密钥策略仅允许来自 vpc-12345678 的命令创建和管理密钥。此外,只有在请求来自于 vpc-2b2b2b2b 时,该策略才允许使用访问密钥的加密值的操作。如果您在一个 VPC 中运行应用程序,但使用第二个隔离的 VPC 以提供管理功能,则可能会使用此类策略。

要使用类似这样的策略,请将占位符 AWS 账户 ID 和 VPC 终端节点 ID 替换为您账户中的有效值。

{ "Id": "example-policy-2", "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAdministrativeActionsfromONLYvpc-12345678", "Effect": "Allow", "Principal": {"AWS": "123456789012"}, "Action": [ "secretsmanager:Create*", "secretsmanager:Put*", "secretsmanager:Update*", "secretsmanager:Delete*","secretsmanager:Restore*", "secretsmanager:RotateSecret","secretsmanager:CancelRotate*", "secretsmanager:TagResource","secretsmanager:UntagResource" ], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpc": "vpc-12345678" } } }, { "Sid": "AllowSecretValueAccessfromONLYvpc-2b2b2b2b", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": ["secretsmanager:GetSecretValue"], "Resource": "*", "Condition": { "StringEquals": { "aws:sourceVpc": "vpc-2b2b2b2b" } } }, { "Sid": "AllowReadActionsEverywhere", "Effect": "Allow", "Principal": {"AWS": "111122223333"}, "Action": [ "secretsmanager:Describe*","secretsmanager:List*","kms:GetRandomPassword" ], "Resource": "*", } ] }

为 Secrets Manager VPC 终端节点创建终端节点策略

在创建 Secrets Manager VPC 终端节点后,您可以附加一个终端节点策略以控制终端节点上的密钥相关活动。例如,您可以附加终端节点策略来定义执行的 Secrets Manager 操作、对密钥执行的操作、执行这些操作的 IAM 用户或角色以及通过 VPC 终端节点访问的账户。有关终端节点策略的其他信息(包括支持终端节点策略的 AWS 服务列表),请参阅使用 VPC 终端节点策略

注意

AWS 不会在 AWS 服务之间共享 VPC 终端节点。如果您将 VPC 终端节点用于多个 AWS 服务(例如 Secrets Manager 和 S3),则必须向每个终端节点附加一个独特的策略。

示例:为特定账户启用对 Secrets Manager 终端节点的访问

以下示例向账户 123456789012 中的所有用户和角色授予访问权限。

{ "Statement": [ { "Sid": "AccessSpecificAccount", "Principal": {"AWS": "123456789012"}, "Action": "secretsmanager:*", "Effect": "Allow", "Resource": "*" } ] }

示例:启用对 Secrets Manager 终端节点上的单个密钥的访问

以下示例仅限制对指定密钥的访问。

{ "Statement": [ { "Principal": "*", "Action": "secretsmanager:*", "Effect": "Allow", "Resource": [ "arn:aws-cn:secretsmanager:us-west:123456789012:secret:a_specific_secret_name-a1b2c3" ] } ] }

审核 Secrets Manager VPC 终端节点的使用

当对 Secrets Manager 的请求使用 VPC 终端节点时,VPC 终端节点 ID 出现在记录该请求的 AWS CloudTrail 日志条目中。您可以使用终端节点 ID 来审核您的 Secrets Manager VPC 终端节点的使用情况。

例如,此示例日志条目记录了使用 VPC 终端节点的 GenerateDataKey 请求。在此示例中,vpcEndpointId 字段显示在日志条目的结尾。为简洁起见,示例中省略了许多不相关的部分。

{ "eventVersion":"1.05", "userIdentity": { "type": "IAMUser", "arn": "arn:aws-cn:iam::123456789012:user/Anika", "accountId": "123456789012", "userName": "Anika" }, "eventTime":"2018-01-16T05:46:57Z", "eventSource":"secretsmanager.amazonaws.com", "eventName":"GetSecretValue", "awsRegion":"us-west-2", "sourceIPAddress":"172.01.01.001", "userAgent":"aws-cli/1.14.23 Python/2.7.12 Linux/4.9.75-25.55.amzn1.x86_64 botocore/1.8.27", "requestID":"EXAMPLE1-90ab-cdef-fedc-ba987EXAMPLE", "eventID":"EXAMPLE2-90ab-cdef-fedc-ba987EXAMPLE", "readOnly":true, "eventType":"AwsApiCall", "recipientAccountId":"123456789012", "vpcEndpointId": "vpce-1234a5678b9012c" }