使用验证策略控制对服务的访问 - Amazon VPC Lattice

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

使用验证策略控制对服务的访问

VPC Lattice 验证策略是 IAM policy 文档,您可以将其附加到服务网络或服务,以控制指定主体是否可以访问一组服务或特定服务。您可以将一个验证策略附加到您要控制访问的每个服务网络或服务。

验证策略不同于 IAM 基于身份的策略。IAM 基于身份的策略附加到 IAM 用户、组或角色,并定义这些身份可以对哪些资源执行哪些操作。验证策略附加到服务和服务网络。要使授权成功,验证策略和基于身份的策略都需要具有显式允许语句。有关更多信息,请参阅 授权的工作原理

您可以使用 AWS CLI 和控制台查看、添加、更新或删除服务和服务网络上的身份验证策略。使用时 AWS CLI,请记住您的命令在 AWS 区域 配置文件中运行。如果您想要在不同的区域中运行命令,可以为配置文件更改默认区域,或者与命令一起使用 --region 参数。

要开始使用验证策略,请按照以下过程创建适用于服务网络的验证策略。对于您不想应用于其他服务的更具限制性的权限,您可以选择在单个服务上设置验证策略。

以下 AWS CLI 任务向您展示如何使用身份验证策略管理对服务网络的访问权限。有关使用控制台的说明,请参阅 VPC Lattice 中的服务网络

向服务网络添加验证策略

按照本节中的步骤 AWS CLI 使用:

  • 使用 IAM 在服务网络上启用访问控制。

  • 向服务网络添加验证策略。如果不添加验证策略,则所有流量都将收到拒绝访问错误。

要启用访问控制并向新服务网络添加验证策略
  1. 要在服务网络上启用访问控制,使服务网络能够使用验证策略,请使用具有 --auth-type 选项和值为 AWS_IAMcreate-service-network 命令。

    aws vpc-lattice create-service-network --name Name --auth-type AWS_IAM [--tags TagSpecification]

    如果成功,该命令将返回类似于以下内容的输出。

    { "arn": "arn", "authType": "AWS_IAM", "id": "sn-0123456789abcdef0", "name": "Name" }
  2. 使用 put-auth-policy 命令,指定要在其中添加验证策略的服务网络 ID,以及要添加的验证策略。

    例如,使用以下命令为 ID 为 sn-0123456789abcdef0 的服务网络创建验证策略。

    aws vpc-lattice put-auth-policy --resource-identifier sn-0123456789abcdef0 --policy file://policy.json

    使用 JSON 创建策略定义。有关更多信息,请参阅 验证策略中的常用元素

    如果成功,该命令将返回类似于以下内容的输出。

    { "policy": "policy", "state": "Active" }
要启用访问控制并向现有服务网络添加验证策略
  1. 要在服务网络上启用访问控制,使服务网络能够使用验证策略,请使用具有 --auth-type 选项和值为 AWS_IAMupdate-service-network 命令。

    aws vpc-lattice update-service-network --service-network-identifier sn-0123456789abcdef0 --auth-type AWS_IAM

    如果成功,该命令将返回类似于以下内容的输出。

    { "arn": "arn", "authType": "AWS_IAM", "id": "sn-0123456789abcdef0", "name": "Name" }
  2. 使用 put-auth-policy 命令,指定要在其中添加验证策略的服务网络 ID,以及要添加的验证策略。

    aws vpc-lattice put-auth-policy --resource-identifier sn-0123456789abcdef0 --policy file://policy.json

    使用 JSON 创建策略定义。有关更多信息,请参阅 验证策略中的常用元素

    如果成功,该命令将返回类似于以下内容的输出。

    { "policy": "policy", "state": "Active" }

更改服务网络的验证类型

要禁用服务网络的验证策略

使用具有 --auth-type 选项和值为 NONEupdate-service-network 命令。

aws vpc-lattice update-service-network --service-network-identifier sn-0123456789abcdef0 --auth-type NONE

如果之后需要再次启用验证策略,请使用为 --auth-type 选项指定的 AWS_IAM 运行此命令。

从服务网络中删除验证策略

要从服务网络中删除验证策略

使用 delete-auth-policy 命令。

aws vpc-lattice delete-auth-policy --resource-identifier sn-0123456789abcdef0

如果在将服务网络的验证类型更改为 NONE 之前删除验证策略,则请求会失败。

以下 AWS CLI 任务向您展示如何使用身份验证策略管理对服务的访问权限。有关使用控制台的说明,请参阅 VPC Lattice 中的服务

向服务添加验证策略

请按照以下步骤 AWS CLI 使用:

  • 使用 IAM 在服务上启用访问控制。

  • 向服务添加验证策略。如果不添加验证策略,则所有流量都将收到拒绝访问错误。

