为 OpenSearch 控制面板配置 Amazon Cognito 认证 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

为 OpenSearch 控制面板配置 Amazon Cognito 认证

您可以使用 Amazon Cognito 来验证和保护您的 Amazon OpenSearch Service 默认安装的 OpenSearch 控制面板。Amazon Cognito 身份验证是可选的,仅适用于使用 OPEN 搜索或 Elasticsearch 5.1 或更高版本的域。如果不配置 Amazon Cognito 身份验证,您仍可使用 基于 IP 的访问策略代理服务器、HTTP 基本身份验证或 SAML

大部分身份验证过程发生在 Amazon Cognito,但本节提供了配置 Amazon Cognito 资源以使用 OpenSearch Service 域的指南和要求。标准定价适用于所有 Amazon Cognito 资源。

提示

首次将域配置为针对 OpenSearch 控制面板使用 Amazon Cognito 身份验证时,我们建议使用控制台。Amazon Cognito 资源的可定制程度极高,并且控制台可以帮助您确定和理解对您重要的功能。

先决条件

在配置用于 OpenSearch 控制面板的 Amazon Cognito 身份验证之前,您必须满足几个前提条件。OpenSearch Service 控制台有助于简化这些资源的创建,但了解每个资源的用途有助于配置和故障排除。用于仪表板的 Amazon Cognito 身份验证需要以下资源:

  • Amazon Cognito 用户池

  • Amazon Cognito 身份池

  • IAM 角色已附加了 AmazonOpenSearchServiceCognitoAccess 策略 (CognitoAccessForAmazonOpenSearch)

注意

用户池和身份池必须在同一个 Amazon Web Services 区域 中。您可以使用相同的用户池、身份池和 IAM 角色向多个 OpenSearch Service 域添加用于控制面板的 Amazon Cognito 身份验证。要了解更多信息,请参阅 配额

关于用户池

用户池有两个主要功能:创建和管理用户目录、让用户注册和登录。有关创建用户池的说明,请参阅 Amazon Cognito 开发人员指南中的创建用户池

在创建要用于 OpenSearch Service 的用户池时,请考虑以下事项:

  • 您的 Amazon Cognito 用户池必须拥有域名。OpenSearch Service 使用此域名将用户重定向到登录页面,以便访问控制面板。除了域名外,用户池不需要任何非默认配置。

  • 您必须指定池的必需标准属性——名称、出生日期、电子邮件地址和电话号码等属性。创建用户池之后您将不能更改这些属性,因此此时请选择对您重要的属性。

  • 在创建用户池时,请选择用户能否创建自己的账户、账户的最小密码强度以及是否启用多因素身份验证。如果您计划使用外部身份提供商,这些设置无关紧要。从技术上说,您可以启用用户池作为身份提供商,同时启用外部身份提供商,但大多数人更愿意选其中一项。

用户池 ID 采用以下格式:region_ID。如果您计划使用 Amazon CLI 或 Amazon 软件开发工具包来配置 OpenSearch Service,请记下 ID。

关于身份池

借助身份池,您可以在用户登录后向用户分配临时性的受限权限角色。有关创建身份池的说明,请参阅 Amazon Cognito 开发人员指南中的身份池。在创建要用于 OpenSearch Service 的身份池时,请考虑以下事项:

  • 如果您使用 Amazon Cognito 控制台,则必须选中 Enable access to unauthenticated identities (启用未经验证的身份的访问权限) 复选框来创建身份池。在您创建身份池并配置 OpenSearch Service 阈之后,Amazon Cognito 禁用此设置。

  • 您无需向身份池添加外部身份提供商。在配置 OpenSearch Service 以使用 Amazon Cognito 身份验证时,它会将身份池配置为使用您刚刚创建的用户池。

  • 创建身份池后,您必须选择未经身份验证和经过身份验证的 IAM 角色。这些角色会指定用户在登录之前和之后拥有的访问策略。如果您使用 Amazon Cognito 控制台,它可以为您创建这些角色。在创建经过身份验证的角色后,请记下 ARN,采用以下格式:arn:aws:iam::123456789012:role/Cognito_identitypoolnameAuth_Role

身份池 ID 采用以下格式:region:ID-ID-ID-ID-ID。如果您计划使用 Amazon CLI 或 Amazon 软件开发工具包来配置 OpenSearch Service,请记下 ID。

关于 CognitoAccessForAmazonOpenSearch 角色

