ES 启用认证登录

解决方案:配置传输层 SSL

按照以下步骤操作,为集群配置证书并启用 SSL。

第一步:生成证书(在 es-node1 上操作)

进入 es-node1 容器,使用内置工具 elasticsearch-certutil 生成证书。

bash
# 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 节点的容器内,且路径一致。最稳妥的方法是将它们复制到宿主机上,再挂载到每个容器中。

bash
# 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 部分添加证书挂载。

yaml
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。

yaml
# 启用 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

第四步:重启集群并验证

bash
# 回到宿主机项目目录,重启所有 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 中 statusgreen,且 number_of_nodes 为 3,说明集群已成功启动。

第五步:设置内置用户密码

集群健康后,即可设置密码。

bash
# 进入任意一个 ES 容器
docker exec -it es-node1 bash

# 执行密码设置工具
bin/elasticsearch-setup-passwords interactive

按照提示,为 elastickibana_system 等用户设置密码(密码至少 6 位)。务必记住 elastickibana_system 的密码

✅ 验证配置

  1. 验证 ES 认证:不带密码访问 http://192.168.149.135:9200 应返回 401;带密码访问应返回正常信息。

    bash
    curl -u elastic:你的密码 "http://192.168.149.135:9200/_cluster/health?pretty"
  2. 配置 Kibana:修改 kibana/config/kibana.yml,使用 kibana_system 用户连接 ES。

    yaml
    elasticsearch.hosts: ["http://192.168.149.135:9200"]
    elasticsearch.username: "kibana_system"
    elasticsearch.password: "你为kibana_system设置的密码"
  3. 重启 Kibanadocker-compose restart kibana,然后访问 http://192.168.149.135:5601,使用 elastic 用户登录。

💡 补充说明

  • 证书密码:生成 CA 和节点证书时,如果设置了密码,需要在 elasticsearch.yml 中额外添加 xpack.security.transport.ssl.keystore.passwordxpack.security.transport.ssl.truststore.password 配置。

  • cluster.initial_master_nodes:此参数仅在集群首次引导时使用。集群成功启动后,建议将其从所有节点的配置中移除,只保留 discovery.seed_hosts

  • 节点间通信:完成上述配置后,节点间的 9300 端口通信将通过 TLS 加密,同时 9200 端口的 REST API 访问也需要用户名和密码认证。

完成以上步骤后,你的 ES 集群就具备基础的安全认证和传输加密能力了。

posted @ 2026-09-13 19:13  Binky.Lee  阅读(3)  评论(0)    收藏  举报