配置用于 Kibana 的 Amazon Cognito 身份验证 - Amazon Elasticsearch Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

配置用于 Kibana 的 Amazon Cognito 身份验证

您可以对 Amazon Elasticsearch Service (Amazon ES) 的默认安装进行身份验证和保护您的 Amazon Elasticsearch Service (Amazon ES) 使用Amazon Cognito。Amazon Cognito 身份验证是可选的,仅适用于使用 Elasticsearch 5.1 或更高版本的域。如果不配置 Amazon Cognito 身份验证,您仍可使用基于 IP 的访问策略代理服务器、HTTP 基本身份验证或SAML

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

提示

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

Prerequisites

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

  • Amazon Cognito用户池

  • Amazon Cognito身份池

  • 具有AmazonESCognitoAccess附加策略 (CognitoAccessForAmazonES

注意

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

关于用户池

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

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

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

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

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

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

关于身份池

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

  • 如果您使用 Amazon Cognito 控制台,则必须选中启用未经验证的身份的访问权限复选框创建身份池。创建身份池和配置 Amazon ES 域,Amazon Cognito 将禁用此设置。

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

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

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

关于 CognitoAccessForAmazon 角色

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

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

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

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

配置亚马逊 ES 域

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

注意

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

配置 Amazon Cognito 证(控制台)

由于它会为您创建 CognitoAccessForAmazonES 角色,因此,控制台可提供最简单的配置体验。除了标准 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": "*" } ] }

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

{ "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. 选择操作修改身份验证

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

  6. 适用于区域中,选择包含 Amazon Cognito 用户池和身份池的区域。

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

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

    注意

    这些区域有:创建新的用户池创建新的身份池链接会将您定向到 Amazon Cognito 控制台,并需要您手动创建这些资源。此过程不是自动的。要了解更多信息,请参阅“Prerequisites”。

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

  10. 选择 Submit

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

配置 Amazon Cognito 身份验证 (Amazon 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"

示例

以下示例在us-east-1使用 Kibana 启用 Amazon Cognito 身份验证的区域CognitoAccessForAmazonES角色,并提供对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 身份验证 (Amazon开发工具包)

这些区域有:Amazon开发工具包(除 Android 和 iOS 开发工具包之外)支持在Amazon Elasticsearch Service 的配置 API 参考,包括CognitoOptions的参数CreateElasticsearchDomainUpdateElasticsearchDomainConfig运算。有关安装和使用Amazon开发工具包,请参阅Amazon软件开发工具包

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

允许经过身份验证的角色

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

重要

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

您可以将这些权限包含在基于身份的策略,但除非您希望经过身份验证的用户能够访问所有 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 域中添加基于资源的策略的说明,请参阅配置访问策略

配置身份提供商

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


                显示 app 客户端设置的 Amazon Cognito 控制台
警告

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

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

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


                包含若干选项的登录页

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

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

(可选)配置精细访问

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

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

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

您可以使用编辑身份池页面,如以下屏幕截图所示。有关包含精细访问控制的演练,请参阅教程:IAM 主用户和 Amazon Cognito 权


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

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

用户组和令牌

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

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

Rules

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

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

(可选)自定义登录页

这些区域有:UI 自定义项页面上传自定义徽标并对登录页进行 CSS 更改。有关说明和 CSS 属性的完整列表,请参阅为用户池指定应用程序 UI 自定义设置中的Amazon Cognito 开发人员指南

(可选)配置高级安全

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

Testing

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

访问 Kibana

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

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

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

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

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

Limits

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

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

常见配置问题

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

配置 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:PassRole的权限CognitoAccessForAmazonES角色。将以下策略附加到您的账户中:
{ "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

Amazon ES 未在CognitoAccessForAmazonES角色。检查您的角色是否使用了关于 CognitoAccessForAmazon 角色指定的信任关系。也可以使用控制台来配置 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。检查角色是否具有Amazon托管AmazonESCognitoAccess附加策略。也可以使用控制台来配置 Amazon Cognito 身份验证。控制台将为您创建一个角色。
An error occurred (ValidationException) when calling the CreateElasticsearchDomain operation: User pool does not exist

Amazon ES 找不到用户池。确认您已创建一个用户池并具有正确的 ID。要查找该 ID,您可以使用 Amazon Cognito 控制台或以下Amazon 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 控制台或以下Amazon 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 控制台或以下配置一个Amazon CLI命令:
aws cognito-idp create-user-pool-domain --domain name --user-pool-id id
访问 Kibana
问题 解决方案
登录页不显示我的首选身份提供商。

检查您是否按照 Amazon ES 应用程序客户端启用了身份提供商,如配置身份提供商

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

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

我的登录凭证不起作用。

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

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

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

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

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. 在从用户池删除应用程序客户端时,会出现这个不常见的错误。尝试在新的浏览器会话中打开 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. 选择操作修改身份验证

  5. 对于 Amazon Cognito authentication (Amazon Cognito 身份验证),清除 Enable Amazon Cognito authentication (启用 Amazon Cognito 身份验证) 复选框。

  6. 选择 Submit

重要

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

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

要阻止使用用于 Kibana 的 Amazon Cognito 身份验证的域卡在配置状态处理,删除亚马逊 ES 域优化前删除他们关联的 Amazon Cognito 用户池和身份池。