ELK 默认不开用户认证,集群端口裸奔在里网上,任何人能查、能删索引。生产环境必须把 xpack 的安全功能打开:Elasticsearch 启用认证、节点之间走 TLS。这套功能从 6.8 之后是默认自带的,太老的版本装不出来;下面这套环境的版本是 Elasticsearch 7.12.1,集群用 RPM 包装的三节点。
一、先做证书
1. 生成 CA
RPM 安装的命令在 /usr/share/elasticsearch/bin 下;源码部署的话在 ES 安装目录的 bin 里。
[root@es-node1 ~]# /usr/share/elasticsearch/bin/elasticsearch-certutil ca --out /etc/elasticsearch/elastic-stack-ca.p12 -pass ""

2. 用 CA 给节点签发证书
[root@es-node1 ~]# /usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca /etc/elasticsearch/elastic-stack-ca.p12 -pass "" --out /etc/elasticsearch/elastic-certificates.p12

3. 分发并授权
证书要出现在每个节点的配置目录里:
scp /etc/elasticsearch/elastic-certificates.p12 root@192.168.66.16:/etc/elasticsearch/
这一步最容易漏:签完必须把文件属主交给 ES 的运行用户,集群所有节点都要执行,否则后面生成密码会直接报错。
chown -R elasticsearch. /etc/elasticsearch
二、改配置、重启并生成密码
每个节点的 elasticsearch.yml 末尾加上这几行,开启安全认证和传输层 SSL,并指向上面生成的证书:
[root@es-node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
#配置文件最后添加如下配置
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
verification_mode 用的是 certificate,即只校验证书、不校验主机名,节点多、IP 变动频繁时省事;要更强校验可以换成 full,前提是证书里的 SAN 覆盖了每个节点的地址。改完逐台重启,重启时盯一下日志有没有证书相关报错:
systemctl restart elasticsearch
三个节点不要同时重启,一台起来、集群恢复 green 或 yellow 之后再动下一台。
生成内置用户密码
开了认证之后,内置用户还没有密码,用 elasticsearch-setup-passwords 生成,交互式或随机二选一:
[root@es-node1 ~]# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
#或者生成随机密码:
[root@es-node1 ~]# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

之后再访问 https://IP:9200 就要带账号了。这里用的是 elastic,它是内置超级用户,拥有 superuser 角色:

密码生成后集群任意节点都能登进去。这串密码建议当场存到密码管理器里,忘记的话只能重置,比较麻烦。
三、Logstash 侧
Logstash 自己也要往 ES 里写监控相关数据,默认用户是 logstash_system,密码就是上一步生成的那串,写进 logstash.yml:
[root@logstash ~]# vim /etc/logstash/logstash.yml

改完重启:
[root@logstash ~]# systemctl restart logstash
输出插件里也要带上账号密码,否则推送数据会被 401 挡掉:
output {
elasticsearch {
hosts => ["http://192.168.66.15:9200", "http://192.168.66.16:9200"]
index => "logs-%{+YYYY.MM.dd}"
user => "elastic" # 注意:这里演示使用超级账号,安全起见最好是使用自定义的账号,并授予该用户创建索引的权限
password => "UI0xxxxxxxxxx"
}
}
示例图省事用了 elastic,正式环境应该单独建一个只授予建索引权限的账号给 Logstash 用。
四、Kibana 侧
Kibana 默认同样不带认证。密码已经生成好了,现在让 Kibana 用自己的账号去连 ES:
[root@kibana ~]# vim /etc/kibana/kibana.yml
elasticsearch.username: "kibana" # 注意:此处不用超级账号elastic,而是使用kibana跟es连接的账号kibana
elasticsearch.password: "xXFPPagAkXbYNMYi3LSF"

[root@kibana ~]# systemctl restart kibana
注意这里用的是 kibana 账号而不是 elastic——这是 Kibana 与 ES 之间通信专用的内置用户,别把超级账号塞进配置文件。
打开 Kibana 地址,这时会出现登录框,能用 elastic 登进去(后续再建角色和用户,按人分配权限)。


五、配置顺序不能乱
- 先证书、再配置、再密码。顺序错了会出现「ES 起不来」或「setup-passwords 连不上集群」,看日志很难一眼定位。
- 属主没改是最高频的坑,签完证书就统一
chown一遍,每个节点都别忘。 - 开了 TLS 之后,客户端连 ES 的地址要换成
https,Logstash、Filebeat、各类 SDK 都要同步改,只改一处会出现部分数据断流。 - 配置文件里的明文密码要控制读权限,能走 keystore 的优先用 keystore。















暂无评论内容