给 ELK 集群开认证:Elasticsearch 生成证书与 xpack 配置

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 ""
es01

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
es02

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
es03

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

es04

密码生成后集群任意节点都能登进去。这串密码建议当场存到密码管理器里,忘记的话只能重置,比较麻烦。

三、Logstash 侧

Logstash 自己也要往 ES 里写监控相关数据,默认用户是 logstash_system,密码就是上一步生成的那串,写进 logstash.yml:

[root@logstash ~]# vim /etc/logstash/logstash.yml
es05

改完重启:

[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" 
es05
[root@kibana ~]# systemctl restart kibana

注意这里用的是 kibana 账号而不是 elastic——这是 Kibana 与 ES 之间通信专用的内置用户,别把超级账号塞进配置文件。

打开 Kibana 地址,这时会出现登录框,能用 elastic 登进去(后续再建角色和用户,按人分配权限)。

es06
es07

五、配置顺序不能乱

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

请登录后发表评论

    暂无评论内容