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

用于 Kibana 的 Amazon Cognito 身份验证

Amazon Elasticsearch Service 使用 Amazon CognitoKibana 提供用户名和密码保护。此身份验证功能是可选的,仅适用于使用 Elasticsearch 5.1 或更高版本的域。如果不配置 Amazon Cognito 身份验证,您仍可使用基于 IP 的访问策略代理服务器来保护 Kibana。

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

提示

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

先决条件

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

  • Amazon Cognito 用户池

  • Amazon Cognito 身份池

  • 附加了 AmazonESCognitoAccess 策略的 IAM 角色

注意

用户池和身份池必须在同一个 AWS 区域中。您可以使用相同的用户池、身份池和 IAM 角色向多个 Amazon ES 域添加用于 Kibana 的 Amazon Cognito 身份验证。要了解更多信息,请参阅“限制”。

关于用户池

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

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

  • 您的 Amazon Cognito 用户池必须有一个域名。Amazon ES 使用此域名将用户重定向到用于访问 Kibana 的登录页。除了域名外,用户池不需要任何非默认配置。

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

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

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

关于身份池

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

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

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

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

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

关于 IAM 角色

Amazon ES 需要配置 Amazon Cognito 用户和身份池并将其用于身份验证的权限。您可以将 AmazonESCognitoAccess 用于此目的,它是一个 AWS 托管策略。如果您使用控制台来创建或配置 Amazon ES 域,它会为您创建一个 IAM 角色并将此策略附加到角色。

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

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

有关说明,请参阅 IAM 用户指南 中的创建向 AWS 服务委派权限的角色附加和分离 IAM 策略

配置 Amazon ES 域

满足先决条件后,您可以配置 Amazon ES 域,以将 Amazon Cognito 用于 Kibana。

注意

Amazon Cognito 并未在所有 AWS 区域中提供。有关受支持区域的列表,请参阅 AWS 区域和终端节点。您不需要对 Amazon Cognito 使用用于 Amazon ES 的同一区域。

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

由于控制台会为您创建 IAM 角色,因此控制台可提供最简单的配置体验。除了标准 Amazon ES 权限外,您还需要下面的一组权限,以使用控制台创建使用用于 Kibana 的 Amazon Cognito 身份验证的域:

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

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

{ "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/CognitoAccessForAmazonES" } ] }

配置用于 Kibana 的 Amazon Cognito 身份验证 (控制台)

  1. 转至 https://aws.amazon.com,然后选择 Sign In to the Console (登录控制台)

  2. Analytics (分析) 下,选择 Elasticsearch Service

  3. 在导航窗格中的 My domains (我的域) 下,选择要配置的域。

  4. 选择 Configure cluster (配置集群)

  5. 对于 Kibana authentication (Kibana 身份验证),选择 Enable Amazon Cognito for authentication (启用 Amazon Cognito 身份验证)

  6. 对于 Region (区域),选择包含您的 Amazon Cognito 用户池和身份池的区域。

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

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

    注意

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

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

  10. 选择 Submit

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

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

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

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

示例

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