OpenSearch Service 需要权限来配置 Amazon Cognito 用户和身份池,并使用它们进行身份验证。为此,您可以使用 AmazonOpenSearchServiceCognitoAccess,它是一项 Amazon 托管策略。AmazonESCognitoAccess 是旧式策略,在该服务重命名为 Amazon OpenSearch Service 时,该旧式策略已被 AmazonOpenSearchServiceCognitoAccess 取代。两个策略都提供了最低 Amazon Cognito 权限,以便启用 Cognito 身份验证。有关策略 JSON,请参阅 IAM 控制台

如果您使用控制台来创建或配置 OpenSearch Service 域,它会为您创建一个 IAM 角色并将 AmazonOpenSearchServiceCognitoAccess 策略(如果是 Elasticsearch 域,则为 AmazonESCognitoAccess 策略)附加到角色。此角色的默认名称为 CognitoAccessForAmazonOpenSearch

角色权限策略 AmazonOpenSearchServiceCognitoAccessAmazonESCognitoAccess 均允许 OpenSearch Service 对所有身份和用户池完成以下操作:

  • 操作:cognito-idp:DescribeUserPool

  • 操作:cognito-idp:CreateUserPoolClient

  • 操作:cognito-idp:DeleteUserPoolClient

  • 操作:cognito-idp:UpdateUserPoolClient

  • 操作:cognito-idp:DescribeUserPoolClient

  • 操作:cognito-idp:AdminInitiateAuth

  • 操作:cognito-idp:AdminUserGlobalSignOut

  • 操作:cognito-idp:ListUserPoolClients

  • 操作:cognito-identity:DescribeIdentityPool

  • 操作:cognito-identity:SetIdentityPoolRoles

  • 操作:cognito-identity:GetIdentityPoolRoles

如果您使用 Amazon CLI 或 Amazon 开发工具包之一,则必须创建您自己的角色、附加策略并在配置您的 OpenSearch Service 域时为此角色指定 ARN。角色必须拥有以下信任关系:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "opensearchservice.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

有关说明,请查看 IAM 用户指南中的创建角色以向 Amazon 服务委托权限附加和分离 IAM 策略

将域配置为使用 Amazon Cognito 身份验证

满足先决条件后,您可以配置 OpenSearch 服务域,以将 Amazon Cognito 用于控制面板。

注意

Amazon Cognito 并非在所有 Amazon Web Services 区域 可用。有关受支持的区域的列表,请参阅 Amazon Web Services 区域 和终端节点。您不需要对 Amazon Cognito 使用与 OpenSearch 服务相同的区域。

配置 Amazon Cognito 身份验证(控制台)

由于它会为您创建 CognitoAccessForAmazonOpenSearch 角色,因此,控制台可提供最简单的配置体验。除了标准的 OpenSearch Service 权限之外,您还需要以下一组权限来使用控制台创建一个域,该域对 OpenSearch 控制面板使用 Amazon Cognito 身份验证。

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeVpcs", "cognito-identity:ListIdentityPools", "cognito-idp:ListUserPools", "iam:CreateRole", "iam:AttachRolePolicy" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/service-role/CognitoAccessForAmazonOpenSearch" } ] }

有关向身份(用户、用户组或角色)添加权限的说明,请参阅添加 IAM 身份权限(控制台)

如果 CognitoAccessForAmazonOpenSearch 已存在,则您需要较少的权限:

{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeVpcs", "cognito-identity:ListIdentityPools", "cognito-idp:ListUserPools" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/service-role/CognitoAccessForAmazonOpenSearch" } ] }
要为控制面板配置 Amazon Cognito 身份验证(控制台)
  1. https://console.aws.amazon.com/aos/home/ 打开 Amazon OpenSearch Service 控制台。

  2. Domains(域)下,选择要配置的域。

  3. 选择 Actions(操作)Edit security configuration(编辑安全配置)

  4. 选择启用 Amazon Cognito 身份验证

  5. 对于 Region(区域),请选择包含您的 Amazon Cognito 用户群体和身份池的 Amazon Web Services 区域。

  6. 对于 Cognito user pool(Cognito 用户池),选择一个用户池或创建一个。有关操作指南,请参阅 关于用户池

  7. 对于 Cognito identity pool(Cognito 身份池),选择一个身份池或创建一个。有关操作指南,请参阅 关于身份池

    注意

    Create user pool(创建用户池)Create identity pool(创建身份池)链接会将您定向到 Amazon Cognito 控制台,并需要您手动创建这些资源。此过程不是自动的。要了解更多信息,请参阅 先决条件

  8. IAM role name(IAM 角色名称),请使用默认值 CognitoAccessForAmazonOpenSearch(推荐)或输入新名称。要了解有关此角色用途的更多信息,请参阅关于 CognitoAccessForAmazonOpenSearch 角色

  9. 选择保存更改

