文章五:Elasticsearch安全通信

集群自动配置ssl+https安全:

Elasticsearch 8.X 及以上版本默认启用全新安全模式 ,不再需要手动生成证书、手动配置密钥,只需在 elasticsearch.yml 中填写基础配置,启动 ES 服务时,程序会自动生成 TLS/SSL 证书、密钥、认证文件,并自动完成:

  • 节点间通信加密(Transport SSL)
  • HTTP 接口 HTTPS 加密(https:// 访问)
  • 内置用户密码自动生成
  • 集群安全通信自动配置

全程无需手动操作证书生成,开箱即用。

节点一

java 复制代码
# 集群名称(同一个集群的节点名称必须一致)
cluster.name: es85X
 
# 当前节点的名称(唯一标识)
node.name: node-1
 
# 监听所有IP地址,允许外部设备访问
network.host: 0.0.0.0
 
# HTTP 访问端口(curl、浏览器、程序连接用)
http.port: 9200
 
# 节点间内部通信端口(集群同步数据用)
transport.port: 9300

# 数据存储目录
path.data: /var/lib/elasticsearch

# 日志存储目录
path.logs: /var/log/elasticsearch

# 锁定物理内存(提升性能,防止swap)
bootstrap.memory_lock: true

第一个节点启动之后我们的配置中会加入很多的自动配置:

下面展示的是安全相关的配置

第一次我们没有指定初次启动的master节点,es也帮我们直接配置了:

节点二:

加入节点我们使用的还是token的方式。

使用安全模式的时候,启动的方式是一个一个服务器 进行启动,之后通过下面的命令进行添加:

之后使用正在运行的节点执行命令,获取enrollment tolen:

java 复制代码
./elasticsearch-create-enrollment-token -s node

之后需要加入的节点执行命令:

java 复制代码
./bin/elasticsearch --enrollment-token <粘贴你的Token>。
java 复制代码
# 集群名称(同一个集群的节点名称必须一致)
cluster.name: es85X
 
# 当前节点的名称(唯一标识)
node.name: node-2
 
# 监听所有IP地址,允许外部设备访问
network.host: 0.0.0.0
 
# HTTP 访问端口(curl、浏览器、程序连接用)
http.port: 9200
 
# 节点间内部通信端口(集群同步数据用)
transport.port: 9300

# 数据存储目录
path.data: /var/lib/elasticsearch

# 日志存储目录
path.logs: /var/log/elasticsearch

# 锁定物理内存(提升性能,防止swap)
bootstrap.memory_lock: true

我们发现discovery.seed_host直接自动配置完成。其他的安全配置也都配置好了。

下面的截图中是我启动第三个节点的时候自动进行的配置,但是我们可以发现,之前的配置文件写完之后,就不会再修改,所以,如果节点多的情况下,discovery.seed_host大家可以手动多配置几个,防止出现连接不到的情况。

除了上述位置需要修改,还有就是kibana也要修改,再配置文件中,kibana.yml中会自动配置我们需要的安全配置,但是elasticsearch.hosts: 'https://192.168.0.189:9200' 他只是配置了一个节点,所有的单点都是不安全的,所以这里要配置多个。

这里注意一下。

集群安全手动配置

之前的文章Elasticsearch安全集群构建的常见问题-CSDN博客中提到了一下手动配置安全模式的方式,但是一直没有再博客中详细的带着大家做一下,下面带着大家按着步骤执行一下,这里的方式是使用的官网的方式。

生成transport节点通信证书

执行./elasticsearch-certutil ca命令生成文件elastic-stack-ca.p12

之后执行命令:./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 生成文件elastic-certificates.p12

**上面执行产生的文件大家可以直接copy下来,之后所有的节点可以使用相同的文件进行节点之间的互信操作。**之后我们再进行配置的时候需要自己配置信息,因为es不会帮助我们配置。

这里有一个小的技巧,其实我们可以一开始的使用,先自己运行一下es的单个节点,之后就可以通过更新证书的方式达到自己的安全机制,再之前的文章中小编都是这个进行的,但是在这里小编还是参照官网(Set up basic security for the Elastic Stack | Elasticsearch Guide 8.18 | Elastic)的形式,手动为大家配置一下我们的配置文件。

XML 复制代码
#官网提供配置
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate 
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

节点一配置文件,这里只是配置transport节点:

cpp 复制代码
# ==================== 集群基础配置 ====================
cluster.name: es85X
node.name: node-1

# ==================== 数据与日志目录 可以使用默认地址,但是不便于集群升级 ====================
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# ==================== 网络配置 ====================
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300

# ==================== 集群发现配置 ====================
discovery.seed_hosts: ["192.168.86.103:9301"]

cluster.initial_master_nodes: ["node-1"]

# ==================== 内存锁定(可选但推荐) ====================
bootstrap.memory_lock: true

# ==================== 手动安全配置 ====================
xpack.security.enabled: true

# 节点间通信 SSL
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

创建目录,将文件copy到目录中:

cpp 复制代码
[elastic@localhost config]$ mkdir certs

[elastic@localhost elasticsearch-8.5.2]$ cp elastic-certificates.p12 ./config/certs

之后执行命令:

把证书(PKCS12)的密码加密存到 ES 的安全密钥库,注意这个密码要和之前的elastic-certificates.p12文件密码一致。

cpp 复制代码
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

通过上述方式之后,我们自定义了自己的transport的证书。

之后启动es之后,我们可以发现,我们的es的配置文件中并没有新增新的配置。并且我们会发现并没有为我们打印出来自动配置中的那些用户名和密码的信息。所以接下来我们开始初始化用户名和密码:

cpp 复制代码
./bin/elasticsearch-setup-passwords auto

之后使用我们新生成的密码就可以登录了。

但是我们再连接节点的时候,只是配置了SSL,没有配置HTTPS,所以请求的时候连接的方式就是http:192.XXX.XXX.XXX的方式。这里要注意一下。

上面的方式是配置了第一个节点,现在开始配置第二个节点:

打开第二个节点,在第二个节点的config中创建目录certs,之后将上面的证书直接copy一下,并且将上面的配置直接复制一下,但是注意修改一下端口的一下信息。

之后还是把证书(PKCS12)的密码加密存到 ES 的安全密钥库,注意这个密码要和之前的elastic-certificates.p12文件密码一致。

cpp 复制代码
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

之后启动节点就行了。

效果展示:

对于熟悉es的用户来说这种方式配置比自动化更加的方便。

配置kibana

当前配置的kibana是在没有使用https的方式连接kibana。并且没有使用token的方式连接kibana,所以所有的配置需要我们手动完成。

cpp 复制代码
# 1. Kibana服务监听地址(允许外部访问,0.0.0.0表示所有IP)
server.host: "0.0.0.0"

# 2. Kibana服务名称(自定义,可选)
server.name: "kibana-server"

# 3. Elasticsearch连接地址(无HTTPS,使用http协议)
# 格式:http://ES节点IP:9200,多节点用逗号分隔
elasticsearch.hosts: ["http://192.168.0.191:9200","http://192.168.0.191:9201"]

# 6. Kibana页面访问端口(默认5601,无需修改)
server.port: 5601

# 7. 国际化配置(中文界面,可选)
# i18n.locale: "zh-CN"

结合无 HTTPS、无 Token 的部署场景,Kibana 连接 Elasticsearch必须配置用户名与密码 ,具体配置方式分为两种,结合kibana.ymlkibana-keystore使用:

  1. 常规方案(推荐)

    • kibana.yml 中配置参数 elasticsearch.username,填写连接账号(优先使用kibana_system,也可使用超级管理员elastic);
    • 通过 kibana-keystore 单独存储密码 elasticsearch.password,避免密码明文暴露。
  2. 高安全方案

    • kibana.yml 中不填写任何账号信息;
    • 依次执行 kibana-keystore add 命令,将 elasticsearch.username(用户名)、elasticsearch.password(密码)全部存入密钥库,配置文件无敏感信息。
  3. 补充要求 账号配置完成后,需重启 Kibana 服务使配置生效,再通过浏览器访问页面验证连通性。

下面使用第二种方式为大家展示一下,上面我们已经配置完成了kibana的配置,之后使用下面的命令配置用户名和密码:将 Elasticsearch 用户名和密码添加到密钥库

cpp 复制代码
 ./kibana-keystore create
复制代码
kibana-keystore add elasticsearch.username

kibana-keystore add elasticsearch.password

之后就可以成功连接了。

自定义证书配置

针对于es的证书问题,我们讲解一下他的使用方式,自定义证书有效期(避免频繁更新)自定义 IP 段自定义 DNS 域名,适用于 ES 7.x/ 8.x 版本。

配置文件:

cpp 复制代码
instances:
  - name: node-1
    dns:
      - es-node1
      - es-cluster.local
      - localhost
    ip:
      - 127.0.0.1
      - 192.168.1.100
      - 10.0.0.0/24   # 支持网段
      - 172.16.0.0/16

  - name: node-2
    dns:
      - es-node2
      - es-cluster.local
    ip:
      - 192.168.1.101
      - 10.0.0.0/24
  • 第一步:生成 CA(根证书)

    复制代码
    ./elasticsearch-certutil ca
    • 默认产出:elastic-stack-ca.p12(含 CA 公钥 + 私钥)
    • 作用:整个集群的 "信任根",只做一次、长期保存
    • 可加 --days 3650 把 CA 有效期设 10 年
  • 执行下面的命令:

cpp 复制代码
./elasticsearch-certutil cert \
  --ca elastic-stack-ca.p12 \
  --days 3650 \
  --in instances.yml \
  --out certs.zip

之后将新生成的证书文件再配置中进行配置。当然还是要修改一下keystore中的密码。

修改之后我们的配置就变成:

cpp 复制代码
# 节点间通信 SSL
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: full
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: certs/es87xssl.p12
xpack.security.transport.ssl.truststore.path: certs/es87xssl.p12

SSL 验证模式:full vs certificate/none

  • verification_mode: full

    • 同时验证证书本身 + 证书里的主机名 / IP是否匹配节点地址
    • 要求证书的 SAN(IP/DNS)字段必须和节点实际 IP / 主机名一致
    • 安全性最高,是生产环境的标准做法
  • 常见默认配置:verification_mode: certificate

    • 只验证证书是否被信任、是否有效,不检查主机名 / IP
    • 安全性稍低,但配置更简单,适合测试环境

Https配置

经过上面的配置,我们可以发现,到这里还是没有完成自定义配置的功能,至少现在的方式还是http,而不是https

下面展示需要输入的命令和常见的选择方式:

cpp 复制代码
[elastic@localhost e_auto_9200]$./bin/elasticsearch-certutil http
java 复制代码
Generate a CSR? [y/N]n
Use an existing CA? [y/N]y
CA Path: /elasticsearch/e_auto_9200/elastic-stack-ca.p12
密码自己设置
有效期自己设置,默认五年
Generate a certificate per node? [y/N]n
之后输入hostname和ip地址,可以输入多个

之后就是回车创建出来文件就可以了

默认文件夹得名字是:/elasticsearch-ssl-http.zip

上面得文件夹解压之后生成两个文件夹,一个elasticsearch 一个是 kibana,我没有选择为每一个节点创建,如果选择为每一个节点创建的话文件会更多。

java 复制代码
[elastic@localhost elasticsearch]$ ll
总用量 12
-rw-rw-r--. 1 elastic elastic 3668 5月  29 20:20 http.p12
-rw-rw-r--. 1 elastic elastic 1106 5月  29 20:20 README.txt
-rw-rw-r--. 1 elastic elastic  672 5月  29 20:20 sample-elasticsearch.yml

文件创建之后开始我们的正式配置,再es得配置文件中添加配置:

java 复制代码
xpack.security.http.ssl.enabled: true

# This configures the keystore to use for SSL on HTTP
xpack.security.http.ssl.keystore.path: "http.p12"

所以我们最全得配置形式是:

java 复制代码
# ==================== 集群基础配置 ====================
cluster.name: es85X
node.name: node-1

# ==================== 数据与日志目录 可以使用默认地址,但是不便于集群升级 ====================
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch

# ==================== 网络配置 ====================
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300

# ==================== 集群发现配置 ====================
discovery.seed_hosts: ["192.168.86.103:9301"]

cluster.initial_master_nodes: ["node-1"]

# ==================== 内存锁定(可选但推荐) ====================
bootstrap.memory_lock: true

# ==================== 手动安全配置 ====================
xpack.security.enabled: true

# 节点间通信 SSL
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

#------------------------https配置----------------------------
xpack.security.http.ssl.enabled: true

# This configures the keystore to use for SSL on HTTP
xpack.security.http.ssl.keystore.path: "certs/http.p12"

将http,p12文件copy到配置文件中:

java 复制代码
 cp elasticsearch/http.p12 config/certs

因为我们创建了密码,所以在启动之前需要添加:

java 复制代码
./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password

之后就可以使用https进行连接了

如果有其他的节点的话,直接将上面的压缩文件copy,之后再将文件配置一下就可以了

配置Kibana

上面配置得kibana其实是在没有配置https的前提下,配置的,接下来我们继续配置完kibana

执行命令,将文件elasticsearch-ca.pem 复制到kibana文件下的config目录下:

java 复制代码
 cp /elasticsearch/a_auto_9201/kibana/elasticsearch-ca.pem config/

修改kibana配置文件:

java 复制代码
# 1. Kibana服务监听地址(允许外部访问,0.0.0.0表示所有IP)
server.host: "0.0.0.0"
#
# # 2. Kibana服务名称(自定义,可选)
# server.name: "kibana-server"
#
# # 3. Elasticsearch连接地址(无HTTPS,使用http协议)
# # 格式:http://ES节点IP:9200,多节点用逗号分隔
elasticsearch.hosts: ["https://192.168.0.191:9200","https://192.168.0.191:9201"]
#
# # 6. Kibana页面访问端口(默认5601,无需修改)
# server.port: 5601
#
# # 7. 国际化配置(中文界面,可选)
i18n.locale: "zh-CN"

elasticsearch.ssl.certificateAuthorities: [ "config/elasticsearch-ca.pem" ]

Kibana Server Https证书配置

当前我们连接kibana的时候还是http的方式进行的访问,接下来使用https的方式进行访问:

执行下面的命令生成证书文件 csr-bundle.zip:

java 复制代码
 ./bin/elasticsearch-certutil csr -name kibana-server -dns localhost localhost.localdomain

之后将文件复制到kibana的config中:

java 复制代码
 unzip csr-bundle.zip

之后执行命令,生成.crt证书文件:

  1. 官网原文
  2. Send the kibana-server.csr certificate signing request to your internal CA or trusted CA for signing to obtain a signed certificate. The signed file can be in different formats, such as a .crt file like kibana-server.crt.
java 复制代码
openssl req -x509 -key /elasticsearch/kibana-8.5.2/config/kibana-server/kibana-server.key -out /elasticsearch/kibana-8.5.2/config/kibana-server/kibana-server.crt -days 3650

之后再文件夹中出现文件,我们再配置文件kibana.yml中将这几个文件配置一下:

cpp 复制代码
server.ssl.enabled: true
server.ssl.certificate: /路径/到/你的证书.crt
server.ssl.key: /路径/到/你的私钥.key

总的kibana配置文件为:

cpp 复制代码
# Kibana 对外 HTTPS
server.ssl.enabled: true
server.ssl.certificate: /elasticsearch/kibana-8.5.2/config/kibana-server/client.crt
server.ssl.key: /elasticsearch/kibana-8.5.2/config/kibana-server/client.key


# 1. Kibana服务监听地址(允许外部访问,0.0.0.0表示所有IP)
server.host: "0.0.0.0"
#
# # 2. Kibana服务名称(自定义,可选)
# server.name: "kibana-server"
#
# # 3. Elasticsearch连接地址(无HTTPS,使用http协议)
# # 格式:http://ES节点IP:9200,多节点用逗号分隔
elasticsearch.hosts: ["https://192.168.0.191:9200","https://192.168.0.191:9201"]
#
# # 6. Kibana页面访问端口(默认5601,无需修改)
# server.port: 5601
#
# # 7. 国际化配置(中文界面,可选)
i18n.locale: "zh-CN"

elasticsearch.ssl.certificateAuthorities: [ "config/elasticsearch-ca.pem" ]

之后我们再连接kibana的时候使用的方式也是https的方式。

上面的方式和步骤都是与8.X版本官网保持一致的,大家可以参考官网尝试搭建

相关推荐
HannahTx1 小时前
录音文件存在哪里方便整理查找?全场景存储方案对比
大数据
weixin_468466851 小时前
数据高效处理实战:从痛点解决到价值落地
大数据·python·自动化·数据处理
quan26311 小时前
20260529,日常开发-查老数据全量更新闭坑
java·mysql·主从·主从延迟
大大杰哥1 小时前
Java 日志框架详解:SLF4J + Logback 从入门到实战
java·开发语言·logback
城事漫游Molly1 小时前
AI与质性研究的融合(三):AI赋能质性数据分析——从编码到理论构建的新范式
大数据·人工智能·机器学习·prompt·ai for science·智能体·定性研究
ylscode2 小时前
黑客利用 GHOSTYNETWORKS 和 OMEGATECH 托管 JS 恶意软件基础设施
开发语言·安全·php·安全威胁分析
Dest1ny-安全2 小时前
2026最新CTF知识库:12大Web漏洞深度文章+1156篇历年大赛WP+50+脚本+Payload速查 +AI/RAG离线在线知识库
java·学习·安全·web安全·servlet
404号扳手2 小时前
Java 基础知识(六)
java·后端
jiayong232 小时前
海量数据常见面试问题及详细解答
大数据·面试·职场和发展