通过 TLS 加密和基于角色的访问控制确保 Elasticsearch 的安全 | Elastic Blog
工程

Elasticsearch 安全功能入门

从 Elastic Stack 6.8 和 7.1 开始,我们在默认分发包中免费提供多项安全功能,例如 TLS 加密通信、基于角色的访问控制 (RBAC),等等。在此篇博文中,我们将会讲解如何启用这些功能来确保您的 Elasticsearch 集群的安全。

为了给您提供一个实际示例来演示如何确保 Elastic Stack 实施项目的安全,我们将会在本地机器上创建一个两节点 Elasticsearch 集群并进行安全设置。要实现这一点,我们首先需要在两个节点之间配置 TLS 通信。然后,我们会为 Kibana 实例(用于分析并可视化集群中的数据)启用安全功能。再然后,我们会在 Kibana 中配置基于角色的访问控制,从而确保用户只能看到他们获授权能够看到的内容。

尽管关于安全功能的运行过程还有很多内容,但现在我们仅会介绍入门所需知识。阅读完本篇博文后,我们推荐您查看 Elastic Stack 安全功能的相关文档,其中包含能帮助到您的实用示例。快速提示:我们将会在本地集群完成所有这些操作,这是因为尽管这些功能从 6.8 和 7.1 开始默认提供,但这些功能在我们的 Elasticsearch Service 中一直都是标配。

安装 Elasticsearch 和 Kibana

在这个示例中,我将会在运行 Linux 的笔记本电脑上进行安装。请根据您的具体环境相应调整下列步骤。

步骤 1:下载 Elasticsearch 和 Kibana

您需要做的第一件事是下载 Elasticsearch 和 Kibana 6.8+ 或 7.1+ 版本的默认分发包。由于我们已将安全功能添加到 7.1 或 6.8 的默认分发包中,所以如果使用的是旧版本,您需要进行升级。

第 2 步:提取 Elasticsearch 和 Kibana

在这个例子中,我已下载 elasticsearch-7.1.0-linux-x86_64.tar.gzkibana-7.1.0-linux-x86_64.tar.gz。下载完毕之后,您需要将其中的内容提取出来。

第 3 步:创建两个 Elasticsearch 节点

如要创建一个两节点集群,您需要创建两个 Elasticsearch 目录副本,其中一个名为 master(主节点),另一个名为 node(节点)。完成这一步之后,您将会看到下列文件和文件夹:

elasticsearch-7.1.0                      elasticsearch-7.1.0-node
elasticsearch-7.1.0-linux-x86_64.tar.gz  kibana-7.1.0-linux-x86_64
elasticsearch-7.1.0-master               kibana-7.1.0-linux-x86_64.tar.gz

配置 TLS 和身份验证

我们要做的第一件事是生成证书,通过这些证书便能允许节点安全地通信。您可以使用企业 CA 来完成这一步骤,但是在此演示中,我们将会使用一个名为 elasticsearch-certutil 的命令,通过这一命令,您无需担心证书通常带来的任何困扰,便能完成这一步。

步骤 1:在 Elasticsearch 主节点上配置 TLS

您可以使用 cd 命令更改至 master 目录,然后运行下列命令:

bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""

接下来,使用您最常用的文本编辑器打开文件 config/elasticsearch.yaml。将下列代码行粘贴到文件末尾。

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

保存文件,现在我们便可以启动主节点了。运行命令 bin/elasticsearch。这一可执行文件必须保持运行,现在可以将此终端放在一边。

第 2 步:Elasticsearch 集群密码

一旦主节点开始运行,便可以为集群设置密码了。在新终端中,我们必须通过 cd 命令更改至主节点目录。然后我们运行命令 bin/elasticsearch-setup-passwords auto。这将会为不同的内部堆栈用户生成随机密码。或者,您也可以跳过 auto 参数,改为通过 interactive 参数手动定义密码。请记录这些密码,我们很快就会再次用到这些密码。

第 3 步:在 Elasticsearch 节点上配置 TLS

现在,打开一个新终端,并使用 cd 命令更改至我们的节点目录。在我的例子中,其被命名为 elasticsearch-7.1.0-node

我们最简单的做法是将主节点的配置目录完全复制到节点的配置目录中。

