ElasticSearch 集群安全

公号:码农充电站pro
主页:https://codeshellme.github.iohtml

在安装完 ES 后,ES 默认是没有任何安全防御的。node

ES 的安全管理主要包括如下内容:git

这里有一些免费的安全方案:github

  • 设置 Nginx 方向代理。
  • 安装免费的安全插件,好比:
  • X-Pack 的 Basic 版:可参考这里

1,身份认证

ES 中提供的认证叫作 Realms,有如下几种方式,可分为两类:shell

  • 内部的:不须要与 ES 外部方通讯。
    • file(免费):用户名和密码保存在 ES 索引中。
    • native(免费):用户名和密码保存在 ES 索引中。
  • 外部的:须要与 ES 外部组件通讯。

2,用户鉴权

用户鉴权经过定义一个角色,并分配一组权限;而后将角色分配给用户,使得用户拥有这些权限。api

ES 中的权限有不一样的级别,包括集群级别(30 多种)和索引级别(不到 20 种)。安全

ES 中提供了不少内置角色(不到 30 种)可供使用。app

ES 中提供了不少关于用户与角色的 API:curl

3,启动 ES 安全功能

下面演示如何使用 ES 的安全功能。elasticsearch

启动 ES 并经过 xpack.security.enabled 参数打开安全功能:

bin\elasticsearch -E node.name=node0 -E cluster.name=mycluster -E path.data=node0_data -E http.port=9200 -E xpack.security.enabled=true

使用 elasticsearch-setup-passwords 命令启用 ES内置用户及初始 6 位密码(须要手动输入,好比是 111111):

bin\elasticsearch-setup-passwords interactive

该命令会启用下面这些用户:

  • elastic:超级用户。
  • kibana:用于 ES 与 Kibana 之间的通讯。
  • kibana_system:用于 ES 与 Kibana 之间的通讯。
  • apm_system
  • logstash_system
  • beats_system
  • remote_monitoring_user

启用 ES 的安全功能后,访问 ES 就须要输入用户名和密码:

在这里插入图片描述

也能够经过 curl 命令(并指定用户)来访问 ES:

curl -u elastic 'localhost:9200'

更多内容可参考这里

4,启动 Kibana 安全功能

打开 Kibana 的配置文件 kibana.yml,写入下面内容:

elasticsearch.username: "kibana_system"  # 用户名
elasticsearch.password: "111111"         # 密码

而后使用 bin\kibana 命令启动 Kibana。

访问 Kibana 也须要用户和密码(这里使用的是超级用户):

在这里插入图片描述

5,使用 Kibana 建立角色和用户

下面演示如何使用 Kibana 建立角色和用户。登陆 Kibana 以后进行以下操做:

在这里插入图片描述

点击 Stack Management 后进入下面页面:

在这里插入图片描述

5.1,建立角色

点击 Create role 建立角色:

在这里插入图片描述

建立角色须要填写以下内容:

  • 角色名称
  • 角色对哪些索引有权限及索引的权限级别
  • 添加一个 Kibana 权限
  • 最后建立角色

在这里插入图片描述

通过上面的操做,建立的角色名为 test_role,该角色对 test_index 索引有只读权限;若是进行超越范围的操做,将发生错误。

5.2,建立用户

进入到建立用户的界面,点击 Create user 建立用户:

在这里插入图片描述

填写用户名和密码,并将角色 test_role 赋予该用户。

在这里插入图片描述

5.3,使用用户

使用新建立的用户登陆 Kibana:

在这里插入图片描述

该用户只对 test_index 索引有只读权限;若是进行超越范围的操做,将发生错误。

6,传输加密

传输加密指的是在数据的传输过程当中,对数据进行加密(可防止数据被抓包)。

传输加密分为集群内加密和集群间加密:

  • 集群内加密指的是 ES 集群内部各节点之间的数据传输时的加密。
    • 经过 TLS 协议完成。
  • 集群间加密指的是外部客户访问 ES 时,数据传输的加密。
    • 经过 HTTPS 协议完成。

更多的内容可参考这里