在您的域完成处理后,请参阅允许经过身份验证的角色配置身份提供商,了解更多配置步骤。

配置 Amazon Cognito 身份验证 (Amazon CLI)

使用 --cognito-options 参数配置您的 OpenSearch Service 域。create-domainupdate-domain-config 命令均使用以下语法:

--cognito-options Enabled=true,UserPoolId="user-pool-id",IdentityPoolId="identity-pool-id",RoleArn="arn:aws:iam::123456789012:role/CognitoAccessForAmazonOpenSearch"

示例

以下示例使用 CognitoAccessForAmazonOpenSearch 角色在启用用于 Amazon Cognito 的身份验证的 us-east-1 区域中创建一个域并向该域提供对 Cognito_Auth_Role 的访问权限:

aws opensearch create-domain --domain-name my-domain --region us-east-1 --access-policies '{ "Version":"2012-10-17", "Statement":[{"Effect":"Allow","Principal":{"AWS": ["arn:aws:iam::123456789012:role/Cognito_Auth_Role"]},"Action":"es:ESHttp*","Resource":"arn:aws:es:us-east-1:123456789012:domain/*" }]}' --engine-version "OpenSearch_1.0" --cluster-config InstanceType=m4.xlarge.search,InstanceCount=1 --ebs-options EBSEnabled=true,VolumeSize=10 --cognito-options Enabled=true,UserPoolId="us-east-1_123456789",IdentityPoolId="us-east-1:12345678-1234-1234-1234-123456789012",RoleArn="arn:aws:iam::123456789012:role/CognitoAccessForAmazonOpenSearch"

在您的域完成处理后,请参阅允许经过身份验证的角色配置身份提供商,了解更多配置步骤。

配置 Amazon Cognito 身份验证(Amazon 软件开发工具包)

Amazon SDK(除 Android 和 iOS SDK 之外)支持在 Amazon OpenSearch Service API 参考中定义的所有操作,包括用于 CreateDomainUpdateDomainConfig 操作的 CognitoOptions 参数。有关安装和使用 Amazon 开发工具包的更多信息,请参阅 Amazon 软件开发工具包

在您的域完成处理后,请参阅允许经过身份验证的角色配置身份提供商,了解更多配置步骤。

允许经过身份验证的角色

默认情况下,您按 关于身份池 中的指南配置的经过身份验证的 IAM 角色没有访问 OpenSearch 控制面板所需的必要权限。您必须为该角色提供额外权限。

注意

如果您配置了精细访问控制,并使用开放的或基于 IP 的访问策略,则可以跳过此步骤。

您可以在基于身份的策略中包含这些权限,但除非您希望经过身份验证的用户有权访问所有 OpenSearch Service 域,否则附加到单个域的基于资源的策略是更好的方法。

对于 Principal,请为您按照 关于身份池 中的指导原则配置的、经过 Cognito 身份验证的角色指定 ARN。

