View a markdown version of this page

使用接口终端节点访问 Amazon Cognito (AWS PrivateLink) - Amazon Cognito

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

使用接口终端节点访问 Amazon Cognito (AWS PrivateLink)

您可以使用 AWS PrivateLink 在您的 VPC 和亚马逊 Cognito 之间创建私有连接。您可以像在 VPC 中一样访问亚马逊 Cognito,无需使用互联网网关、NAT 设备、VPN 连接或 Direct Connect 连接。您的 VPC 中的实例不需要公有 IP 地址即可访问亚马逊 Cognito。

您可以通过创建由 AWS PrivateLink提供支持的接口端点来建立此私有连接。我们将在您为接口端点启用的每个子网中创建一个端点网络接口。这些是请求者管理的网络接口,用作发往 Amazon Cognito 的流量的入口点。

有关更多信息,请参阅《AWS PrivateLink 指南》中的通过 AWS PrivateLink访问 AWS 服务

重要

目前不支持以下身份验证类型 AWS PrivateLink:

  1. 使用 OAuth 2.0 客户端凭证流进行机器对机器 (M2M) 授权

  2. Sign-in 使用托管登录和经典的托管用户界面。

下表介绍了 VPC 中可供客户端使用的身份验证流程,以及您可以应用的管理这些流程的 IAM 策略。您可以在向用户池发出的请求中评估的策略是资源控制策略 (RCP)、VPC 终端节点策略和基于身份的策略。

资源 身份验证流程 客户端过境 VPC 终端节点时评估的策略 当客户来源为公开时评估的政策
用户池 管理登录和经典托管用户界面登录 无(无访问权限)1 2
用户池 Machine-to-machine 授权 无(无访问权限)1 2
用户池 SDK 和 REST API 未经身份验证的请求 RCP、VPC 终端节点策略 3 RCP
用户池 SDK 和 REST API SigV4 经过身份验证的请求 RCP、VPC 终端节点策略、基于身份的策略 3 RCP,基于身份的策略
身份池 SDK 和 REST API 未经身份验证的请求(基本增强流程) RCP、VPC 终端节点策略 RCP
身份池 SDK 和 REST API SigV4 经过身份验证的请求(开发者身份验证流程) RCP,基于身份的策略 RCP,基于身份的策略

1 VPC 终端节点不接受用户池域请求。如果客户端有通往互联网的路由,则应用 NAT,将源设置为公开。

2 用户池域的存在会阻止任何通过 VPC 终端节点的用户池请求的完成。任何客户端只能通过公共交通路径到达用户池域和 API 服务终端节点,这使得 VPC 终端节点无法用于用户池。分配了域的用户池与不兼容 AWS PrivateLink。

3 用户池不得分配域。

AWS PrivateLink 和 Amazon Cognito 支持以下示例实现模型。

资源 实施 操作
用户池 完全私有的 SDK 或 REST API 应用程序
  1. 删除域

  2. 创建 VPC 端点

  3. 将 RCP 配置为Deny所有 cognito-idp 操作,VPC 除外

用户池 公有和私有
  1. 删除域

  2. 创建 VPC 端点

用户池 私有或公共 OAuth 2.0 授权服务器
  1. 不可用于 VPC

身份池 完全私密
  1. 创建 VPC 端点

  2. 将 RCP 配置为除 VPC 之外Deny的所有认知身份操作

身份池 公有和私有
  1. 创建 VPC 端点

亚马逊 Cognito 的注意事项

在为 Amazon Cognito 设置接口终端节点之前,请查看AWS PrivateLink 指南中的注意事项。亚马逊 Cognito 支持通过接口终端节点调用所有亚马逊 Cognito API 操作。有关这些操作的更多信息,请参阅亚马逊 Cognito 用户池 API 参考亚马逊 Cognito 联合身份 API 参考。

用户池和 AWS PrivateLink

您可以通过接口终端节点向所有用户池 API 操作发出请求,但不能向您的应用程序从用户池 OAuth 2.0 授权服务器请求的操作(例如客户端凭据授予和管理登录)发出请求。