6.1,集群内部传输加密

在 ES 中可使用 TLS 协议对数据进行加密,须要进行如下步骤:

  • 建立 CA
  • 为 ES 节点建立证书和私钥
  • 配置证书
1,建立 CA 证书

使用以下命令建立 CA:

bin\elasticsearch-certutil ca

成功后,能够看到当前文件夹下多了一个文件:

elastic-stack-ca.p12
2,生成证书和私钥

使用以下命令为 ES 中的节点生成证书和私钥

bin\elasticsearch-certutil cert --ca elastic-stack-ca.p12

成功后,能够看到当前文件夹下多了一个文件:

elastic-certificates.p12
3,配置证书

将建立好的证书 elastic-certificates.p12 放在 config/certs 目录下。

4,启动集群
# 启动第一个节点
bin\elasticsearch 
-E node.name=node0 
-E cluster.name=mycluster
-E path.data=node0_data 
-E http.port=9200 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate 
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12

# 启动第二个节点
bin\elasticsearch 
-E node.name=node1 
-E cluster.name=mycluster 
-E path.data=node1_data 
-E http.port=9201 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate 
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12

不提供证书的节点将没法加入集群:

bin\elasticsearch 
-E node.name=node2 
-E cluster.name=mycluster 
-E path.data=node2_data 
-E http.port=9202 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate
# 加入失败

也能够将配置写在配置文件 elasticsearch.yml 中,以下:

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

6.2,集群外部传输加密

经过配置以下三个参数,使得 ES 支持 HTTPS:

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

在命令行启动:

bin\elasticsearch 
-E node.name=node0 
-E cluster.name=mycluster
-E path.data=node0_data 
-E http.port=9200 
-E xpack.security.enabled=true 
-E xpack.security.transport.ssl.enabled=true 
-E xpack.security.transport.ssl.verification_mode=certificate 
-E xpack.security.transport.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.transport.ssl.truststore.path=certs\elastic-certificates.p12
-E xpack.security.http.ssl.enabled=true 
-E xpack.security.http.ssl.keystore.path=certs\elastic-certificates.p12 
-E xpack.security.http.ssl.truststore.path=certs\elastic-certificates.p12

启动成功后,能够经过 HTTPS 协议访问 ES:

https://localhost:5601/

6.3,配置 Kibana 连接 ES HTTPS

1,为 Kibana 生成 pem 文件

首先用 openssl 为 kibana 生成 pem:

openssl pkcs12 -in elastic-certificates.p12 -cacerts -nokeys -out elastic-ca.pem

成功后会生成以下文件:

elastic-ca.pem

将该文件放在 config\certs 目录下。

2,配置 kibana.yml

在 Kibana 的配置文件 kibana.yml 中配置以下参数:

elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.ssl.certificateAuthorities: ["C:\\elasticsearch-7.10.1\\config\\certs\\elastic-ca.pem"]
elasticsearch.ssl.verificationMode: certificate
3,运行 Kibana
bin\kibana

6.4,配置 Kibana 支持 HTTPS

1,为 Kibana 生成 pem
bin/elasticsearch-certutil ca --pem

上面命令执行成功后会生成以下 zip 文件:

elastic-stack-ca.zip

将该文件解压,会有两个文件:

ca.crt
ca.key

将这两个文件放到 Kibana 的配置文件目录 config\certs

2,配置 kibana.yml

在 Kibana 的配置文件 kibana.yml 中配置以下参数:

server.ssl.enabled: true
server.ssl.certificate: config\\certs\\ca.crt
server.ssl.key: config\\certs\\ca.key
3,运行 Kibana
bin\kibana

启动成功后,能够经过 HTTPS 协议访问 Kibana:

https://localhost:5601/

(本节完。)


推荐阅读:

ElasticSearch 搜索模板与建议

ElasticSearch 聚合分析

ElasticSearch 中的 Mapping

ElasticSearch 数据建模

ElasticSearch 分布式集群


欢迎关注做者公众号,获取更多技术干货。

码农充电站pro

相关文章
相关标签/搜索