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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

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

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

  • 创建 Secrets Manager VPC 终端节点。

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

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

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

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

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

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

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

  • 您 VPC 在Secrets Manager API 操作Amazon CLI命令。例如,下面的命令使用终端节点 url参数指定 VPC 终端节点Amazon CLI命令设置为 Secrets Manager。

    $ 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 终端节点。

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

注意

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

区域

Secrets Manager 支持 VPC 终端节点Amazon区域Amazon VPCSecrets Manager可用。

创建 Secrets Manager VPC 私有终端节点

创建 Secrets Manager VPC 私有终端节点

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

Using the Amazon Web Services Management Console
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

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

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

  4. 适用于服务类别中,选择Amazon服务

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

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

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

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

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

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

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

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

  10. 选择Create endpoint

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

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

Using the Amazon CLI or SDK Operations

您可以使用创建 vPC 端点命令Amazon CLI创建连接到 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

默认情况下,Amazon 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 终端节点,则来自其他Amazon服务代表您访问密钥可能会失败。有关更多信息,请参阅 在具有 Secrets Manager 权限的策略中使用 VPC 终端节点条

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

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

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

要使用类似这样的策略,请将占位符 Amazon 账户 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 以提供管理功能,则可能会使用此类策略。

要使用类似这样的策略,请将占位符 Amazon 账户 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 终端节点访问的账户。有关终端节点策略的其他信息(包括支持终端节点策略的 Amazon 服务列表),请参阅使用 VPC 终端节点策略

注意

Amazon 不会在 Amazon 服务之间共享 VPC 终端节点。如果您将 VPC 终端节点用于多个Amazon服务(例如 Secrets Manager 和 Amazon 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:secretsmanager:us-west:123456789012:secret:a_specific_secret_name-a1b2c3" ] } ] }

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

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

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

{ "eventVersion":"1.05", "userIdentity": { "type": "IAMUser", "arn": "arn:aws: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" }