cognito-idp用户池 API 具有未经身份验证、身份验证和代币授权的 API 操作。您可以在 VPC 终端节点和资源控制策略中授予经过身份验证的操作的权限。与基于身份的策略不同,您还可以为未经身份验证和代币授权的操作授予权限。VPC 终端节点和资源控制策略类型能够评估、拒绝或允许其他公开操作的请求。

对域名终端节点的请求也是公开的,但您无法在政策中对其进行评估。VPC 私有 DNS 不会将用户池域名请求路由到您的 VPC 终端节点。您只能通过公共互联网路径请求域服务。有关更多信息,请参阅 策略对用户池操作的影响

支持的操作

VPC 中的系统可以向用户池 API 操作发送请求,不能向用户池域终端节点发送请求。无法通过 VPC 终端节点访问使用域终端节点(例如机器对机器 (M2M)、联合登录和授权码授予)的 OpenID Connect (OIDC) 和 OAuth 2.0 工作流程。VPC 终端节点策略对这些 HTTP 工作流程没有影响,也无法对其进行处理。从 VPC 内部向域终端节点发出的请求总是在接口终端节点处失败,但当您为用户池设置 VPC 终端节点时,仍可通过公有 DNS 和路由访问。

为了防止从 VPC 中的系统分配域,Amazon Cognito 在接口终端节点上屏蔽CreateUserPoolDomain请求。这样可以防止从 VPC 中的系统向您的用户池添加域。为防止在所有系统中添加域,请对您的 AWS 账户应用资源控制策略 (RCP),如下例所示。此策略禁止对指定用户池CreateUserPoolDomain执行操作。

{ "Version": "2012-10-17", "Statement": [ { "Principal": "*", "Effect": "Deny", "Action": [ "cognito-idp:CreateUserPoolDomain" ], "Resource": "arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_EXAMPLE" } ] }

您的用户池可能有一个域,并且在所有情况下该域都无法通过访问 AWS PrivateLink。cognito-idp服务端点发送的所有 SDK-based 用户池 API 请求都接受通过发出的请求 AWS PrivateLink,但不是CreateUserPoolDomain。用户池 API 服务端点和域端点始终可通过公共互联网路径访问。要解决来自公共来源的访问问题,请实施 AWS WAF Web ACL

策略对用户池操作的影响

所有用户池 API 操作,即使是那些通常是公开且未经身份验证的操作,都可以在 VPC 终端节点策略和资源控制策略 (RCP) 中进行控制。您还可以使用 VPC 条件密钥在基于身份的策略中对用户池访问施加限制。只有包含 SigV4 格式的身份验证信息的请求才能通过基于身份的策略进行控制。托管登录和经典托管用户界面操作是一个单独的类别,没有资格进行 VPC 传输或在其操作中应用任何类型的策略。

未经身份验证的操作

针对客户端应用程序的 Amazon Cognito 操作未使用 SigV4 进行身份验证。示例操作位于的示例策略中为接口端点创建端点策略。未经身份验证的操作的其他示例是GetUser和。AssociateSoftwareToken当您将这些操作添加到基于身份的策略中时,它们没有任何效果。但是,您可以在 VPC 终端节点策略和 RC P 中允许或限制对这些操作的访问。

未经身份验证的操作与 IAM 委托人无关。您的 VPC 终端节点策略或 RCP 必须允许所有委托人执行这些操作。

经过身份验证的操作

用户池管理和服务器端身份验证的 API 操作使用 SigV4 进行身份验证。对于经过身份验证的操作,您可以使用应用于 VPC 终端节点的终端节点策略、组织中的资源控制策略以及应用于委托人的基于身份的策略来限制委托人。 Identity-based 资源控制策略使用基于网络 VPC-aware 的条件密钥,例如和。aws:SourceVpc aws:SourceVpce

有关用户池的服务器端、客户端和管理类 API 操作的更多信息,请参阅。API 和 SDK 身份验证的授权模型

身份池和 AWS PrivateLink

亚马逊 Cognito 身份池通过 AWS PrivateLink以下方式支持所有 API 操作。

支持的操作

接口端点支持所有身份池 API 操作。身份池没有域终端节点,也没有同样的限制。但是,身份池在基于网络的访问控制方面有特殊的注意事项,因为它们与 AWS STS集成。

的网络环境限制 AWS STS 集成

