实战指南:使用elasticsearch-certutil生成与配置Xpack安全认证证书
1. 为什么你的Elasticsearch集群需要“上锁”?
如果你刚开始接触Elasticsearch,可能会觉得默认安装就能跑起来,数据也能存进去,这就算完事了。但我要告诉你,这就像把家门钥匙插在锁上就出门一样危险。我见过太多因为图省事,直接在生产环境裸奔(不开启任何安全措施)的Elasticsearch集群,结果数据被恶意删除、勒索,甚至被用来挖矿。数据安全无小事,尤其是当你的ES里存着用户信息、业务日志这些敏感数据时。
Elasticsearch内置的Xpack安全功能,就是给你的集群“上锁”的核心工具。而“锁”的核心,就是安全认证证书。你可以把它理解为集群内部各个节点之间,以及客户端(比如Kibana、你的应用程序)与集群之间通信的“接头暗号”和“加密信道”。没有证书,节点之间无法建立可信的连接;没有TLS加密,网络上传的数据就像明信片,谁都能看。
原始文章给了你一个快速操作的骨架,但知其然更要知其所以然。这篇文章,我会带你从零开始,手把手、掰开揉碎了讲清楚怎么用elasticsearch-certutil这个官方工具,生成一套既安全又可靠的证书体系,并把它稳稳当当地配置到你的集群里。整个过程,我会分享我踩过的坑和验证过的“稳”方案,目标是让你看完就能动手,一次成功。
2. 动手之前:理清证书体系的“家族关系”
别被“证书”、“密钥”、“CA”这些词吓到。咱们用一个简单的家族关系来类比,你就明白了:
- CA(Certificate Authority,证书颁发机构): 这是这个证书家族的“老祖宗”,一个绝对权威的存在。它的唯一工作就是签发“身份证”给下面的成员,并证明这些身份证是有效的。在我们的操作里,第一步就是创建这个“老祖宗”。
- 节点证书: 这是每个Elasticsearch节点的“身份证”。上面写着这个节点的名字(比如
node-1),并且有“老祖宗”(CA)的签名。节点之间通信时,会互相亮出身份证,检查是不是同一个“老祖宗”签发的,以此来判断“你是不是自己人”。 - HTTP证书: 这是专门给外部客户端(如Kibana、Logstash、你的Java/Python程序)用的“访客通行证”。它同样由“老祖宗”签发,但用途是加密浏览器或程序与ES集群9200端口(HTTP API)的通信,防止数据在传输中被窃听。
elasticsearch-certutil工具能帮你一次性创建这个完整的家族:先造出“老祖宗”(CA),然后用它给所有“家庭成员”(节点和HTTP客户端)签发身份证。理清了这个关系,后面的步骤就清晰了。
3. 第一步:创建权威的“老祖宗”——CA证书
好,咱们打开命令行,开始实操。假设你的Elasticsearch安装在 /usr/share/elasticsearch 目录下。
3.1 生成CA证书
首先,切换到Elasticsearch的安装目录,然后运行创建CA的命令:
cd /usr/share/elasticsearch
sudo bin/elasticsearch-certutil ca
这里有几个细节要注意:
- 权限问题: 生产环境建议使用非root用户运行Elasticsearch,但在生成证书时,你可能需要
sudo权限来写入文件。或者,你可以先以有权限的用户生成证书,再修改文件属主。 - 交互过程: 执行命令后,你会进入一个简单的交互界面:
- 第一个提示:
Please enter the desired output file [elastic-stack-ca.p12]:这里让你设置CA文件的文件名。直接回车,使用默认的elastic-stack-ca.p12就行。这个.p12文件是一个包含了CA公私钥的密钥库文件。 - 第二个提示:
Enter password for [elastic-stack-ca.p12]:这里非常关键! 你需要为这个CA密钥库设置一个强密码。请务必记住这个密码,后面每次用它签发证书都需要输入。我建议你用密码管理器存好,或者记在安全的地方。再次输入密码确认后,CA就创建成功了。
- 第一个提示:
3.2 理解生成的文件
当前目录下会生成 elastic-stack-ca.p12 这个文件。这个文件就是整个证书体系的根,必须绝对保密,最好把它备份到安全的离线存储中。如果这个文件泄露,攻击者就可以用它签发任意非法证书,冒充你的集群节点。
注意:默认情况下,生成的CA证书有效期是10年。对于长期稳定的生产环境,这个期限是合适的。如果你有更严格的安全策略,可以在命令后添加
-days参数来指定天数,例如bin/elasticsearch-certutil ca -days 3650。
4. 第二步:为每个节点制作“身份证”——节点证书
有了“老祖宗”(CA),现在可以给集群里的每个节点颁发“身份证”了。
4.1 生成节点证书
运行以下命令:
sudo bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
这个命令的意思是:使用我们刚才创建的 elastic-stack-ca.p12 这个CA,来签发一个新的证书。
交互过程如下:
- 输入CA密码: 首先会提示
Enter password for CA (elastic-stack-ca.p12):,输入你上一步为CA设置的那个强密码。 - 设置证书信息: 接着会问一系列问题,对于节点间通信证书,大部分可以直接回车用默认值:
Please enter the desired output file [elastic-certificates.p12]:- 输出文件名,默认即可。Enter password for [elastic-certificates.p12]:- 为这个节点证书密钥库设置一个密码。这个密码可以和第1步的CA密码不同,同样需要牢记。节点启动时需要用它。Enter password for [elastic-certificates.p12] (again):- 再次确认密码。- 后续关于证书有效期、个人信息(如国家、组织等)的提示,除非你有特殊需求,否则一路回车用默认值即可。因为节点证书主要用于内部身份验证,这些信息不是必须的。
命令执行成功后,你会得到 elastic-certificates.p12 文件。这个文件包含了经CA签名的、可用于所有节点的证书和私钥。 是的,一个文件给所有节点用,这是Elasticsearch的简化设计,因为节点间验证的是同一个CA签名,而不是具体的证书内容。
4.2 分发证书到所有节点
你需要将这两个文件安全地拷贝到集群中的每一个节点上:
elastic-stack-ca.p12(CA文件)elastic-certificates.p12(节点证书文件)
你可以使用 scp 等工具进行拷贝。建议将它们放在每个节点Elasticsearch配置目录(通常是 $ES_PATH_CONF,默认为/etc/elasticsearch)下一个专门的certs文件夹里,方便管理。
# 在目标节点上创建证书目录
sudo mkdir -p /etc/elasticsearch/certs
# 从生成证书的节点拷贝(假设IP为192.168.1.10)
sudo scp user@192.168.1.10:/usr/share/elasticsearch/elastic-*.p12 /etc/elasticsearch/certs/
确保拷贝后,这些文件的权限设置正确,只允许Elasticsearch运行用户读取。
5. 第三步:配置节点间的“加密通话”——TLS传输层安全
证书准备好了,现在要告诉Elasticsearch怎么用它们。我们需要修改每个节点的 elasticsearch.yml 配置文件。
5.1 编辑核心配置
打开每个节点的 /etc/elasticsearch/elasticsearch.yml 文件,在文件末尾或相应部分添加或修改以下配置:
# 集群名称,所有节点必须一致
cluster.name: my-production-cluster
# 节点名称,每个节点必须唯一
node.name: ${HOSTNAME} # 可以使用主机名,或直接写死如 node-1
# 启用Xpack安全功能(必须开启)
xpack.security.enabled: true
# --- 节点间通信加密配置 (Transport SSL) ---
# 启用传输层SSL/TLS加密
xpack.security.transport.ssl.enabled: true
# 验证模式设为 certificate,表示验证对端证书是否由可信CA签发即可
xpack.security.transport.ssl.verification_mode: certificate
# 要求客户端(其他节点)也必须提供证书进行身份验证
xpack.security.transport.ssl.client_authentication: required
# 指定节点自己的证书密钥库位置
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/certs/elastic-certificates.p12
# 指定信任库位置(信任哪些CA签发的证书),这里我们信任自己的CA,所以和keystore用同一个文件
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/certs/elastic-certificates.p12
5.2 安全地存储密码
把密码明文写在配置文件里是大忌。Elasticsearch提供了 keystore 工具来安全存储密码。在每个节点上执行:
cd /usr/share/elasticsearch
# 添加密钥库密码到Elasticsearch的密钥库
sudo bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
# 系统会提示你输入密码,输入你为 `elastic-certificates.p12` 设置的那个密码
# 添加信任库密码(通常和密钥库密码相同)
sudo bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
# 输入相同的密码
执行后,密码会被加密存储在 /etc/elasticsearch/elasticsearch.keystore 文件中。这样,配置文件里就只保留路径,不暴露密码了。
5.3 重启并验证
在所有节点完成上述配置后,逐个重启 Elasticsearch服务。例如在systemd系统上:
sudo systemctl restart elasticsearch
重启后,查看日志 (sudo journalctl -u elasticsearch -f),如果没有关于SSL的错误,并且节点能成功加入集群(在日志里看到 cluster health status changed from [RED] to [GREEN] 或类似信息),说明节点间的TLS加密通信已经成功建立。现在,你的节点间所有数据传输都是加密的,并且每个节点都经过了身份验证。
6. 第四步:为外部访问打造“安全通道”——HTTP层TLS加密
节点内部安全了,但外部通过9200端口的HTTP访问还是明文的。我们需要为HTTP通信也配置TLS,这主要是为了保护像Kibana这样的管理界面,以及你的应用程序调用ES API时的数据安全。
6.1 生成HTTP证书
这里我们用elasticsearch-certutil的http子命令,它能生成更适用于Web场景的证书。
cd /usr/share/elasticsearch
sudo bin/elasticsearch-certutil http
这个命令会启动一个更详细的向导:
Generate a CSR? [y/N]- 是否生成证书签名请求?我们有自己的CA,所以选n。Use an existing CA? [y/N]- 是否使用现有CA?选y。CA path: [/path/to/your/elastic-stack-ca.p12]- 输入你CA文件(elastic-stack-ca.p12)的绝对路径。Password for CA:- 输入CA的密码。For how long should your certificate be valid? [5y]- 证书有效期,默认5年,可按需调整。Generate a certificate per node? [y/N]- 为每个节点生成单独的证书吗? 这里我强烈建议选y。虽然麻烦一点,但这样每个节点的HTTP证书是独立的,遵循了最佳安全实践。如果选n,所有节点共用一张证书。- 如果上一步选了
y,接下来会要求你依次输入每个节点的node.name(和你elasticsearch.yml里配置的一致)。 - 然后,你需要输入每个节点可能被访问到的所有主机名和IP地址。这非常关键!必须包括:
- 节点的实际主机名
- 在网络上可能用于访问的DNS域名(如
es-node-1.internal.com) - 节点的IP地址(包括内网IP,如果外部通过负载均衡器访问,可能还需要包含虚拟IP) 这部分可以输入多个,用逗号分隔。如果这里漏掉了某个地址,客户端用该地址访问时就会遇到证书域名不匹配的错误。
- 最后,为生成的HTTP证书密钥库设置一个密码。
命令完成后,会生成一个ZIP文件,名字类似 elasticsearch-ssl-http.zip。
6.2 解压并理解文件结构
解压这个ZIP文件:
sudo unzip elasticsearch-ssl-http.zip -d ./http_certs
查看解压后的目录,你会发现两个主要文件夹:elasticsearch 和 kibana。
elasticsearch/目录下:http.p12- 这就是用于Elasticsearch HTTP层TLS的证书密钥库文件。sample-elasticsearch.yml- 一个配置示例片段,告诉你如何在elasticsearch.yml中配置。README.txt- 详细的说明文档。
kibana/目录下:elasticsearch-ca.pem- CA的PEM格式证书,Kibana用它来验证ES服务器的证书。sample-kibana.yml- Kibana的配置示例。
6.3 配置Elasticsearch的HTTP TLS
将 http.p12 文件分发到每个节点的配置目录(如 /etc/elasticsearch/certs/)。然后在每个节点的 elasticsearch.yml 中追加HTTP TLS配置:
# --- HTTP客户端通信加密配置 (HTTP SSL) ---
# 启用HTTP层的SSL/TLS
xpack.security.http.ssl.enabled: true
# 指定HTTP证书密钥库的位置
xpack.security.http.ssl.keystore.path: /etc/elasticsearch/certs/http.p12
同样,需要将HTTP证书的密码存入密钥库:
sudo bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
# 输入你为 http.p12 设置的密码
6.4 配置Kibana连接(可选但重要)
如果你使用Kibana,现在它无法用HTTP连接ES了。你需要修改Kibana的配置文件 kibana.yml:
# 将原来的http地址改为https
elasticsearch.hosts: ["https://your-es-host:9200"]
# 启用SSL并指定CA证书
elasticsearch.ssl.certificateAuthorities: [ "/path/to/kibana/elasticsearch-ca.pem" ]
# 如果Kibana服务器也需要被ES验证(双向TLS),可能需要配置客户端证书,但通常单向即可
elasticsearch.ssl.verificationMode: certificate # 验证ES服务器证书
将解压得到的 kibana/elasticsearch-ca.pem 文件放到Kibana服务器上,并在配置中指向它。
6.5 最终重启
在所有节点上完成HTTP TLS配置后,再次重启Elasticsearch服务。重启后,尝试用 curl 或浏览器访问 https://your-es-node:9200,你应该会收到一个因为使用自签名证书而产生的安全警告(这是正常的),同时会返回需要身份认证的JSON响应,这证明HTTP TLS也已生效。
7. 证书管理中的“坑”与最佳实践
走到这一步,你的Elasticsearch集群已经拥有了一个由自签名CA支撑的完整TLS加密环境。但在实际运维中,还有一些经验之谈:
7.1 证书过期与续期
自签名证书和CA都有有效期。你一定要记录下证书的创建日期和有效期。可以在生成证书时用 -days 参数指定一个较长的期限(如10年),并设置日历提醒,在到期前几个月开始准备续期。续期流程和创建类似,需要生成新的证书并滚动重启集群节点。
7.2 私钥保护
.p12 文件包含了私钥,私钥一旦泄露,安全形同虚设。务必确保这些文件只在ES节点上有存储,且文件权限设置为仅限ES运行用户可读(如 chmod 600)。绝对不要将它们提交到代码仓库。
7.3 考虑使用正式的PKI体系
对于大型企业或对安全要求极高的场景,自建CA可能不够。可以考虑使用公司内部的私有PKI(如微软AD CS)或从公共CA购买证书来签发ES节点证书。这样能更好地与现有的证书管理流程集成。elasticsearch-certutil也支持使用外部CA签发的证书,你需要提供证书和私钥文件,然后转换成ES需要的PKCS#12格式。
7.4 监控与告警 在监控系统(如Elastic Stack自家的监控功能)中,关注与SSL/TLS相关的错误日志。可以设置告警,当出现证书验证失败、握手错误时及时通知。
整个过程看似步骤不少,但一旦跑通,你就会发现它其实是一条清晰的流水线。最关键的是,这份由你自己掌控的“锁”,能为你的数据资产提供坚实的第一道防线。我刚开始配置时也嫌麻烦,但第一次看到日志里“SSL handshake successful”的提示时,那种安心感是值得的。
更多推荐



所有评论(0)