要启用访问控制并向新服务添加验证策略
  1. 要在服务上启用访问控制,使服务能够使用验证策略,请使用具有 --auth-type 选项和值为 AWS_IAMcreate-service 命令。

    aws vpc-lattice create-service --name Name --auth-type AWS_IAM [--tags TagSpecification]

    如果成功,该命令将返回类似于以下内容的输出。

    { "arn": "arn", "authType": "AWS_IAM", "dnsEntry": { ... }, "id": "svc-0123456789abcdef0", "name": "Name", "status": "CREATE_IN_PROGRESS" }
  2. 使用 put-auth-policy 命令,指定要在其中添加验证策略的服务 ID,以及要添加的验证策略。

    例如,使用以下命令为 ID 是 svc-0123456789abcdef0 的服务创建验证策略。

    aws vpc-lattice put-auth-policy --resource-identifier svc-0123456789abcdef0 --policy file://policy.json

    使用 JSON 创建策略定义。有关更多信息,请参阅 验证策略中的常用元素

    如果成功,该命令将返回类似于以下内容的输出。

    { "policy": "policy", "state": "Active" }
要启用访问控制并向现有服务添加验证策略
  1. 要在服务上启用访问控制,使服务能够使用验证策略,请使用具有 --auth-type 选项和值为 AWS_IAMupdate-service 命令。

    aws vpc-lattice update-service --service-identifier svc-0123456789abcdef0 --auth-type AWS_IAM

    如果成功,该命令将返回类似于以下内容的输出。

    { "arn": "arn", "authType": "AWS_IAM", "id": "svc-0123456789abcdef0", "name": "Name" }
  2. 使用 put-auth-policy 命令,指定要在其中添加验证策略的服务 ID,以及要添加的验证策略。

    aws vpc-lattice put-auth-policy --resource-identifier svc-0123456789abcdef0 --policy file://policy.json

    使用 JSON 创建策略定义。有关更多信息,请参阅 验证策略中的常用元素

    如果成功,该命令将返回类似于以下内容的输出。

    { "policy": "policy", "state": "Active" }

更改服务的验证类型

要禁用服务的验证策略

使用具有 --auth-type 选项和值为 NONEupdate-service 命令。

aws vpc-lattice update-service --service-identifier svc-0123456789abcdef0 --auth-type NONE

如果之后需要再次启用验证策略,请使用为 --auth-type 选项指定的 AWS_IAM 运行此命令。

从服务中删除验证策略

要从服务中删除验证策略

使用 delete-auth-policy 命令。

aws vpc-lattice delete-auth-policy --resource-identifier svc-0123456789abcdef0

如果在将服务的验证类型更改为 NONE 之前删除验证策略,则请求会失败。

如果启用验证策略,该验证策略需要对服务发出经过验证的请求,则对服务的任何请求都必须包含使用签名版本 4(SigV4)计算的有效请求签名。有关更多信息,请参阅 签名版本 4 经过身份验证的请求示例

验证策略中的常用元素

指定 VPC Lattice 验证策略所用的语法与 IAM 策略相同。有关更多信息,请参见《IAM 用户指南》中的基于身份的策略和基于资源的策略

验证策略包含以下元素:

  • 主体:允许访问语句中的操作和资源的人员或应用程序。在验证策略中,主体是接收此权限的 IAM 实体。主体作为 IAM 实体经过验证,以向特定资源或资源组(如服务网络中的服务)发出请求。

    您必须在基于资源的策略中指定主体。委托人可以包括账户、用户、角色、联合用户或 AWS 服务。有关更多信息,请参阅《IAM 用户指南》中的 AWS JSON 策略元素:主体

  • 效果:指定主体请求特定操作时的效果。此值可以是 AllowDeny。默认情况下,当您使用 IAM 在服务或服务网络上启用访问控制时,主体无权向服务或服务网络发出请求。因此,显式 Allow 将覆盖默认值。

  • 操作:VPC Lattice 支持 vpc-lattice-svcs:Invoke 操作。此权限允许指定主体对 Resources 元素中指定的资源执行请求。

  • 资源:受操作影响的服务。

  • 条件:条件是可选的。您可以使用条件来控制策略生效的时间。

在创建和管理验证策略时,您可能希望使用 IAM Policy Generator

要求

JSON 中的策略不得包含换行符或空行。

验证策略的资源格式

您可以通过创建一个验证策略来限制对特定资源的访问,该策略使用具有 <serviceARN>/<path> 模式的匹配架构,并对 Resource 元素进行编码,如以下示例所示。

验证策略的资源示例
协议 示例
HTTP
  • "Resource": "arn:aws:vpc-lattice:us-west-2:1234567890:service/svc-0123456789abcdef0/rates"

  • "Resource": "*/rates"

  • "Resource": "*/*"

gRPC
  • "Resource": "arn:aws:vpc-lattice:us-west-2:1234567890:service/svc-0123456789abcdef0/api.parking/GetRates"

  • "Resource": "arn:aws:vpc-lattice:us-west-2:1234567890:service/svc-0123456789abcdef0/api.parking/*"

  • "Resource": "arn:aws:vpc-lattice:us-west-2:1234567890:service/svc-0123456789abcdef0/*"

<serviceARN> 使用以下 Amazon 资源名称(ARN)资源格式:

arn:aws:vpc-lattice:region:account-id:service/service-id

例如:

"Resource": "arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0123456789abcdef0"

可在验证策略中使用的条件键