身份池使用 AWS STS AssumeRoleWithWebIdentity操作来提供临时 AWS 证书。当身份池在增强型身份验证 AWS STS 流程 AWS PrivateLink 中调用时,网络上下文密钥(如aws:SourceIpaws:SourceVpc、和)aws:SourceVpce包含来自身份池服务基础架构的值,而不是来自应用程序网络环境的值。

如果您的 IAM 角色信任策略或资源控制策略 (RCP) 使用基于网络的条件密钥来限制访问,则身份池操作可能会被意外拒绝。要解决此限制,您可以使用以下方法之一:

用于服务识别的主要标签

标记身份池中使用的 IAM 角色并修改您的策略,以允许在委托人具有相应标签时进行操作。首先,为您的身份池角色添加标签:

aws iam tag-role \ -\-role-name MyIdentityPoolRole \ -\-tags Key=CognitoServiceCall,Value=true

然后修改您的基于网络的策略以允许带标签的委托人。例如,在 RCP 中:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "sts:AssumeRoleWithWebIdentity", "Resource": "*", "Condition": { "NotIpAddress": { "aws:SourceIp": ["allowed-ip-ranges"] }, "StringNotEqualsIfExists": { "aws:ResourceTag/CognitoServiceCall": "true" } } } ] }

Service-specific 上下文密钥

身份池为 VPC 终端节点策略和 RCP 中的资源级授权提供特定服务的上下文密钥。使用这些上下文密钥,您可以启用精细的访问控制,并在策略中区分经过身份验证和未经身份验证的用户。

用于非 SIGV4 操作的可用服务特定上下文密钥,例如 GetId, GetCredentialsForIdentity, GetOpenIdToken, UnlinkIdentity
  • cognito-identity-unauth:IdentityPoolArn-按身份池 ARN 筛选未经身份验证的用户的访问权限

  • cognito-identity-unauth:AccountId-按 AWS 账户 ID 筛选未经身份验证的用户的访问权限

  • cognito-identity-auth:IdentityPoolArn-按身份池 ARN 筛选经过身份验证的用户的访问权限

  • cognito-identity-auth:AccountId-按 AWS 账户 ID 筛选经过身份验证的用户的访问权限

可用于 SigV4 操作的特定服务上下文密钥,例如 DeleteIdentities and DescribeIdentity
  • cognito-identity:IdentityPoolArn-按身份池 ARN 筛选访问权限

您可以在 VPC 终端节点策略中使用这些上下文密钥根据身份验证状态限制访问,如以下示例所示:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "cognito-identity:GetId", "cognito-identity:GetCredentialsForIdentity" ], "Resource": "*", "Condition": { "StringEquals": { "cognito-identity-unauth:IdentityPoolArn": "arn:aws:cognito-identity:us-east-1:123456789012:identitypool/us-east-1:12345678-ffff-ffff-ffff-123456" } } } ] }

使用资源控制策略控制访问权限

Amazon Cognito 支持使用资源控制策略 (RCP) 控制对资源的访问权限。使用基于网络的条件密钥,RCP 可以定义允许 AWS PrivateLink 访问您的用户池和身份池的网络和操作。RCP 中的Action语句可以控制对经过身份验证和未经身份验证的用户池 API 操作的访问权限。

例如,以下示例策略禁止从特定 VPC 访问所有用户池。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCognitoAccessOutsideVPC", "Effect": "Deny", "Principal": "*", "Action": "cognito-idp:*", "Resource": "*", "Condition": { "StringNotEqualsIfExists": { "aws:SourceVpc": "vpc-02d6770f46ef1653b" } } } ] }

为 Amazon Cognito 创建接口终端节点

您可以使用亚马逊 VPC 控制台或 AWS Command Line Interface (AWS CLI) 为亚马逊 Cognito 创建接口终端节点。有关更多信息,请参阅《AWS PrivateLink 指南》中的创建接口端点

使用以下服务名称为 Amazon Cognito 用户池创建接口终端节点:

com.amazonaws.region.cognito-idp

使用以下服务名称为 Amazon Cognito 身份池创建接口终端节点:

com.amazonaws.region.cognito-identity

如果您为接口终端节点启用私有 DNS,则可以使用其默认区域 DNS 名称向 Amazon Cognito 发出 API 请求。例如,cognito-idp.us-east-1.amazonaws.com用于用户池和cognito-identity.us-east-1.amazonaws.com身份池。

