API Gateway 资源策略如何影响授权工作流程 - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

API Gateway 资源策略如何影响授权工作流程

当 API Gateway 评估附加到您的 API 的资源策略时,结果会受到您为 API 定义的身份验证类型的影响,如以下章节的流程图所示。

仅限 API Gateway 资源策略

在此工作流中,API Gateway 资源策略附加至 API,但没有为 API 定义任何身份验证类型。对策略的评估将涉及根据调用方的入站标准寻求明确的许可。隐式拒绝或任何明确拒绝都将导致拒绝调用方。

以下是此类资源策略的一个示例。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:region:account-id:api-id/", "Condition": { "IpAddress": { "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ] } } } ] }

Lambda 授权方和资源策略

在此工作流程中,除了资源策略外,还为 API 配置了 Lambda 授权方。将在两个阶段中对资源策略进行评估。在调用 Lambda 授权方之前,API Gateway 首先评估策略并检查是否存在任何明确拒绝。一经发现,将立即拒绝调用方访问。否则,会调用 Lambda 授权方,它将返回策略文档,对该文档与资源策略进行评估。结果根据表 A(接近本主题末尾处)确定。

以下示例资源策略仅允许从 VPC 终端节点调用,其 VPC 终端节点 ID 为 vpce-1a2b3c4d。在“预身份验证”评估期间,只有来自示例中所述的 VPC 终端节点的调用才允许向前推进并评估 Lambda 授权方。阻止所有剩余的调用。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": [ "arn:aws:execute-api:region:account-id:api-id/" ], "Condition" : { "StringNotEquals": { "aws:SourceVpce": "vpce-1a2b3c4d" } } } ] }

IAM 身份验证和资源策略

在此工作流中,除资源策略外,还为 API 配置 IAM 身份验证。使用 IAM 服务对用户进行身份验证后,API 将同时评估附加到用户的策略以及资源策略。结果因调用方是在同一 Amazon Web Services 账户 中还是在与 API 所有者不同的 Amazon Web Services 账户 中而异。

如果调用方和 API 所有者来自不同的账户,则 IAM policy 和资源策略都明确允许调用方继续操作。(请参阅位于本主题末尾的表 B。) 然而,如果调用方和 API 所有者在同一 Amazon Web Services 账户 中,则 IAM 用户策略或资源策略必须明确允许调用方继续操作。(请参阅下面的表 A。)

以下是跨账户资源策略的一个示例。假定 IAM policy 包含允许效果,此资源策略将仅允许来自 VPC ID 为 vpc-2f09a348 的 VPC 的调用。(请参阅位于本主题末尾的表 B。)

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": [ "arn:aws:execute-api:region:account-id:api-id/" ], "Condition" : { "StringEquals": { "aws:SourceVpc": "vpc-2f09a348" } } } ] }

Amazon Cognito 身份验证和资源策略

在此工作流程中,除了资源策略之外,还为 API 配置了 Amazon Cognito 用户池。API Gateway 首先尝试通过 Amazon Cognito 对调用方进行身份验证。这通常通过调用方提供的 JWT 令牌执行。如果身份验证成功,则资源策略将被独立评估,且需要显示允许。拒绝或“不允许也不拒绝”将导致拒绝。下面是资源策略的一个示例,可以与 Amazon Cognito 用户池一起使用。

下面是资源策略的一个示例,该策略只允许从指定的源 IP 调用(假定 Amazon Cognito 身份验证令牌包含允许)。(请参阅接近本主题末尾处的表 A。)

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "arn:aws:execute-api:region:account-id:api-id/", "Condition": { "IpAddress": { "aws:SourceIp": ["192.0.2.0/24", "198.51.100.0/24" ] } } } ] }

策略评估结果表

表 A 列出了对 API Gateway API 的访问由 IAM policy(或 Lambda 或 Amazon Cognito 用户池授权方)和 API Gateway 资源策略(两者都位于同一 Amazon Web Services 账户 中)控制时产生的行为。

表 A:账户 A 调用账户 A 拥有的 API
IAM policy(或 Lambda 或 Amazon Cognito 用户池授权方) API Gateway 资源策略 产生的行为
允许 允许 允许
允许 既不允许也不拒绝 允许
允许 拒绝 显式拒绝
既不允许也不拒绝 允许 允许
既不允许也不拒绝 既不允许也不拒绝 隐式拒绝
既不允许也不拒绝 拒绝 显式拒绝
拒绝 允许 显式拒绝
拒绝 既不允许也不拒绝 显式拒绝
拒绝 拒绝 显式拒绝

表 B 列出了对 API Gateway API 的访问由 IAM policy(或 Lambda 或 Amazon Cognito 用户池授权方)和 API Gateway 资源策略(两者位于不同 Amazon Web Services 账户 中)控制时产生的行为。如果其中一个静默(既不允许也不拒绝),则跨账户访问会被拒绝。这是因为跨账户访问要求资源策略和 IAM 策略(或 Lambda 或 Amazon Cognito 用户池授权方)明确授予访问权限。

表 B:账户 B 调用账户 A 所有的 API
IAM policy(或 Lambda 或 Amazon Cognito 用户池授权方) API Gateway 资源策略 产生的行为
允许 允许 允许
允许 既不允许也不拒绝 隐式拒绝
允许 拒绝 显式拒绝
既不允许也不拒绝 允许 隐式拒绝
既不允许也不拒绝 既不允许也不拒绝 隐式拒绝
既不允许也不拒绝 拒绝 显式拒绝
拒绝 允许 显式拒绝
拒绝 既不允许也不拒绝 显式拒绝
拒绝 拒绝 显式拒绝