Amazon API Gateway
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon 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 服务认证用户之后,除了资源策略外,还将一起评估附加到 IAM 用户的策略。结果因调用方是否在同一帐户,或是否来自 API 所有者的单独 AWS 账户而有所不同。如果调用方和 API 所有者来自不同的账户,IAM 用户策略和资源策略都明确允许调用方以继续。(请参阅下面的表 B。) 相反,如果调用方和 API 所有者在同一账户内,则用户策略或资源策略必须明确允许调用方以继续。(请参阅下面的表 A。)

以下是跨账户资源策略的一个示例。假定 IAM 用户策略包含一个允许,此资源策略将仅允许来自 VPC 的调用,其 VPC ID 为 vpc-2f09a348。(请参阅下面的表 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" ] } } } ] }

策略评估结果表

当 API Gateway API 的访问权限受 IAM 策略(或 Lambda、Amazon Cognito 用户池 授权方)及 API Gateway 资源策略控制时(且这二者位于同一 AWS 账户),则表 A 会列出生成的行为。

表 A:账户 A 调用账户 A 拥有的 API

IAM 用户策略(或 Lambda、Amazon Cognito 用户池 授权方) API Gateway 资源策略 产生的行为
允许 允许 允许
允许 既不允许也不拒绝 允许
允许 拒绝 显式拒绝
既不允许也不拒绝 允许 允许
既不允许也不拒绝 既不允许也不拒绝 隐式拒绝
既不允许也不拒绝 Deny 显式拒绝
Deny 允许 显式拒绝
Deny 既不允许也不拒绝 显式拒绝
Deny Deny 显式拒绝

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

表 B:账户 B 调用账户 A 所有的 API

IAM 用户策略(或 Lambda、Amazon Cognito 用户池 授权方) API Gateway 资源策略 产生的行为
允许 允许 允许
允许 既不允许也不拒绝 隐式拒绝
允许 拒绝 显式拒绝
既不允许也不拒绝 允许 隐式拒绝
既不允许也不拒绝 既不允许也不拒绝 隐式拒绝
既不允许也不拒绝 Deny 显式拒绝
Deny 允许 显式拒绝
Deny 既不允许也不拒绝 显式拒绝
Deny Deny 显式拒绝