本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用接口终端节点访问 Amazon Cognito ()Amazon PrivateLink
您可以使用 Amazon PrivateLink 在您的 VPC 和 Amazon Cognito 之间创建私有连接。您可以像在您的 VPC 中一样访问 Amazon Cognito,无需使用互联网网关、NAT 设备、VPN 连接或 Amazon Direct Connect 连接。您的 VPC 中的实例不需要公有 IP 地址即可访问 Amazon Cognito。
您可以通过创建由 Amazon PrivateLink提供支持的接口端点来建立此私有连接。我们将在您为接口端点启用的每个子网中创建一个端点网络接口。这些是请求者管理的网络接口,用作发往 Amazon Cognito 的流量的入口点。
有关更多信息,请参阅《Amazon PrivateLink 指南》中的通过 Amazon PrivateLink访问 Amazon Web Services 服务。
重要
目前不支持以下身份验证类型 Amazon PrivateLink:
-
使用 OAuth 2.0 客户端凭证流程进行机器到机器 (M2M) 授权
-
使用托管登录和经典托管用户界面登录。
主题
用于 Amazon PrivateLink 集成的身份验证流程
下表描述了中可供客户端使用的身份验证流程 VPCs,以及您可以应用于管理这些流程的 IAM 策略。您可以在用户池请求中评估的策略包括资源控制策略 (RCPs)、VPC 终端节点策略和基于身份的策略。
| 资源 | 身份验证流程 | 客户端通过 VPC 终端节点时评估的策略 | 当客户端来源为公开时对策略进行评估 |
|---|---|---|---|
| 用户池 | 托管登录和经典托管用户界面登录 | 无(无法访问)1 | 无 2 |
| 用户池 | Machine-to-machine 授权 | 无(无法访问)1 | 无 2 |
| 用户池 | SDK 和 REST API 未经身份验证的请求 | RCPs,VPC 终端节点策略 3 | RCPs |
| 用户池 | SDK 和 REST API sigv4 经过身份验证的请求 | RCPs、VPC 终端节点策略、基于身份的策略 3 | RCPs,基于身份的策略 |
| 身份池 | SDK 和 REST API 未经身份验证的请求(基本流程和增强流程) | RCPs,VPC 终端节点策略 | RCPs |
| 身份池 | SDK 和 REST API Sigv4 经过身份验证的请求(开发者身份验证的流程) | RCPs,基于身份的策略 | RCPs,基于身份的策略 |
1 VPC 终端节点不接受用户池域的请求。如果客户端有通往互联网的路由,则会应用 NAT,将源设置为公开。
2 用户池域的存在会阻止任何传输 VPC 终端节点的用户池请求完成。任何客户端只能通过公共交通路径前往用户池域和 API 服务终端节点,这使得用户池无法使用 VPC 终端节点。分配了域的用户池与不兼容 Amazon PrivateLink。
3 用户池不得分配域。
的操作模式 Amazon PrivateLink
Amazon PrivateLink 和 Amazon Cognito 支持以下示例实现模型。
| 资源 | 实施 | 操作 |
|---|---|---|
| 用户池 | 完全私有的 SDK 或 REST API 应用程序 |
|
| 用户池 | 公有和私有 |
|
| 用户池 | 私有或公共 OAuth 2.0 授权服务器 |
|
| 身份池 | 完全私密 |
|
| 身份池 | 公有和私有 |
|
亚马逊 Cognito 的注意事项
在为 Amazon Cognito 设置接口终端节点之前,请查看指南中的Amazon PrivateLink 注意事项。Amazon Cognito 支持通过接口终端节点调用所有 Amazon Cognito API 操作。有关这些操作的更多信息,请参阅 Amazon Cognito 用户池 API 参考和亚马逊 Co gnito 联合身份 API 参考。
Amazon PrivateLink 适用于亚马逊 Cognito 仅在商业 Amazon 区域可用。
用户池和 Amazon PrivateLink
您可以通过接口端点向所有用户池 API 操作发出请求,但不能向应用程序从用户池 OAuth 2.0 授权服务器请求的操作(例如客户端凭据授予和管理登录)发出请求。
cognito-idp用户池 API 具有未经身份验证、经过身份验证和令牌授权的 API 操作。您可以在 VPC 终端节点和资源控制策略中授予经过身份验证的操作的权限。与基于身份的策略不同,您还可以为未经身份验证和令牌授权的操作授予权限。VPC 终端节点和资源控制策略类型能够评估和拒绝或允许对其他公开操作的请求。
对域终端节点的请求也是公开的,但您无法在策略中对其进行评估。VPC 私有 DNS 不会将用户池域的请求路由到您的 VPC 终端节点。您只能通过公共互联网路径请求域名服务。有关更多信息,请参阅 策略对用户池操作的影响。
支持的操作
VPC 中的系统可以向用户池 API 操作发送请求,但不能向用户池域终端节点发送请求。无法通过 VPC 终端节点访问使用域终端节点(例如 M2M)、联合登录和授权码授予的 OpenID Connect machine-to-machine (OIDC) 和 OAuth 2.0 工作流程。VPC 终端节点策略对这些 HTTP 工作流程没有影响,也无法对其进行处理。从 VPC 内部向域终端节点发出的请求在接口终端节点上总是会失败,但是当您为用户池设置 VPC 终端节点时,仍然可以通过公有 DNS 和路由进行访问。
为了防止从 VPC 中的系统分配域,Amazon Cognito 在接口终端节点上阻止CreateUserPoolDomain请求。这样可以防止从 VPC 中的系统向您的用户池中添加域。要防止在所有系统中添加域,请对您的 Amazon Web Services 账户系统应用如下例所示的资源控制策略 (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" } ] }
您的用户池可能有一个域,并且在所有情况下都无法通过该域名访问 Amazon PrivateLink。所有向cognito-idp服务端点发出的基于 SDK 的用户池 API 请求都接受通过发送的请求 Amazon PrivateLink,但以下除外。CreateUserPoolDomain用户池 API 服务端点和域端点始终可通过公共互联网路径进行访问。要解决来自公共来源的访问问题,请实现 Amazon WAF
Web ACLs。
策略对用户池操作的影响
所有用户池 API 操作,即使是通常是公开且未经身份验证的操作,都可以在 VPC 终端节点策略和资源控制策略(RCPs)中进行控制。您还可以使用 VPC 条件键在基于身份的策略中限制用户池的访问权限。只有包含 Sigv4 格式的身份验证信息的请求才能在基于身份的策略中进行控制。托管登录和经典托管用户界面操作是单独的类别,不符合使用 VPC 传输或对其操作应用任何类型的策略的资格。
未经身份验证的操作
客户端应用程序的 Amazon Cognito 操作未通过 Sigv4 进行身份验证。示例操作位于的示例策略中为接口端点创建端点策略。未经身份验证的操作的其他示例包括GetUser和。AssociateSoftwareToken当您将这些操作添加到基于身份的策略时,它们不会产生任何影响。但是,您可以在 VPC 终端节点策略中允许或限制对这些操作的访问,以及RCPs。
未经身份验证的操作与 IAM 委托人无关。您的 VPC 终端节点策略或 RCP 必须允许所有委托人执行这些操作。
经过身份验证的操作
用于用户池管理和服务器端身份验证的 API 操作使用 Sigv4 进行身份验证。对于经过身份验证的操作,您可以使用应用于 VPC 终端节点的终端节点策略、组织中的资源控制策略以及应用于委托人的基于身份的策略来限制委托人。基于身份的策略和资源控制策略可感知 VPC,并使用基于网络的条件密钥(如和)。 aws:SourceVpc aws:SourceVpce
有关用户池的 API 操作的服务器端、客户端和管理类的更多信息,请参阅。API 和 SDK 身份验证的授权模型
身份池和 Amazon PrivateLink
Amazon Cognito 身份池通过支持所有 API 操作。 Amazon PrivateLink
支持的操作
接口端点支持所有身份池 API 操作。身份池没有域终端节点,也没有相同的限制。但是,身份池由于与 Amazon STS集成,因此在基于网络的访问控制方面有特定的注意事项。
Amazon STS 集成后的网络环境限制
身份池使用 Amazon STS AssumeRoleWithWebIdentity操作来提供临时 Amazon 证书。当身份池在增强的身份验证 Amazon STS 流程 Amazon PrivateLink 中调用时,网络上下文密钥(例如aws:SourceIpaws:SourceVpc、和)aws:SourceVpce包含来自身份池服务基础架构的值,而不是来自应用程序网络上下文的值。
如果您的 IAM 角色信任策略或资源控制策略 (RCPs) 使用基于网络的条件密钥来限制访问,则身份池操作可能会意外被拒绝。要解决此限制,您可以使用以下方法之一:
服务标识的主要标签
标记用于身份池的 IAM 角色,并修改您的策略以允许在委托人具有相应标签时进行操作。首先,为你的身份池角色添加一个标签:
aws iam tag-role \ -\-role-nameMyIdentityPoolRole\ -\-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" } } } ] }
特定于服务的上下文密钥
身份池为 VPC 终端节点策略中的资源级授权提供服务特定的上下文密钥,以及。 RCPs使用这些上下文密钥,您可以启用精细的访问控制,并在策略中区分经过身份验证的用户和未经身份验证的用户。
非 SIGV4 操作的可用服务特定上下文密钥,例如、、、GetIdGetCredentialsForIdentityGetOpenIdTokenUnlinkIdentity
-
cognito-identity-unauth:IdentityPoolArn-按身份池 ARN 筛选未经身份验证的用户的访问权限 -
cognito-identity-unauth:AccountId-按 Amazon Web Services 账户 ID 筛选未经身份验证的用户的访问权限 -
cognito-identity-auth:IdentityPoolArn-按身份池 ARN 筛选经过身份验证的用户的访问权限 -
cognito-identity-auth:AccountId-按 Amazon Web Services 账户 ID 筛选经过身份验证的用户的访问权限
可用于 SigV4 操作的特定于服务的上下文密钥,例如和 DeleteIdentitiesDescribeIdentity
-
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 支持使用资源控制策略()RCPs来控制对资源的访问权限。使用基于网络的条件密钥, RCPs 可以定义允许 Amazon PrivateLink 访问您的用户池和身份池的网络和操作。中的Action语句 RCPs 可以控制对经过身份验证和未经身份验证的用户池 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 控制台或 Amazon Command Line Interface ()Amazon CLI为 Amazon Cognito 创建接口终端节点。有关更多信息,请参阅《Amazon 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 的权限,请将自定义终端节点策略附加到接口终端节点。
端点策略指定以下信息:
-
可执行操作的主体(Amazon Web Services 账户、IAM 用户和 IAM 角色)。
-
可执行的操作。
-
可对其执行操作的资源。
-
在允许或拒绝请求之前必须满足的条件。
有关更多信息,请参阅《Amazon 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" } } } ] }
为运营创建基于身份的策略 Amazon PrivateLink
基于身份的策略是您可以附加到 Amazon 委托人的 IAM 资源。您可以通过 VPC 终端节点控制对 Amazon Cognito 的访问权限,该终端节点使用基于身份的策略进行 IAM 身份验证的操作。与端点策略不同,您无法在基于身份的策略中为未经身份验证的操作配置权限。经过身份验证或管理的操作需要签名版本 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" } } } ] }