{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Principal":{ "AWS":[ "arn:aws:iam::123456789012:role/Cognito_identitypoolnameAuth_Role" ] }, "Action":[ "es:ESHttp*" ], "Resource":"arn:aws:es:region:123456789012:domain/domain-name/*" } ] }

有关向 OpenSearch Service 域添加基于资源的策略的说明,请参阅 配置访问策略

配置身份提供商

配置域以使用用于控制面板的 Amazon Cognito 身份验证时,OpenSearch Service 会向用户池中添加一个应用程序客户端,并将该用户池作为身份验证提供商添加到身份池。

警告

请勿重命名或删除应用程序客户端。

根据用户池的配置情况,您可能需要手动创建用户账户,或者用户可能能够自行创建。如果这些设置可接受,您无需再采取进一步操作。但是,很多人都倾向于使用外部身份提供商。

要启用 SAML 2.0 身份提供商,您必须提供 SAML 元数据文档。要启用 Login with Amazon、Facebook 和 Google 等社交身份提供商,您必须拥有一个应用程序 ID 和来自提供商的应用程序密钥。您可以启用身份提供商的任意组合。

配置用户池的最简单方法是使用 Amazon Cognito 控制台。有关说明,请参阅 Amazon Cognito 开发人员指南中的从用户池使用联合身份验证为用户池应用程序指定身份提供商设置

(可选)配置精细访问

您可能已经注意到,默认的身份池设置会分配登录相同 IAM 角色 (Cognito_identitypoolAuth_Role),的每个用户,这意味着每个用户都可以访问相同的 Amazon 资源。如果要将精细访问控制与 Amazon Cognito 结合使用,例如,如果您希望组织的分析人员具有对多个索引的只读访问权限,同时希望开发人员具有对所有索引的写入访问权限您有两种选择:

  • 创建用户组并配置您的身份提供商,以根据用户的身份验证令牌选择 IAM 角色(推荐)。

  • 配置身份提供商,以根据一个或多个规则选择 IAM 角色。

有关包含精细访问控制的演练,请参阅教程:使用 IAM 主用户和 Amazon Cognito 身份验证配置域

重要

与默认角色一样,Amazon Cognito 必须是每个附加角色的信任关系的一部分。有关详细信息,请参阅 Amazon Cognito 开发人员指南中的为角色映射创建角色

用户组和令牌

当您创建用户组时,您会为该组的成员选择 IAM 角色。有关创建组的信息,请参阅 Amazon Cognito 开发人员指南中的用户组

创建一个或多个用户组后,您可以对您的身份验证提供商进行配置,以便为用户分配其组的角色,而不是身份池的默认角色。选择从令牌选择角色,然后选择使用默认身份验证角色拒绝以指定身份池如何处理不属于组的用户。

规则

规则实质上是由 Amazon Cognito 按顺序评估的一系列 if 语句。例如,如果一个用户的电子邮件地址包含 @corporate,Amazon Cognito 则为该用户分配 Role_A。如果一个用户的电子邮件地址包含 @subsidiary,则为该用户分配 Role_B。否则,它会为该用户分配默认的经过身份验证的角色。

要了解更多信息,请参阅 Amazon Cognito 开发人员指南中的使用基于规则的映射为用户分配角色

(可选)自定义登录页面

您可以使用 Amazon Cognito 控制台上传自定义徽标并对登录页进行 CSS 更改。有关说明和 CSS 属性的完整列表,请参阅 Amazon Cognito 开发人员指南中的为用户池指定 UI 自定义设置

(可选)配置高级安全

Amazon Cognito 用户池支持高级安全功能,如多重验证、盗用凭证检查和自适应身份验证。要了解更多信息,请参阅 Amazon Cognito 开发人员指南中的管理安全性

测试

对配置感到满意后,请验证用户体验是否符合的预期。

要访问 OpenSearch 控制面板
  1. 在 Web 浏览器中导航到 https://opensearch-domain/_dashboards。若要直接登录到特定租户,请将 ?security_tenant=tenant-name 附加到 URL。

  2. 使用首选凭证进行登录。

  3. 加载 OpenSearch 控制面板后,至少要配置一个索引模式。控制面板使用这些模式来标识要分析的索引。输入 *,选择 Next step (下一步),然后选择 Create index pattern (创建索引模式)。

  4. 要搜索或查看您的数据,请选择 Discover (发现)。

如果此过程的任何步骤失败,请参阅常见配置问题了解故障排除信息。

配额

Amazon Cognito 对于它的许多资源都有软限制。如果要为许多 OpenSearch Service 域启用控制面板身份验证,请查看 Amazon Cognito 中的限制,并根据需要请求提高限制

每个 OpenSearch Service 域都会向用户池中添加一个应用程序客户端,该客户端会向身份池添加一个身份验证提供商。如果您为 10 个以上域启用 OpenSearch 控制面板身份验证,则可能会遇到“maximum Amazon Cognito user pool providers per identity pool”(每个身份池的最大 Amazon Cognito 用户池提供商) 限制。如果超出限制,则您尝试配置以使用用于控制面板的 Amazon Cognito 身份验证的任何 OpenSearch Service 域都会卡在配置状态 Processing(正在处理)。

常见配置问题

下表列出了常见的配置问题和解决方案。

配置 OpenSearch 服务
问题 解决方案

OpenSearch Service can't create the role (console)

您没有正确的 IAM 权限。请添加配置 Amazon Cognito 身份验证(控制台)中指定的权限。

User is not authorized to perform: iam:PassRole on resource CognitoAccessForAmazonOpenSearch (console)

您没有 CognitoAccessForAmazonOpenSearch 角色的 iam:PassRole 权限。将以下策略附加到您的账户中:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": "arn:aws:iam::123456789012:role/service-role/CognitoAccessForAmazonOpenSearch" } ] }

您也可以附加 IAMFullAccess 策略。

User is not authorized to perform: cognito-identity:ListIdentityPools on resource

您没有 Amazon Cognito 的读取权限。将 AmazonCognitoReadOnly 策略附加到您的账户。

An error occurred (ValidationException) when calling the CreateDomain operation: OpenSearch Service must be allowed to use the passed role

CognitoAccessForAmazonOpenSearch 角色的信任关系中未指定 OpenSearch Service。检查您的角色是否使用了关于 CognitoAccessForAmazonOpenSearch 角色指定的信任关系。也可以使用控制台来配置 Amazon Cognito 身份验证。控制台将为您创建一个角色。

An error occurred (ValidationException) when calling the CreateDomain operation: User is not authorized to perform: cognito-idp:action on resource: user pool

--cognito-options 中指定的角色无权访问 Amazon Cognito。检查该角色是否附加了 Amazon 托管 AmazonOpenSearchServiceCognitoAccess 策略。也可以使用控制台来配置 Amazon Cognito 身份验证。控制台将为您创建一个角色。
An error occurred (ValidationException) when calling the CreateDomain operation: User pool does not exist

OpenSearch Service 找不到用户池。确认您已创建一个用户池并具有正确的 ID。要查找该 ID,您可以使用 Amazon Cognito 控制台或以下 Amazon CLI 命令:

aws cognito-idp list-user-pools --max-results 60 --region region

An error occurred (ValidationException) when calling the CreateDomain operation: IdentityPool not found

OpenSearch Service 找不到身份池。确认您已创建一个用户池并具有正确的 ID。要查找该 ID,您可以使用 Amazon Cognito 控制台或以下 Amazon CLI 命令:

aws cognito-identity list-identity-pools --max-results 60 --region region

An error occurred (ValidationException) when calling the CreateDomain operation: Domain needs to be specified for user pool

用户池没有域名。您可以使用 Amazon Cognito 控制台或以下 Amazon CLI 命令配置一个:
aws cognito-idp create-user-pool-domain --domain name --user-pool-id id
访问 OpenSearch 控制面板
问题 解决方案
登录页不显示我的首选身份提供商。

检查您是否按照 配置身份提供商 中指定的方式为 OpenSearch Service 应用程序客户端启用了身份提供商。

登录页看上去与我的组织无关。

请参阅(可选)自定义登录页面

我的登录凭证不起作用。

检查您是否按照配置身份提供商中指定的方式配置了身份提供商。

如果您使用用户池作为身份提供商,请检查 Amazon Cognito 控制台上是否存在账户。

OpenSearch 控制面板根本不加载或无法正常工作。

Amazon Cognito 身份验证角色需要阈 (/*) 的 es:ESHttp* 权限才能访问和使用控制面板。检查您是否按照允许经过身份验证的角色中指定的方式添加了访问策略。

当我从某个选项卡注销 OpenSearch 控制面板时,其余选项卡会显示一条消息,指出刷新令牌已被撤销。

如果您在使用 Amazon Cognito 身份验证时注销 OpenSearch 控制面板会话,OpenSearch Service 将运行 AdminUserGlobalSignOut 操作,该操作将使您注销所有处于活动状态的 OpenSearch 控制面板会话。

Invalid identity pool configuration. Check assigned IAM roles for this pool. Amazon Cognito 不具有代表经过身份验证的用户代入 IAM 角色的权限。修改角色的信任关系以包括:
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "identity-pool-id" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } }] }
Token is not from a supported provider of this identity pool. 在从用户池删除应用程序客户端时,会出现这个不常见的错误。尝试在新的浏览器会话中打开控制面板。

禁用 OpenSearch 控制面板的 Amazon Cognito 身份认证

使用以下过程可对控制面板禁用 Amazon Cognito 身份验证。

要为控制面板(控制台)禁用 Amazon Cognito 身份验证
  1. https://console.aws.amazon.com/aos/home/ 打开 Amazon OpenSearch Service 控制台。

  2. Domains(域)下,选择要配置的域。

  3. 选择 Actions(操作)Edit security configuration(编辑安全配置)

  4. 取消选择启用 Amazon Cognito 身份验证

  5. 选择保存更改

重要

如果您不再需要 Amazon Cognito 用户池和身份池,请将其删除。否则,您将继续产生费用。

删除使用 OpenSearch 控制面板的 Amazon Cognito 身份验证的阈。

要阻止针对控制面板使用 Amazon Cognito 身份验证的域卡在 Processing(正在处理)配置状态,请在删除这些域的关联Amazon Cognito 用户群体和身份池之前,先删除 OpenSearch Service 域。