Elastic under lock and key:启用 Elasticsearch 集群安全选项以进行内部和外部访问

Elastic under lock and key:启用 Elasticsearch 集群安全选项以进行内部和外部访问

Elastic Stack 是 SIEM 系统市场中众所周知的工具(实际上,不仅仅是它们)。 它可以收集大量不同大小的数据,包括敏感的和不太敏感的数据。 如果对 Elastic Stack 元素本身的访问不受保护,则这种说法并不完全正确。 默认情况下,所有 Elastic 开箱即用元素(Elasticsearch、Logstash、Kibana 和 Beats 收集器)都在开放协议上运行。 在 Kibana 本身中,身份验证被禁用。 所有这些交互都可以得到保护,在本文中我们将告诉您如何做到这一点。 为了方便起见,我们将叙述分为 3 个语义块:

  • 基于角色的数据访问模型
  • Elasticsearch 集群内的数据安全
  • 保护 Elasticsearch 集群外部的数据安全

细节下切。

基于角色的数据访问模型

如果您安装了 Elasticsearch 并且不以任何方式对其进行调整,则所有索引的访问权限都将向所有人开放。 好吧,或者那些可以使用curl的人。 为了避免这种情况,Elasticsearch 有一个角色模型,从基本订阅(免费)开始即可使用。 从原理上讲,它看起来像这样:

Elastic under lock and key:启用 Elasticsearch 集群安全选项以进行内部和外部访问

图片里是什么

  • 用户是可以使用其凭据登录的所有人。
  • 角色是一组权利。
  • 权利是一组特权。
  • 权限是指写入、读取、删除等权限。 (完整的特权列表)
  • 资源是索引、文档、字段、用户和其他存储实体(某些资源的角色模型仅适用于付费订阅)。

默认情况下Elasticsearch有 盒子用户,它们所附着的 盒子角色。 启用安全设置后,您可以立即开始使用它们。

要在 Elasticsearch 设置中启用安全性,您需要将其添加到配置文件中(默认情况下为 弹性搜索/配置/elasticsearch.yml) 新队:

xpack.security.enabled: true

更改配置文件后,启动或重新启动 Elasticsearch 以使更改生效。 下一步是为 Box 用户分配密码。 让我们使用以下命令以交互方式执行此操作:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

检查:

[elastic@node1 ~]$ curl -u elastic 'node1:9200/_cat/nodes?pretty'
Enter host password for user 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

您可以拍拍自己了——Elasticsearch 端的设置已经完成。 现在是时候配置 Kibana 了。 如果现在运行它,将会出现错误,因此创建密钥存储很重要。 这是通过两个命令完成的(用户 基巴纳 以及在 Elasticsearch 中创建密码步骤中输入的密码):

