使用身份验证策略控制对VPC莱迪思服务的访问 - Amazon VPC Lattice

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

使用身份验证策略控制对VPC莱迪思服务的访问

VPC莱迪思身份验证IAM策略是您附加到服务网络或服务的策略文件,用于控制指定的委托人是否有权访问一组服务或特定服务。您可以将一个验证策略附加到您要控制访问的每个服务网络或服务。

身份验证策略不同于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)计算的有效请求签名。有关更多信息,请参阅 SIGv4经身份验证的 Amazon VPC Lattice 请求

验证策略中的常用元素

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

验证策略包含以下元素:

  • 主体:允许访问语句中的操作和资源的人员或应用程序。在身份验证策略中,委托人是该权限的接收者。IAM委托人被认证为向特定资源或资源组发出请求的IAM实体,例如服务网络中的服务。

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

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

  • 操作-您授予或拒绝权限的特定API操作。VPC莱迪思支持使用vpc-lattice-svcs前缀的操作。有关更多信息,请参阅《服务授权参考》中的 Amazon VPC Lattice 服务定义的操作

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

  • 条件:条件是可选的。您可以使用它们来控制您的策略何时生效。有关更多信息,请参阅《服务授权参考》中的 Amazon VPC Lattice 服务的条件密钥

在创建和管理身份验证策略时,您可能需要使用IAM策略生成器

要求

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

验证策略的资源格式

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

协议 示例
HTTP
  • "Resource": "arn:aws:vpc-lattice:us-west-2:1234567890:service/svc-0123456789abcdef0/rates"

  • "Resource": "*/rates"

  • "Resource": "*/*"

g RPC
  • "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/*"

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

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)签名还是匿名签名。条件键区分大小写。

AWS 提供了可用于控制访问权限的全局条件键,例如aws:PrincipalOrgIDaws:SourceIp。要查看清单 AWS 全局条件键,请参见 AWS 《IAM用户指南》中的全局条件上下文密钥。

下表列出了VPC莱迪思条件键。有关更多信息,请参阅《服务授权参考》中的 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 具有签名版本 4 (Sigv4) 的请求,并且位于连接到服务网络的请求中。VPC如果验证策略允许,匿名主体可以向服务网络中的服务发出未经验证的请求。

示例验证策略

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

所有示例都使用该us-west-2地区并包含虚构账户。IDs

示例 1:限制特定用户访问服务 AWS organization

以下验证策略示例向任何经过验证的请求授予权限,以访问该策略适用的服务网络中的任何服务。但是,请求必须来自属于的委托人 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元素中指定的服务上发出请求的任何经过身份验证的HTTPGET请求授予权限。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 ID 为的委托人发出的经过身份验证的VPC请求。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莱迪思服务收到请求时, AWS 执行代码会一起评估所有相关的权限策略,以确定是授权还是拒绝请求。它会在授权期间评估所有适用于请求上下文的IAM基于身份的策略和身份验证策略。默认情况下,当验证类型为 AWS_IAM 时,会隐式拒绝所有请求。所有相关策略的显式允许将覆盖默认值。

授权包括:

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

  • 评估生成的策略集:

    • 验证请求者(例如IAM用户或角色)是否有权使用请求者所属的账户执行操作。如果没有明确的 allow 语句, AWS 未批准该请求。

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

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

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

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

授权工作流