通过验证策略的 Condition 元素中的条件键,可进一步控制访问。这些条件键是否可用于评估,具体取决于协议以及请求使用的是签名版本 4(SigV4)签名还是匿名签名。有关更多信息,请参阅《服务授权参考》中的 Amazon VPC Lattice 服务的条件键

要求

条件键区分大小写。

验证策略的条件键
条件键 描述 示例 适用于匿名(未经验证)调用方? 适用于 gRPC?
vpc-lattice-svcs:Port 按发出请求的服务端口筛选访问 80 支持
vpc-lattice-svcs:RequestMethod 按请求的方式筛选访问权限 GET 始终 POST
vpc-lattice-svcs:RequestHeader/header-name: value 按请求标头中的标头名称-值对筛选访问权限 content-type: application/json 支持
vpc-lattice-svcs:RequestQueryString/key-name: value 按请求 URL 中的查询字符串键值筛选访问权限 quux: [corge, grault] 不支持
vpc-lattice-svcs:ServiceNetworkArn 通过接收请求的服务,其服务网络的 ARN 筛选访问 arn:aws:vpc-lattice:us-west-2:123456789012:servicenetwork/sn-0123456789abcdef0 支持
vpc-lattice-svcs:ServiceArn 通过接收请求的服务的 ARN 筛选访问 arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0123456789abcdef0 支持
vpc-lattice-svcs:SourceVpc 按发出请求的 VPC 筛选访问权限 vpc-1a2b3c4d 支持
vpc-lattice-svcs:SourceVpcOwnerAccount 按发出请求的 VPC 的拥有账户筛选访问权限 123456789012 支持

AWS 还提供了可用于控制访问的其他条件键,例如aws:PrincipalOrgID全局条件键。要查看所有 AWS 全局条件键,请参阅 IAM 用户指南中的AWS 全局条件上下文密钥

匿名(未经验证)主体

匿名委托人是指不使用签名版本 4 (Sigv4) 签署 AWS 请求且位于与服务网络相连的 VPC 内的来电者。如果验证策略允许,匿名主体可以向服务网络中的服务发出未经验证的请求。

示例验证策略

以下是要求由经过验证的主体发出请求的验证策略示例。

所有示例都使用 us-west-2 区域,并包含虚构的账户 ID。

示例 1:限制特定 AWS 组织访问服务

以下验证策略示例向任何经过验证的请求授予权限,以访问该策略适用的服务网络中的任何服务。但是,请求必须来自属于条件中指定的 AWS 组织的委托人。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "vpc-lattice-svcs:Invoke", "Resource": "*", "Condition": { "StringEquals": { "aws:PrincipalOrgID": [ "o-123456example" ] } } } ] }
示例 2:限制特定 IAM 角色对服务的访问

以下验证策略示例向任何经过验证的请求授予权限,该请求使用 IAM 角色 rates-clientResource 元素中指定的服务发出 HTTP GET 请求。Resource 元素中的资源与策略附加到的服务相同。

{ "Version":"2012-10-17", "Statement":[ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:role/rates-client" ] }, "Action": "vpc-lattice-svcs:Invoke", "Resource": [ "arn:aws:vpc-lattice:us-west-2:123456789012:service/svc-0123456789abcdef0/*" ], "Condition": { "StringEquals": { "vpc-lattice-svcs:RequestMethod": "GET" } } } ] }
示例 3:限制特定 VPC 中经过验证的主体访问服务

以下验证策略示例仅允许来自 VPC 中主体(VPC ID 为 vpc-1a2b3c4d)的经过验证的请求。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "vpc-lattice-svcs:Invoke", "Resource": "*", "Condition": { "StringNotEquals": { "aws:PrincipalType": "Anonymous" }, "StringEquals": { "vpc-lattice-svcs:SourceVpc": "vpc-1a2b3c4d" } } } ] }

授权的工作原理

当VPC Lattice服务收到请求时, AWS 执行代码会一起评估所有相关的权限策略,以确定是授权还是拒绝该请求。在授权过程中,服务会评估请求上下文中适用的所有 IAM 基于身份的策略和验证策略。默认情况下,当验证类型为 AWS_IAM 时,会隐式拒绝所有请求。所有相关策略的显式允许将覆盖默认值。

授权包括:

  • 收集所有相关的 IAM 基于身份的策略和验证策略。

  • 评估生成的策略集:

    • 验证请求方(如 IAM 用户或角色)是否有权从请求方所属的账户执行操作。如果没有明确的 allow 语句,则 AWS 不对请求进行授权。

    • 验证服务网络的验证策略是否允许请求。如果启用了身份验证策略,但没有明确的 allow 声明,则 AWS 不对请求进行授权。如果有显式允许语句,或者验证类型为 NONE,则代码将继续。

    • 验证服务的验证策略是否允许请求。如果启用了身份验证策略,但没有明确的 allow 声明,则 AWS 不对请求进行授权。如果有显式允许语句,或者验证类型为 NONE,则执行代码将返回最终决定 Allow

    • 任何策略中的显式拒绝将覆盖任何允许。

下图显示授权工作流。发出请求时,相关策略允许或拒绝请求访问给定服务。

授权工作流