为接口端点创建端点策略

端点策略是一种 IAM 资源,您可以将其附加到接口端点。默认终端节点策略允许通过接口终端节点完全访问 Amazon Cognito。要控制允许从您的 VPC 访问 Amazon Cognito,请将自定义终端节点策略附加到接口终端节点。

端点策略指定以下信息:

  • 可执行操作的主体(AWS 账户、IAM 用户和 IAM 角色)。

  • 可执行的操作。

  • 可对其执行操作的资源。

  • 在允许或拒绝请求之前必须满足的条件。

有关更多信息,请参阅《AWS PrivateLink 指南》中的使用端点策略控制对服务的访问权限

示例:用户池操作的 VPC 终端节点策略

以下是用户池的自定义终端节点策略的示例。当您将此策略附加到接口终端节点时,它会向所有资源上的所有委托人授予对列出的用户池操作的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Principal": { "AWS": "arn:aws:iam::123456789012:assumed-role/MyWebAppRole/MyWebAppSession" }, "Effect": "Allow", "Action": [ "cognito-idp:AdminInitiateAuth", "cognito-idp:AdminRespondToAuthChallenge", "cognito-idp:AdminSetUserPassword" ], "Resource":"arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_EXAMPLE" }, { "Effect": "Allow", "Action": [ "cognito-idp:InitiateAuth", "cognito-idp:RespondToAuthChallenge", "cognito-idp:ForgotPassword", "cognito-idp:ConfirmForgotPassword" ], "Resource":"arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_EXAMPLE" } ] }
示例:身份池操作的 VPC 终端节点策略

以下是身份池的自定义终端节点策略示例。此策略使用特定服务的上下文密钥来限制特定身份池中经过身份验证的用户的访问权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "cognito-identity:GetId", "cognito-identity:GetCredentialsForIdentity", "cognito-identity:GetOpenIdToken" ], "Resource": "*", "Condition": { "StringEquals": { "cognito-identity-auth:IdentityPoolArn": "arn:aws:cognito-identity:us-east-1:123456789012:identitypool/us-east-1:12345678-ffff-ffff-ffff-123456" } } } ] }

为以下对象创建基于身份的政策 AWS PrivateLink 操作

Identity-based策略是您可以附加到 AWS 委托人的 IAM 资源。您可以使用基于身份的运营策略通过 VPC 终端节点控制对 Amazon Cognito 的访问。 IAM-authenticated 与终端节点策略不同,您无法在基于身份的策略中为未经身份验证的操作配置权限。经过身份验证或管理的操作需要签名版本 4 授权。对于用户池,经过身份验证的操作包括服务器端身份验证请求(如)AdminInitiateAuth和管理请求(如 UpdateUserPool)。对于身份池,经过身份验证的操作包括DeleteIdentities和等管理请求DescribeIdentity

基于身份的策略指定了以下信息:

  • 可执行的操作。

  • 可对其执行操作的资源。

  • 在允许或拒绝请求之前必须满足的条件。

示例:用户池服务器端身份验证的基于身份的策略

以下示例策略授予从指定终端节点访问指定用户池中列出的用户池操作的权限。将此策略应用于您的 Web 应用程序中假定的 IAM 角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cognito-idp:AdminInitiateAuth", "cognito-idp:AdminRespondToAuthChallenge", "cognito-idp:AdminSetUserPassword" ], "Resource": "arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_EXAMPLE", "Condition": { "StringEquals": { "aws:SourceVpce": "vpce-1a2b3c4d" } } } ] }
示例:用于身份池管理操作的基于身份的策略

以下示例策略授予对指定 VPC 终端节点的身份池管理操作的访问权限。将此策略应用于需要执行身份池管理的 IAM 委托人。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cognito-identity:DeleteIdentities", "cognito-identity:DescribeIdentity" ], "Resource": "*", "Condition": { "StringEquals": { "aws:SourceVpce": "vpce-1a2b3c4d" }, "StringEquals": { "cognito-identity:IdentityPoolArn": "arn:aws:cognito-identity:us-east-1:123456789012:identitypool/us-east-1:12345678-ffff-ffff-ffff-123456" } } } ] }