[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ ./kibana/bin/kibana-keystore add elasticsearch.password

如果一切正确,Kibana 将开始要求输入登录名和密码。 基本订阅包括基于内部用户的角色模型。 从 Gold 开始,您可以连接外部身份验证系统 - LDAP、PKI、Active Directory 和单点登录系统。

Elastic under lock and key:启用 Elasticsearch 集群安全选项以进行内部和外部访问

对 Elasticsearch 内部对象的访问权限也可能受到限制。 但是,要对文档或字段执行相同的操作,您将需要付费订阅(这种奢侈从白金级别开始)。 这些设置可在 Kibana 界面中或通过 安全API。 您可以通过已经熟悉的开发工具菜单进行检查:

创建角色

PUT /_security/role/ruslan_i_ludmila_role
{
  "cluster": [],
  "indices": [
    {
      "names": [ "ruslan_i_ludmila" ],
      "privileges": ["read", "view_index_metadata"]
    }
  ]
}

创建用户

POST /_security/user/pushkin
{
  "password" : "nataliaonelove",
  "roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
  "full_name" : "Alexander Pushkin",
  "email" : "[email protected]",
  "metadata" : {
    "hometown" : "Saint-Petersburg"
  }
}

Elasticsearch 集群内的数据安全

当 Elasticsearch 在集群中运行时(这很常见),集群内的安全设置变得很重要。 为了节点之间的安全通信,Elasticsearch 使用 TLS 协议。 要在它们之间建立安全交互,您需要证书。 我们生成 PEM 格式的证书和私钥:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil ca --pem

执行上面的命令后,在目录中 /../elasticsearch 将出现存档 弹性堆栈-ca.zip。 在里面你会发现一个证书和一个带有扩展名的私钥 CRT и 分别。 建议将它们放在共享资源上,该资源应该可以从集群中的所有节点访问。

现在,每个节点都需要基于共享目录中的证书和私钥。 执行该命令时,系统会要求您设置密码。 您可以添加其他选项 -ip 和 -dns 以完成交互节点的验证。

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key

执行该命令的结果是,我们将收到 PKCS#12 格式的证书和私钥,并受密码保护。 剩下的就是移动生成的文件 p12 到配置目录:

[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/config

按以下格式向证书添加密码 p12 在每个节点上的密钥库和信任库中:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

已经知道 弹性搜索.yml 剩下的就是添加包含证书数据的行:

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

我们启动所有 Elasticsearch 节点并执行 卷曲。 如果一切都正确完成,将返回具有多个节点的响应:

[elastic@node1 ~]$ curl node1:9200/_cat/nodes -u elastic:password                                                                                    
172.18.0.3 43 75 4 0.00 0.05 0.05 dim * node2                                                                                                                     
172.18.0.4 21 75 3 0.00 0.05 0.05 dim - node3                                                                                                                     
172.18.0.2 39 75 4 0.00 0.05 0.05 dim - node1

还有另一个安全选项 - IP 地址过滤(在黄金级订阅中可用)。 允许您创建允许您访问节点的 IP 地址白名单。

保护 Elasticsearch 集群外部的数据安全

集群外部意味着连接外部工具:Kibana、Logstash、Beats 或其他外部客户端。

Elastic under lock and key:启用 Elasticsearch 集群安全选项以进行内部和外部访问

要配置对 https(而不是 http)的支持,请向 elasticsearch.yml 添加新行:

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.path: elastic-certificates.p12

因为该证书受密码保护,将其添加到每个节点上的密钥库和信任库中:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password

添加密钥后,Elasticsearch 节点就可以通过 https 进行连接。 现在它们可以启动了。

下一步是创建连接 Kibana 的密钥并将其添加到配置中。 根据共享目录中已存在的证书,我们将生成 PEM 格式的证书(PKCS#12 Kibana、Logstash 和 Beats 尚不支持):

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key --pem

剩下的就是将创建的密钥解压到具有 Kibana 配置的文件夹中:

[elastic@node1 ~]$ unzip elasticsearch/certificate-bundle.zip -d kibana/config

密钥就在那里,所以剩下的就是更改 Kibana 配置,以便它开始使用它们。 在 kibana.yml 配置文件中,将 http 更改为 https 并添加包含 SSL 连接设置的行。 最后三行配置用户浏览器和 Kibana 之间的安全通信。

elasticsearch.hosts: ["https://${HOSTNAME}:9200"]
elasticsearch.ssl.certificateAuthorities: /shared_folder/ca/ca.crt
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: /../kibana/config/instance/instance.key
server.ssl.certificate: /../kibana/config/instance/instance.crt

至此,设置完成,对Elasticsearch集群中的数据访问进行了加密。

如果您对 Elastic Stack 在免费或付费订阅、监控任务或创建 SIEM 系统方面的功能有疑问,请向 反馈表 在我们的网站上。

我们关于 Habré 上的 Elastic Stack 的更多文章:

了解 Elastic Stack(又名 Elasticsearch、又名 ELK)中的机器学习

Elasticsearch 大小调整

来源: habr.com

添加评论