通过最小化设置,从零开始实现Amazon Elasticsearch Service的Kibana Cognito认证配置

首先

在Amazon Elasticsearch Service中提供了基于IAM的身份验证功能。本文首先说明了Elasticsearch Service的身份验证概述,然后解释了在使用Elasticsearch的Kibana时配置此身份验证功能的步骤。

理解亚马逊 Elasticsearch 服务的认证功能。

软件的Elasticsearch除了支持基本认证之外,Amazon Elasticsearch Service只支持IAM认证。从安全性来说,这是一件好事,但也增加了使用门槛。

Amazon Elasticsearch Service有两种API,分别是基础架构操作的AWS API和数据操作的Elastcisearch API,这两种API都需要IAM认证。AWS API是通过AWS CLI或SDK进行操作,可以很好地隐藏IAM认证,但是Elasticsearch API需要在客户端进行IAM认证处理,即必须对HTTP请求进行签名(签名Amazon Elasticsearch Service的HTTP请求),这有点麻烦。而且,在客户端应用程序中,通常会使用方便的组件等,因此这个组件是否支持AWS的IAM认证就成为一个问题(目前很多组件都不支持)。如果Amazon Elasticsearch Service也支持基本认证,那就会非常简单。

例如,用于简化Elasticsearch前端应用程序开发的Reactivesearch不支持IAM认证。确切地说,确实有些人通过自愿来支持Amazon API Gateway的IAM认证(支持签名请求/ AWS Elasticsearch#419)。但是,仍然很麻烦。

另外,还可以使用AWS Amplify来实现。AWS Amplify是一个非常方便的服务,它隐藏了认证和后端的复杂配置,使其变得简单。也可以将Elasticsearch用作后端。但是,使用方法仅限于从DynamoDB Streams输入,并且只能通过AppSync进行使用,只能进行相当标准化的使用。也无法从类似于Reactivesearch的组件中使用。

更详细的内容可以参考”Amazon Elasticsearch Service 的认证/授权繁琐的规范尽量明确地解释”这篇文章。

该文章只解释了AWS在Kibana中提供的IAM认证配置。

制作的东西

亚马逊 Elasticsearch Service提供了Access Policy(与AWS常规服务中的资源策略相当)功能,通过在此指定IAM用户或IAM角色作为Policy的Principal,可以启用基于IAM的认证。将Access Policy的Principal设为“*”(星号)将实现无需认证的访问。

然而,要使IAM认证实际生效,还需要在客户端进行相应的支持。当操作Elasticsearch Service的基础架构时,AWS CLI等将成为客户端,并在其中实现IAM认证。如果要使用Elasticsearch API,则需要实现某种形式的认证界面。在这里,我们以Kibana(实际上是Elasticsearch Service本身)作为客户端,并与Cognito进行协作提供认证界面。另外,假定只有管理员才能注册和使用Kibana登录用户。

ElasticsearchWithCognito.png

以下是认证的流程:

1. 访问Elasticsearch Service的Kibana端点(URL)。
2. 将会被重定向到Cognito用户池。
3. 在Cognito的认证界面上输入用户ID/密码进行认证。
4. 在Cognito ID池中,将会返回与Kibana(在Cognito中注册为APP Client)相关联的IAM角色的会话密钥给浏览器。
5. 携带会话密钥和其他认证信息再次访问Kibana端点。
6. 根据访问策略,将授予Elasticsearch权限。

用户端的身份验证界面和流程如下:”访问Kibana并进行确认”。

事前安排

    Amazon Elasticsearch Service環境(参考:「Amazon Elasticsearch Serviceで検索できる状態まで最速で立ち上げる」)

步骤

使用Cognito创建用户池和身份池的容器,将用户注册到用户池中,并启用Kibana身份验证的Elasticsearch服务(将自动注册到Cognito),以上便是流程。

Cognito的配置

创建用户池

只允许管理员创建用户,禁止自行注册,并在除了设置域名之外的部分保持默认设置。

    1. 登录AWS管理控制台,进入Cognito界面

 

    1. 点击”管理用户池”按钮

 

    1. 点击”创建用户池”按钮

 

    1. 在池名称中输入任意名称来进行识别,并点击”确认默认设置”按钮

 

    1. 点击左侧面板的”策略”

 

    1. 在”允许用户自行注册吗?”选项中,勾选”仅允许管理员创建用户”,并点击”保存更改”按钮(如果需要更改其他密码策略,也要进行相应更改)

 

    1. 点击”创建池”按钮

 

    1. 点击左侧面板的”应用集成”,并点击”域名”

 

    在域名前缀中输入任意名称,并点击”检查可用性”按钮,在确认可用后点击”保存更改”按钮

创建ID池

認證提供者的設置等將在Elasticsearch設置中自動進行,因此無需在此進行設置,一切都將保持默認設置。

    1. 点击左上角灰色的”联合身份”链接

 

    1. 点击”创建新的ID池”按钮

 

    1. 在”ID池名称”中输入任意名称以进行识别,其他保持默认(保持选中”为未认证ID启用访问”,并且不设置任何”身份验证提供程序”),点击”创建池”按钮

 

    1. 在”为您的新身份池设置使用的IAM角色”中,直接点击”允许”按钮,将创建认证用户角色和未认证用户角色

 

    然后点击”转到仪表板”按钮,返回到原来的界面

用户注册至用户池

注册Kibana访问的用户。为了设置管理员进行用户管理,不需要提供用户自己想要管理的电子邮件地址等。

    1. 点击左上角的Cognito图标,然后点击出现的“用户池”按钮

 

    1. 点击所需用户池的名称

 

    1. 在左侧窗格中点击“常规设置”下的“用户和组”选项

 

    1. 点击“创建用户”按钮

 

    1. 在弹出窗口中,输入用户名,取消“是否向该新用户发送邀请?”的勾选,输入临时密码,电话号码和电子邮件地址为空,取消“是否将电话号码验证?”和“是否将电子邮件验证?”的勾选,点击“创建用户”

 

    创建一个状态为FORCE_CHANGE_PASSWORD的账户

Elasticsearch服务的设置

啟用Kibana認證的設定

    1. 移动到AWS管理控制台中的Elasticsearch Service页面

 

    1. 点击目标域名

 

    1. 点击”编辑域”按钮

 

    1. 在”Amazon Cognito身份验证”中,选中”启用Amazon Cognito身份验证”,在”区域”中选择亚太地区(东京),选择上面创建的Cognito用户池和Cognito ID池,IAM角色名称和角色策略保持不变,然后点击”提交”按钮(*1)

 

    等待域的状态变为活动

在这种情况下,仅在Cognito的用户池和身份池中配置了Elasticsearch的APP客户端,不意味着Kibana会出现身份验证页面。可以确认Cognito用户池的应用程序客户端(APP Client)和身份池的认证提供程序中包含了来自Elasticsearch的配置。

设置访问策略

只有与Cognito进行身份验证的用户相关联的IAM角色才能设置访问策略以操作Elasticsearch API。

    1. 为了确认应用于Cognito认证用户的IAM Role的ARN(用于标识的ID),请转到AWS管理控制台的IAM页面。

 

    1. 点击左侧菜单中的”Roles”并打开。

 

    1. 默认情况下,角色将以”Cognito_[ID Pool名称]Auth_Role”的名称创建,因此在此名称上进行搜索并复制”Role ARN”。

 

    1. 转到AWS管理控制台的Elasticsearch Service页面。

 

    1. 点击目标域名。

 

    1. 从”操作”按钮中选择”编辑访问策略”。

 

    1. 按照下面的Kibana认证时的访问策略设置示例,对”JSON定义的访问策略”进行编写,并点击”提交”按钮。

 

    等待域的状态变为活动状态。

登录Kibana并进行确认。

    1. 访问Elasticsearch Service的域面Kibana的终端点(URL)

 

    输入已注册的用户ID/密码
changepwd.png

在本次的设置和用户注册方法中,即使输入了邮箱地址,用户也不会收到邮件。而且,如果忘记了密码,点击“忘记密码?”链接也无法解决。管理员需要从AWS管理控制台的Cognito界面重新注册。

Kibana身份验证访问策略设置示例


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::[アカウントID]:role/Cognito_[IDプール名]Auth_Role"
      },
      "Action": "es:ESHttp*",
      "Resource": "arn:aws:es:ap-northeast-1:[アカウントID]:domain/[ドメイン名]/*"
    }
  ]
}

以上就是。

Amazon Elasticsearch Service的IAM认证限制

正如在「Amazon Elasticsearch Service认证功能理解」中所写的,Elasticsearch Service本身和Kibana的终端URL相同,并且应用了相同的访问策略,因此在Kibana中启用IAM认证后,Elasticsearch API也将采用IAM认证。在Elasticsearch客户端实现IAM认证有些麻烦,同时也会限制使用前端组件的自由度。

如果将Reactivesearch等作为客户端使用,可以选择自己实现IAM认证(HTTP签名),或者通过API Gateway(+ Lambda)访问以实现IAM认证,或者放弃认证并通过访问策略进行IP地址限制等访问控制。

链接

在Kibana中添加Cognito身份验证
“Kibana的Amazon Cognito身份验证”指南

bannerAds