我们知道 ElasticSearch 安全是非常重要的。没有这个我们的数据可以被任何的人进行访问,串改,删除。Elastic Stack 的安全是由 x-pack 所提供的。在 Elastic Stack 7.0 版本之前,这个是商用的版本,需要进行安装,并购买。从 Elastic Stack 7.0 之后,x-pack 都已经在发布版中,所以不需要进行安装。我们只需要进行配置就可以了。
一、部署 ElasticSearch 集群
首先,参考《Docker 部署 ElasticSearch》将ES集群跑起来,之后我们开始增加安全配置
二、ElasticSearch 集群节点间安全配置
首先找一个容器,进入到容器中,例如:es-node1
docker exec -it es-node1 /bin/bash
运行一下命令,生成 elastic-certificates.p12
文件
### 运行命令,生成文件 elastic-certificates.p12
bin/elasticsearch-certutil ca -out elastic-certificates.p12 -pass ""
### 查看生成的文件
ll | grep "p12"
-rw-------. 1 root root 2672 Jun 1 16:32 elastic-certificates.p12
退出容器,并将容器内的文件Copy到宿主机
# 从容器中Copy出来,直接放在 es-node1/config 中
docker cp es-node1:/usr/share/elasticsearch/elastic-certificates.p12 /houder/elasticsearch/node1/config/
# 将文件分发给另外两个节点
cp elasticsearch/node1/config/elastic-certificates.p12 elasticsearch/node2/config/
cp elasticsearch/node1/config/elastic-certificates.p12 elasticsearch/node3/config/
## 执行授权操作
chmod -R 777 elasticsearch/node{1..3}/config/elastic-certificates.p12
编辑 三个节点的 elasticsearch.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
删除并重新创建容器,在每个容器中,增加 elastic-certificates.p12 映射
-v /houder/elasticsearch/nodeXXX/config/elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12 \
注意调整 nodeXXX 指向具体节点目录 node1, node2, node3
验证容器启动成功:http://192.168.0.31:19200/_cat/nodes?pretty

注释掉 node3 的 xpack 配置,重启容器后无法上线:

三、为内置用户配置密码
通过上一步配置,可以保证集群间的安全认证配置,但是 ElasticSearch 中的用户还是没有密码的,例如,我们配置上节点链接,则可以直接访问:

首先我们要在 elasticsearch.yml 中为每一个节点增加一个配置,来保证启用 xpack.security
xpack.security.enabled: true
重启集群节点后,进入到其中一个容器中,我们可以使用如下命令来创建密码:
./bin/elasticsearch-setup-passwords interactive[auto]
# interactive:交互式用户手动设定密码
# auto:自动创建并显示密码
注意:创建密码前保证需要保证集群每个节点都可用,在创建密码时会自动发送给其他集群节点
root@ea4e265dcaf5:/usr/share/elasticsearch# bin/elasticsearch-setup-passwords auto
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
The passwords will be randomly generated and printed to the console.
Please confirm that you would like to continue [y/N]y # 这里需要确认,输入y
Changed password for user apm_system
PASSWORD apm_system = 8fRPljcNgnnxYjLA9VZC
Changed password for user kibana_system
PASSWORD kibana_system = qvxy771goB9Zr7qirjzS
Changed password for user kibana
PASSWORD kibana = qvxy771goB9Zr7qirjzS
Changed password for user logstash_system
PASSWORD logstash_system = Mu07F38tDQLC8pd7i7jV
Changed password for user beats_system
PASSWORD beats_system = YLgWRCjspeIZAWZ36khY
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = EUZKfKL5b20AwvcRu8c6
Changed password for user elastic
PASSWORD elastic = 0cXv3ngDjM3DsSenVHzf
我们还是通过这个链接来验证:http://192.168.0.31:19200/_cat/nodes?pretty
,提示我们输入用户名和密码,我们输入:elastic 0cXv3ngDjM3DsSenVHzf

四、改用https协议
经过上一步调整后,我们需要配置用户名和密码才可以正确访问,但是访问时还是用的http协议
这里我们调整为https协议,只需要在 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
启用后通过https访问效果如下:

通过http将无法访问:
