Elastic Stack 是 SIEM 系统市场中众所周知的工具(实际上,不仅仅是它们)。 它可以收集大量不同大小的数据,包括敏感的和不太敏感的数据。 如果对 Elastic Stack 元素本身的访问不受保护,则这种说法并不完全正确。 默认情况下,所有 Elastic 开箱即用元素(Elasticsearch、Logstash、Kibana 和 Beats 收集器)都在开放协议上运行。 在 Kibana 本身中,身份验证被禁用。 所有这些交互都可以得到保护,在本文中我们将告诉您如何做到这一点。 为了方便起见,我们将叙述分为 3 个语义块:
- 基于角色的数据访问模型
- Elasticsearch 集群内的数据安全
- 保护 Elasticsearch 集群外部的数据安全
基于角色的数据访问模型
如果您安装了 Elasticsearch 并且不以任何方式对其进行调整,则所有索引的访问权限都将向所有人开放。 好吧,或者那些可以使用curl的人。 为了避免这种情况,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 和单点登录系统。
对 Elasticsearch 内部对象的访问权限也可能受到限制。 但是,要对文档或字段执行相同的操作,您将需要付费订阅(这种奢侈从白金级别开始)。 这些设置可在 Kibana 界面中或通过
创建角色
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 或其他外部客户端。
要配置对 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 的更多文章: