亚马逊AWS官方博客
Amazon Elasticsearch Service 与 Cognito 集成轻松实现用户注册和访问控制
Elasticsearch 是针对大数据使用案例(如日志和点击流分析)的常见开源搜索和分析引擎。Amazon Elasticsearch Service 为您管理 Elasticsearch 集群的容量、扩展、修复和管理,同时让您可以直接访问 Elasticsearch API。
Amazon Cognito 能为我们提供简单安全的用户注册、登录和访问控制。借助 Amazon Cognito,您可以轻松将用户注册和身份验证功能添加到自己的移动和 Web 应用程序。Amazon Cognito 可与支持 SAML 或 OpenID Connect 的外部身份提供商和 Facebook、Twitter、Amazon 等社交身份提供商配合使用,同时您也可以将其与您自己的身份提供商相整合。
Kibana 是一种可以帮助您更好地了解数据的开源分析与可视化平台,而 Amazon Elasticsearch Service 附带对 Kibana 的内置支持。
Amazon Elasticsearch Service 现与 Amazon Cognito 集成,提供用户级的 Kibana 身份验证。
本文将为您演示如何通过简单的配置将 ES 与 Cognito 集成起来提供安全的用户注册、登录和访问控制。本文将演示两种认证方案:无代理服务器方案和代理服务器方案。
· 无代理服务器方案
通过 ES 提供的 Internet mode 直接访问,或者在 ES 的 VPC mode 下通过 VPN/Direct Connect 访问。
ES internet 模式的配置实现最简单,通过 AWS 控制台配置好就能立即使用,但由于直接暴露在公网上,需要做好安全配置。ES 的访问策略(access policy)可以限制或允许特定的用户访问 ES。
ES internet mode
ES 也可以配置在 VPC 模式下工作,但不能直接从外网访问。可以通过配置 VPN 或 Direct connect 的模式从 AWS 以外的地方访问。
VPC mode with VPN/Direct connect
· 代理服务器方案
ES 配置成 VPC mode 并部署在私有子网中,在 ES 同一 VPC 的公有子网中配置反向代理服务器(如 nginx 等),从而实现从 internet 的直接访问。
代理服务器方案
一. 无代理服务器方案 – Internet mode
Amazon Elasticsearch Service 提供了从 internet 直接访问的方案,与 Cognito 集成的配置方法如下:
第一步:创建 Cognito identity pool
1. 从 AWS 管理控制台进入 Cognito,点击按钮 Manage Federated Identities 进入 Federated Identities 页面,然后点击 Create new identity pool 开始创建新的 identity pool
2. 输入 Identity pool name, 如 idpool_test
3. 勾选 Enable access to unauthenticated identities。请注意在配置 ES 与 identity pool 和 user pool 集成后,ES 将会自动禁用此选项以禁止匿名用户登录
4. 点击 Create Pool 以创建 id pool
5. 在显示的新页面中点击 View Details,默认情况下 Cognito 将会创建两个 IAM Role,authenticated identities role 和 unauthenticated identities role,请记下 authenticated identities role 的名字,在 ES 中将会用到。
6. 点击 Allow 按钮以创建相应的 role。
7. 回到 AWS 管理控制台,进入到 IAM role 界面中。查找并记下 Cognito 为我们创建的 authenticated identities role (上面第5步中)的 ARN
第二步:创建 Cognito user pool
1. 从 AWS 管理控制台进入 Cognito user pool 管理页面,点击按钮 Create a user pool 开始创建一个新的 user pool
2. 输入 Pool name, 如 userpool_test。
3. 点击下面的 Review defaults 按钮进入 Review 页面,然后点击 Create pool 以创建 user pool。
4. 创建成功后从左侧导航栏选择 App integration -> Domain name,在 Domain prefix 中填入一个有效的 Domain prefix。请注意这个域名前缀在当前 AWS Region 必须是唯一的,填好后点击右侧的 Check availability 按钮,如果上面出现 “This domain is available” 则说明该域名前缀有效。然后点击 Save changes 以保存设置。
5. 现在可以创建一些测试用户了。从左侧导航栏选择 General settings -> Users and groups,然后点击右边页面中的 Create user,填入用户名初始密码等信息以创建新的用户。
第三步:创建 Elasticsearch Service
1. 从 AWS 管理控制台进入 Elasticsearch Service 页面,点击 Create new domain 以开始创建新的 Elasticsearch 服务。
2. 输入 Elasticsearch domain name,点击 Next 进入下一页
3. 在 Configure user 页面中点击 Next 进入下一页
4. 在 Setup access 页面中,选择 Public access
5. 勾选 Enable Amazon Cognito for authentication,在 Cognito User Pool 和 Cognito Identity Pool 中分别选择上面两步骤中创建的 user pool 和 id pool。
6. 在 Access Policy 中填入如下信息,将 $ARN_Cognito_IdPoolAuth_Role 替换成上面创建 Cognito identity pool 时第7步所查找到的 authenticated identities role 的 ARN。然后点击 Next, Confirm 以创建 ES
7. 后台创建 ES domain 可能需要几分钟时间,当 Domain status 变成 Active 时说明 ES 已经准备就绪了。
8. 在创建好的 ES 页面中点击 Kibana 对应的 URL,然后输入创建 Cognito user pool 中新建的用户名密码就可以成功进入 Kibana 界面了!
二. 无代理服务器方案 – VPC mode
VPC mode 的配置与 Internet mode 基本一样,除了上面第三步创建 Elasticsearch Service 的4中选择 Network configuration 时需要选择 VPC access,并选择相应的 VPC、Subnet、Security Groups 等配置。
在 VPC 模式下,默认情况下无法从外网 (Internet) 访问 ES,可以配置 VPN 或者 Direct Connect 网络以从办公网络等 AWS 以外的地方访问。关于 VPN 和 Direct Connect 的配置,请参考 AWS 相应的文档。
三. 代理服务器方案
1. 我们将 ES 配置成 VPC mode 并部署在私有子网中,配置方法和上面的 VPC mode 相同。
2. 在 ES 同一 VPC 内配置 nginx 作为反向代理服务器。nginx 的安装请参考官方文档,nginx.conf 主要的配置信息如下,修改配置前请将绿色部分作相应的替换:
请将 $server_domain 替换成 nginx 所在主机的 FQDN,如 ec2-52-74-123-123.ap-southeast-1.compute.amazonaws.com
$es-auth 替换成 ES auth 的 URL,该 URL 可以从上面创建 Cognito user pool 的第4步中找到,如 es-test.auth.ap-southeast-1.amazoncognito.com
$es-domain 替换成 ES 的 domain,可以从上面创建 Elasticsearch Service 的第8步中找到 Endpoint,如 search-es-test-sop76ebjpeotlpv22jy4cev3xy.ap-southeast-1.es.amazonaws.com
3. 重启 nginx 后就可以从 nginx 所在的 FQDN 登录 Kibana 了。
参考资料:
1. Amazon Cognito Authentication for Kibana