cp ../elasticsearch-7.1.0-master/config/* config/

您还应该将 node.master: false 配置选项添加到 config/elasticsearch.yml 文件中。我在这里不会详细解释,但是您可以在我们的集群文档中找到更多详细信息。除了简单地复制整个配置文件之外,还有一个备选方法,那就是只复制证书文件,然后将 xpack.security.* 键设置为与主节点一模一样。

然后我们通过运行 bin/elasticsearch 来启动节点。我们将看到其加入集群。而且,如果看一下主节点的终端窗口,我们会看到有一条消息显示已有一个节点加入集群。现在,我们的两节点集群便开始运行了。

第 4 步:在 Kibana 中实现安全性

我们要做的最后一件事是配置 Kibana。再次打开另一个终端窗口(我保证,这是最后一次了)。我们需要为 Kibana 用户添加密码。我们可以从之前 setup-passwords 命令的输出内容中找到密码。

我们使用 cd 命令更改至 Kibana 目录,然后使用您的文本编辑器打开 config/kibana.yml 文件。找到类似下面的代码行

#elasticsearch.username: "user"
#elasticsearch.password: "pass"

usernamepassword 字段取消注释,方法是删除代码行起始部分的 # 符号。将 "user" 更改为 "kibana",然后将 "pass" 更改为 setup-passwords 命令告诉我们的任何 Kibana 密码。保存文件,然后我们便可通过运行 bin/kibana 启动 Kibana 了。

在 Kibana 中配置基于角色的访问控制 (RBAC)

一旦 Kibana 开始运行,我们便可以切换至网页浏览器并打开 http://localhost:5601。它将再次要求提供登录信息,我们将会使用 elastic 超级用户进行登录,密码来自 setup-passwords 命令。

登录 Kibana

如果是像这个例子中的全新安装情况,Kibana 将询问您是否希望加载一些样本数据。

向 Kibana 中加载样本数据

在本示例中,我们将会加载航班和网络日志这两个样本数据。加载完毕后,单击表示配置的齿轮图标

导航至 Kibana 中的管理

现在我们就创建角色。找到并单击 roles(角色)选项。

Kibana 中的 Roles(角色)

单击 Create role(创建角色)。

创建一个新角色

我们将第一个角色命名为 read_logs

创建 read_logs 角色

向下滚动至 Index Privileges(索引权限)字段并选择日志索引。然后我们将其指定为 read 权限。

配置角色权限

将安全功能设置完毕之后,您可能想要仔细研究 Spaces 功能,但在这篇博文中,我们将会跳过此部分。如需了解有关 Spaces(在 Kibana 中整理数据并确保数据安全的一项出色功能)的更多信息,请查看我们的 Kibana Spaces 文档或者这篇 Kibana Spaces 介绍博文

现在我们创建另一个名为 read_flight 的角色。

创建 read_flight 角色

我们为航班索引分配 read 权限。

配置角色

现在,我们将要创建两名用户并为他们分配这两个角色。选择左侧的 Users(用户)链接,然后单击Create new user(创建新用户)按钮。

创建新用户

我们将这名用户命名为 flight_user,并设置密码。无需设置全名和电子邮件地址。我们需要为这名用户分配read_flight 角色,而且我们还需要为其分配 kibana_user 角色(因为该用户将会查看 Kibana 中的数据)。

创建航班用户

单击创建,然后我们为 log_user 再完成一遍上述操作。这次我们需要添加 read_logskibana_user 角色。

创建日志用户

大功告成,两名新用户已经设置完毕。现在我们可以将 elastic 用户退出登录。

将 elastic 用户退出登录

然后,我们可使用 log_user 登录。然后单击 dashboards(仪表板)图标,我们可以看到现在有两个仪表板,一个为航班,另一个为网络日志。

查看您的仪表板

如果单击 Logs(日志)仪表板,您将会看到演示日志数据。如果返回并尝试查看航班仪表板,虽然我们可以看到仪表板,却不会看到任何数据。在这里便可以使用 Kibana Spaces 以确保安全,因为这一功能可确保仅允许特定用户查看特定仪表板。

现在您可以将 log_user 退出登录,然后使用 flight_user 重新登录。

如果打开日志仪表板,这次我们不会看到任何数据。我们甚至会看到错误消息,因为 Kibana 无法访问日志索引。

通过 RBAC 限制数据访问

现在如果查看航班仪表板,我们看到这次可以访问航班数据了。

通过 RBAC 提供的数据访问权限

恭喜您!现在我们已将这个两节点集群配置完毕,还配置了两名对索引数据拥有受限访问权限的用户。

总结

Elastic Stack 中的安全功能用途十分广泛,还有很多我们并未在本篇博文中讲到的内容。本篇博文的目的是引导您入门。将来我们还会发布大量内容,讲解其中的多项安全功能,以及使用这些功能的方法。同时,我们还有很多关于 Elastic Stack 运行原理和其他功能的文档和博文。

您还可以在我们的公共论坛上寻求帮助

祝您搜索愉快!