ES 启用认证登录
解决方案:配置传输层 SSL
按照以下步骤操作,为集群配置证书并启用 SSL。
第一步:生成证书(在 es-node1 上操作)
进入 es-node1 容器,使用内置工具 elasticsearch-certutil 生成证书。
# 1. 进入 es-node1 容器
docker exec -it es-node1 bash
# 2. 生成 CA 证书(证书颁发机构)
# 一路回车,使用默认设置即可(不设密码,或记下你设置的密码)
bin/elasticsearch-certutil ca
# 3. 生成节点证书
# 同样一路回车,使用默认设置
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
# 4. 退出容器
exit
执行完毕后,会在容器的 /usr/share/elasticsearch/ 目录下生成两个文件:
-
elastic-stack-ca.p12:CA 证书 -
elastic-certificates.p12:节点证书(包含证书、私钥和 CA 证书)
第二步:将证书分发到所有节点
证书文件必须位于所有 ES 节点的容器内,且路径一致。最稳妥的方法是将它们复制到宿主机上,再挂载到每个容器中。
# 1. 从 es-node1 容器复制证书到宿主机
docker cp es-node1:/usr/share/elasticsearch/elastic-stack-ca.p12 /usr/local/es-cluster/
docker cp es-node1:/usr/share/elasticsearch/elastic-certificates.p12 /usr/local/es-cluster/
# 2. 确保宿主机上文件权限正确(ES 容器内 UID 1000)
chown 1000:1000 /usr/local/es-cluster/*.p12
chmod 640 /usr/local/es-cluster/*.p12
第三步:修改每个节点的 docker-compose.yml 和 elasticsearch.yml
你需要在每个 ES 节点的配置中挂载证书文件,并启用传输层 SSL。
修改 docker-compose.yml:为每个 ES 服务的 volumes 部分添加证书挂载。
services:
es-node1:
# ... 其他配置 ...
volumes:
# ... 其他挂载 ...
- ./elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12
- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12
es-node2:
# ... 其他配置 ...
volumes:
# ... 其他挂载 ...
- ./elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12
- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12
es-node3:
# ... 其他配置 ...
volumes:
# ... 其他挂载 ...
- ./elastic-stack-ca.p12:/usr/share/elasticsearch/config/elastic-stack-ca.p12
- ./elastic-certificates.p12:/usr/share/elasticsearch/config/elastic-certificates.p12
修改每个节点的 elasticsearch.yml:在所有三个节点的配置文件中,添加以下内容,以启用并配置传输层 SSL。
# 启用 X-Pack 安全功能
xpack.security.enabled: true
xpack.license.self_generated.type: basic
# 启用并配置传输层 SSL
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/elastic-certificates.p12
第四步:重启集群并验证
# 回到宿主机项目目录,重启所有 ES 节点
cd /usr/local/es-cluster
docker-compose down
docker-compose up -d
# 等待约 30 秒,然后验证集群健康状态
curl "http://192.168.149.135:9200/_cluster/health?pretty"
如果返回的 JSON 中 status 为 green,且 number_of_nodes 为 3,说明集群已成功启动。
第五步:设置内置用户密码
集群健康后,即可设置密码。
# 进入任意一个 ES 容器
docker exec -it es-node1 bash
# 执行密码设置工具
bin/elasticsearch-setup-passwords interactive
按照提示,为 elastic、kibana_system 等用户设置密码(密码至少 6 位)。务必记住 elastic 和 kibana_system 的密码。
✅ 验证配置
-
验证 ES 认证:不带密码访问
http://192.168.149.135:9200应返回 401;带密码访问应返回正常信息。curl -u elastic:你的密码 "http://192.168.149.135:9200/_cluster/health?pretty" -
配置 Kibana:修改
kibana/config/kibana.yml,使用kibana_system用户连接 ES。elasticsearch.hosts: ["http://192.168.149.135:9200"] elasticsearch.username: "kibana_system" elasticsearch.password: "你为kibana_system设置的密码" -
重启 Kibana:
docker-compose restart kibana,然后访问http://192.168.149.135:5601,使用elastic用户登录。
💡 补充说明
-
证书密码:生成 CA 和节点证书时,如果设置了密码,需要在
elasticsearch.yml中额外添加xpack.security.transport.ssl.keystore.password和xpack.security.transport.ssl.truststore.password配置。 -
cluster.initial_master_nodes:此参数仅在集群首次引导时使用。集群成功启动后,建议将其从所有节点的配置中移除,只保留discovery.seed_hosts。 -
节点间通信:完成上述配置后,节点间的 9300 端口通信将通过 TLS 加密,同时 9200 端口的 REST API 访问也需要用户名和密码认证。
完成以上步骤后,你的 ES 集群就具备基础的安全认证和传输加密能力了。

浙公网安备 33010602011771号