aws es create-elasticsearch-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/*" }]}' --elasticsearch-version "6.0" --elasticsearch-cluster-config InstanceType=m4.xlarge.elasticsearch,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/CognitoAccessForAmazonES"

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

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

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

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

允许经过身份验证的角色

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

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

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

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

配置身份提供商

配置域以使用用于 Kibana 的 Amazon Cognito 身份验证时,Amazon ES 会向用户池中添加一个应用程序客户端,并将该用户池作为身份验证提供商添加到身份池。以下屏幕截图显示了 Amazon Cognito 控制台中的 App client settings (应用程序客户端设置)


                显示应用程序客户端设置的 Amazon Cognito 控制台

警告

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

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

要启用 SAML 2.0 身份提供商,您必须提供 SAML 元数据文档。要启用 Login with Amazon、Facebook 和 Google 等社交身份提供商,您必须拥有一个应用程序 ID 和来自提供商的应用程序密钥。您可以启用身份提供商的任意组合。添加页会在您添加提供商时添加选项,如下面的屏幕截图所示。


                包含若干选项的登录页

配置用户池的最简单方法是使用 Amazon Cognito 控制台。使用 Identity Providers (身份提供商) 页面添加外部身份提供商和 App client settings (应用程序客户端设置) 页面,以便对 Amazon ES 域的应用程序客户端启用和禁用身份提供商。例如,您可能希望启用自己的 SAML 身份提供商并禁用 Cognito User Pool (Cognito 用户池) 作为身份提供商。

有关说明,请参阅 Amazon Cognito 开发者指南 中的从用户池使用联合身份验证为您的用户池应用程序指定身份提供商设置

(可选) 配置精细访问

您可能已经注意到,默认的身份池设置会分配登录相同 IAM 角色 (Cognito_identitypoolAuth_Role) 的每个用户,这意味着每个用户都可以访问相同的 AWS 资源。如果您希望实现更精细的访问控制(例如,如果您希望贵组织的分析师能够访问所有八个 Amazon ES 域,但其他人只能访问其中五个域),那么您有两种选择:

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

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

使用 Amazon Cognito 控制台的 Edit identity pool (编辑身份池) 页来配置这些选项,如以下屏幕截图所示。


                用于身份验证提供商的角色选项

用户组和令牌

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

创建一个或多个用户组后,您可以对您的身份验证提供商进行配置,以便为用户分配其组的角色,而不是身份池的默认角色。选择 Choose role from token (使用令牌选择角色) 选项。然后选择 Use default Authenticated role (使用默认的经过身份验证的角色)DENY (拒绝) 以指定身份池应如何处理不属于组的用户。

规则

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

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

(可选) 自定义登录页

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

(可选)配置高级安全

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

测试

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

访问 Kibana

  1. 在 Web 浏览器中导航到 https://elasticsearch-domain/_plugin/kibana/

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

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

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

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

限制

Amazon Cognito 对于它的许多资源都有软限制。如果要对许多 Amazon ES 域启用 Kibana 身份验证,请根据需要查看 Amazon Cognito 中的限制请求限制增加

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

常见配置问题

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

配置 Amazon ES

问题 解决方案

Amazon ES can't create the role (console)

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

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

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

您也可以附加 IAMFullAccess 策略。

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

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

An error occurred (ValidationException) when calling the CreateElasticsearchDomain operation: Amazon Elasticsearch must be allowed to use the passed role

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

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

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

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

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

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

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

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

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

用户池没有域名。您可以使用 Amazon Cognito 控制台或以下 AWS CLI 命令配置一个:
aws cognito-idp create-user-pool-domain --domain name --user-pool-id id

访问 Kibana

问题 解决方案
登录页不显示我的首选身份提供商。

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

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

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

我的登录凭证不起作用。

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

如果您使用用户池作为身份提供商,请检查账户是否存在并确认 Amazon Cognito 控制台的 User and groups (用户和组) 页上是否已确认该账户。

Kibana 根本不加载或无法正常工作。

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

Invalid identity pool configuration. Check assigned IAM roles for this pool. Amazon Cognito 无法担任经过身份验证的角色。如果您使用了之前存在的角色,而不是为身份池创建一个新角色,请修改经过身份验证的角色的信任关系:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity" } ] }
或者,您也可以使用 Amazon Cognito 控制台创建新角色。
Token is not from a supported provider of this identity pool. 在从用户池删除应用程序客户端时,会出现这个不常见的错误。尝试在新的浏览器会话中打开 Kibana。

对 Kibana 禁用 Amazon Cognito 身份验证

使用以下过程可对 Kibana 禁用 Amazon Cognito 身份验证。

对 Kibana 禁用 Amazon Cognito 身份验证 (控制台)

  1. 转至 https://aws.amazon.com,然后选择 Sign In to the Console (登录控制台)

  2. Analytics (分析) 下,选择 Elasticsearch Service

  3. 在导航窗格中的 My domains (我的域) 下,选择要配置的域。

  4. 选择 Configure cluster (配置集群)

  5. 对于 Kibana authentication (Kibana 身份验证),请清除 Enable Amazon Cognito for authentication (启用 Amazon Cognito 身份验证)

  6. 选择 Submit

重要

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

删除对 Kibana 使用 Amazon Cognito 身份验证的域

要阻止使用用于 Kibana 的 Amazon Cognito 身份验证的域卡在 Processing (正在处理) 配置状态,请在删除这些域的关联 Amazon Cognito 用户池和身份之前 删除 Amazon ES 域。