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

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 授权方。阻止所有剩余的调用。

资源策略和 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 将同时评估附加到用户的策略以及资源策略。结果因调用方是在同一 AWS 账户 中还是在与 API 所有者不同的 AWS 账户 中而异。

如果调用方和 API 所有者来自不同的账户,则 IAM policy 和资源策略都明确允许调用方继续操作。有关更多信息,请参阅表 B

然而,如果调用方和 API 所有者在同一 AWS 账户中,则 IAM 用户策略或资源策略必须明确允许调用方继续操作。有关更多信息,请参阅表 A

资源策略和 Lambda 身份验证的授权流程。

以下是跨账户资源策略的一个示例。假定 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 用户池一起使用。

资源策略和 Amazon Cognito 授权方的授权流程。

下面是资源策略的一个示例,该策略只允许从指定的源 IP 调用(假定 Amazon Cognito 身份验证令牌包含允许)。有关更多信息,请参阅表 B

{ "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 策略(或 Lambda 授权方)和 API Gateway 资源策略(两者都位于同一 AWS 账户中)控制时产生的行为。

IAM 策略(或 Lambda 授权方)

API Gateway 资源策略

产生的行为

允许 允许 允许
允许 既不允许也不拒绝 允许
允许 拒绝 显式拒绝
既不允许也不拒绝 允许 允许
既不允许也不拒绝 既不允许也不拒绝 隐式拒绝
既不允许也不拒绝 拒绝 显式拒绝
拒绝 允许 显式拒绝
拒绝 既不允许也不拒绝 显式拒绝
拒绝 拒绝 显式拒绝

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

IAM 策略(或 Amazon Cognito 用户池授权方)

API Gateway 资源策略

产生的行为

允许 允许 允许
允许 既不允许也不拒绝 隐式拒绝
允许 拒绝 显式拒绝
既不允许也不拒绝 允许 隐式拒绝
既不允许也不拒绝 既不允许也不拒绝 隐式拒绝
既不允许也不拒绝 拒绝 显式拒绝
拒绝 允许 显式拒绝
拒绝 既不允许也不拒绝 显式拒绝
拒绝 拒绝 显式拒绝