亚马逊AWS官方博客
在 Open Distro for Elasticsearch 中设置多租户 Kibana 访问权限
Elasticsearch 已经成为存储和分析日志数据的默认选择,以提供有关应用程序性能、您的安全性状况以及用户与应用程序之间互动的见解。它是如此有用,以至于许多团队在开发周期的初期就采用 Elasticsearch 来支持开发运营。这种自发性的采用往往会迅速成长,在大型组织中形成纷繁混杂的集群和用户。在某个时刻,您需要集中管理日志,从而可以更严密地管理您的支出和使用情况。
集中式日志记录架构的缺点在于,您必须管理数据的访问权限。您希望支付处理部门的数据保持私有,对(例如)您的前端开发人员不可见。借助 Open Distro for Elasticsearch 安全性插件,您可以按照文档和字段级别的粒度来管理数据访问权限。您会创建角色,为这些角色分配操作组,并将用户映射到角色以控制他们对索引的访问权限。
Kibana 的访问控制更加难以实现。通常,Kibana 的可视化项目和控制面板会共享一个通用的索引 .kibana
。如果您的用户拥有该索引的访问权限,则他们将可以访问其中的所有可视化项目。Open Distro for Elasticsearch 安全性插件允许您定义租户(将可视化项目和控制面板隔离起来),实现了多租户 Kibana 体验,从而解决了此问题。在本博文中,我将演示如何为两个假象的部门设置多租户环境,一个为支付部门,另一个为前端部门。
先决条件
Open Distro for Elasticsearch 已经默认启用 Kibana 多租户功能。如果您禁用了多租户功能,则我们的文档将引导您启用它。您需要有一个正在运行的 Open Distro for Elasticsearch 集群。我运行 esrally,使用 http_logs
跟踪来生成集群中的索引。我将为支付部门使用 logs-221998
,为前端部门使用 logs-211998
。
重要提示:您必须为您的角色、用户和租户提供不同的名称! 我使用附加 -role、-user 和 -tenant 的惯例来确保名称的唯一性。
设置角色
角色是 Open Distro for Elasticsearch 安全性插件进行访问控制的基础。您可以通过角色指定其用户可以执行的操作,以及这些用户可以访问的索引。
我将创建两个角色 — payments-role
和 frontend-role
— 每个角色分别拥有相关索引的访问权限。要创建角色,请导航至 https://localhost:9200
。使用拥有管理员权限的用户登录(我选择了默认的 admin
用户)。单击自行探索以关闭启动屏幕,然后单击 Kibana 左侧工具条中的安全性选项卡,然后单击角色按钮:
然后单击“+”按钮以添加新角色。
在概述部分,将角色命名为 payments-role,然后单击页面顶部的索引权限选项卡。您还可以在集群权限选项卡中为角色设置集群级别的权限。在本博文中,我将限制为使用索引级别的访问控制。
在索引权限选项卡中,单击添加新索引和文档类型按钮。在结果页面中,从索引下拉列表中选择 logs-221998,然后单击保存。
单击保存将会显示权限:操作组下拉列表。选择全部(您可以选择读取等,为此用户设置更严格的权限,这将会仅允许只读访问)。这时不要单击保存角色定义,因为您还需要添加租户。选择租户选项卡,然后单击添加按钮。在 Tenant 字段填写 payments-tenant。您可以在此字段填写任何唯一的值;它仅仅是您为该租户选择的一个名称。
此角色的配置已经完成。单击保存角色定义。
重复此流程以创建 frontend-role 角色,为其设置对另一个索引的访问权限和不同的租户名称。我的集群中将使用 logs-211998
和 frontend-tenant。
设置用户
Open Distro for Elasticsearch 中的用户是通过了身份验证的实体。您可以将它们添加到角色,从而赋予相关角色允许的权限。Open Distro for Elasticsearch 安全性插件拥有一个内部用户数据库。如果您直接通过 Kibana 登录或基本的 HTTP 验证来完成身份验证,您将直接被分配给该用户。
您在下面的许多屏幕中还将看到“后端”一词。后端角色是指联合身份提供商提供的角色。后端角色区别于并且将映射到内部角色和用户。这似乎有些令人费解,但对于本博文,我们可以忽略后端角色。
我将创建两个用户 — payments-user
和 frontend-user
。 单击 Kibana 左侧工具条中的安全性,然后单击内部用户数据库按钮。
单击“+”符号以添加新内部用户:
填写用户名、密码和再次输入密码字段。单击提交。
重复此流程创建 frontend-user 和 frontend-tenant。
将用户映射到角色
最后一步是将您创建的用户(及其租户)映射到您创建的角色。单击安全性选项卡,然后单击角色映射按钮。
然后单击“+”按钮以添加新角色映射。从角色下拉列表中选择 payments-role。单击 + 添加用户按钮,然后在文本框中键入 payments-user。最后单击提交。
为 frontend-role 角色和 frontend-user 用户重复此流程。
为确保您的用户能够使用 Kibana,您还需要将他们添加到 kibana_user
角色。从角色映射屏幕中,单击 kibana_user 的编辑铅笔图标。
在下一屏幕中,单击 添加用户并在文本框中键入 payments-user。再次单击添加用户以添加 frontend-user。单击提交以保存更改。
恭喜,您的设置已经完成!
测试租户
注意:如果您的浏览器在 Cookie 中缓存了您的身份,您可能会遇到问题。要在干净的环境中进行测试,在 Firefox 中请使用文件 > 新建隐私窗口,这时将打开一个不含保存的 Cookie 的窗口。在 Chrome 中请使用 文件 > 新建隐身窗口。
要测试您的租户和访问控制,您将创建一个可视化项目作为 payments-user 并设置 payments-tenant,然后验证您在以 frontend-user 身份登录时将无法访问该可视化项目。在您的新窗口中,导航至 https://localhost:5601
,然后作为 payments-user
用户登录。单击自行探索以关闭启动屏幕。在 Kibana 的左侧工具条中单击租户选项卡。
您可以看到当前已经选中 Private
租户。每个角色都拥有一个 Global
租户和一个 Private
租户。如果您选择 Global
租户,您所完成的工作将对所有其他用户/租户可见。如果您选择 Private
租户,则您完成的工作仅对登录用户可见(当前为 payments-user
)。最后,您可能会看到 payments-tenant
租户。选中 payments-tenant 租户时,仅拥有该租户角色的用户可以看到可视化项目和控制面板。单击 payments-tenant 旁的选择,以选择 payments-tenant
租户。
现在您需要创建并保存一个可视化项目。首先要创建一个索引模式。单击管理选项卡,然后单击索引模式。在索引模式文本框中键入 logs-221998。单击下一步。在下一屏幕中,设置您的时间筛选条件字段名称。
注意:正常情况下,您将为您的索引模式使用通配符。Esrally 在我的集群中创建了 6 个索引,全部采用 logs-XXXXXX
模式。当您设置角色时,您将为每个角色赋予对特定索引的访问权限。在此例中,payments-user 仅拥有 logs-221998 索引的访问权限。当您将某个可视化项目作为此用户创建时,Kibana 将拥有与您现在创建索引模式中的通配符匹配的所有索引的访问权限,包括被禁止的另外五个索引。Kibana 将会失败,并返回一条访问错误消息。为解决此问题,请键入准确的索引名称。为确保集中记录日志,请确保每个部门都为其索引使用唯一的前缀。然后,您的索引模式可以包含各个部门的通配符值。
在可视化选项卡中,使用流量计数创建一个简单的指标(注意,Rally 的 http_logs
数据时间戳为 1998 年。您需要设置时间选择器才能正确查看任何结果)。 将它保存为 payments-traffic。
退出登录,然后在新隐私窗口中以 frontend-user
身份重新登录。在租户选项卡中,您将看到您拥有 frontend-tenant
,而不是 payments-tenant
。
选择可视化选项卡,您将被提示创建索引模式。使用 logs-211998
索引。再次选择可视化选项卡。Kibana 将显示您没有可视化项目。
小结
在本博文中,您使用 Open Distro for Elasticsearch 安全性插件创建了两个用户,并通过您赋予的角色为它们提供了自己的 Kibana 租户。Open Distro for Elasticsearch 的租户模型可保持租户的相互隔离,从而确保您的支付部门的可视化项目和控制面板对前端部门的用户不可见。然后,您进一步限制了对底层索引的访问权限,从而确保前端部门的用户无法访问支付部门的索引中的数据。您创建了一个孤岛以方便您管理您的敏感数据!
立即加入 GitHub 以完善项目文档,添加示例,提交功能请求,以及提交漏洞报告。检查代码,构建插件,打开 Pull 请求 — 我们非常乐意审核和分析集成步骤。欢迎您参与此项目。如果您有任何问题,请通过社区开发论坛提出。