news 2026/5/22 22:23:49

【Elasticseach从入门到精通】第07篇:Elasticsearch集群安全配置——TLS/SSL与密钥库管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Elasticseach从入门到精通】第07篇:Elasticsearch集群安全配置——TLS/SSL与密钥库管理

上一篇【第06篇】Elasticsearch索引生命周期管理与数据流
下一篇【第08篇】Elasticsearch集群扩展与运维——水平扩展与节点管理


摘要

在生产环境中运行Elasticsearch集群,安全配置是不可忽视的一环。从7.1版本开始,Elasticsearch免费开放了基础安全特性(X-Pack Security Basic),包括TLS/SSL加密通信和基于用户名密码的Basic认证。本文将系统讲解ES集群安全配置的完整流程:首先介绍Elasticsearch密钥库(Keystore)的创建与管理,用于安全存储敏感配置信息;接着演示如何使用elasticsearch-certutil工具生成CA证书和节点证书;然后详细说明Transport层和HTTP层的TLS/SSL配置方法;最后讲解如何启用内置用户和Basic Auth认证,以及跨集群复制的安全设置。通过本文的学习,读者可以为自己的ES集群搭建一套完整的安全防护体系。


一、Elasticsearch安全性概述

在默认配置下,Elasticsearch没有任何安全防护——任何人只要知道节点地址,就可以访问所有数据、执行任意操作。这在开发测试环境也许没问题,但在生产环境中是不可接受的。

1.1 免费安全特性(7.1+)

从Elasticsearch 7.1版本开始,X-Pack Security的基础功能免费开放(Basic许可证),主要包括:

功能说明是否免费
TLS/SSL加密Transport层和HTTP层通信加密免费7.1+
基于角色的访问控制(RBAC)用户、角色、权限管理免费7.1+
内置用户管理elastic、kibana_system等预设账户免费7.1+
文档和字段级安全控制用户可访问的文档和字段免费7.1+
审计日志记录安全相关事件Platinum
IP过滤基于IP地址的访问控制Platinum

关键提示:在Elasticsearch 8.x中,安全功能默认启用。首次启动时会自动生成证书和密码。而在7.x中,需要手动配置。

1.2 安全配置的两个层面

Elasticsearch的安全通信涉及两个层面:

  • Transport层(节点间通信):集群内部节点之间的通信,使用9300端口。配置xpack.security.transport.ssl.enabled
  • HTTP层(客户端通信):客户端与ES集群之间的通信,使用9200端口。配置xpack.security.http.ssl.enabled

两者可以独立启用,但建议在生产环境中同时启用。


二、密钥库(Keystore)管理

Elasticsearch提供了一个密钥库机制,用于安全地存储敏感配置信息。与直接写在elasticsearch.yml中不同,密钥库中的设置会经过模糊处理(obfuscation),避免明文暴露。

2.1 密钥库基本操作

密钥库文件elasticsearch.keystore位于config目录下,与elasticsearch.yml同级。

创建密钥库

bin/elasticsearch-keystore create

查看密钥库中的设置项

bin/elasticsearch-keystore list

添加字符串设置

# 交互式输入(会提示输入值)bin/elasticsearch-keystoreaddthe.setting.name.to.set# 通过管道传入值cat/file/containing/setting/value|bin/elasticsearch-keystoreadd--stdinthe.setting.name.to.set

添加文件设置(适用于密钥文件等):

bin/elasticsearch-keystore add-file the.setting.name.to.set /path/example-file.json

删除设置项

bin/elasticsearch-keystore remove the.setting.name.to.remove

2.2 密钥库使用注意事项

  • 所有命令都需要以运行Elasticsearch的用户身份执行
  • 并非所有设置都支持从密钥库读取,需查阅具体文档确认
  • 密钥库的修改在重启Elasticsearch后才生效
  • 安全设置必须在集群所有节点上配置,且保持一致
  • 目前密钥库只提供模糊处理,未来会增加密码保护

2.3 可重载的安全设置

部分安全设置支持运行时重载,无需重启节点:

POST_nodes/reload_secure_settings

最佳实践:当需要修改多个可重载的安全设置时,应该在每个节点上修改完所有设置后,再执行一次reload_secure_settings,而不是每次修改后都重载。


三、生成CA和节点证书

Elasticsearch提供了elasticsearch-certutil工具来生成证书。我们需要先生成一个CA(证书颁发机构),然后基于CA为每个节点签发证书。

3.1 生成CA证书

bin/elasticsearch-certutil ca

执行后会在当前目录生成一个elastic-stack-ca.p12文件,这就是我们的CA证书。系统会提示你设置CA的密码,请务必记住。

3.2 为节点签发证书

# 基于CA生成节点证书,会提示输入CA密码bin/elasticsearch-certutil cert--caelastic-stack-ca.p12

执行后生成elastic-certificates.p12文件,这就是节点的证书文件。

也可以在生成时指定参数,避免交互式输入:

bin/elasticsearch-certutil cert\--caelastic-stack-ca.p12\--ca-pass your_ca_password\--passyour_cert_password

3.3 为不同节点生成独立证书(进阶)

在生产环境中,推荐为每个节点生成独立的证书,并在证书中指定节点名称作为SAN(Subject Alternative Name):

# 先创建一个instances.yml文件
instances:-name:es-node1dns:-es-node1.example.com-localhostip:-192.168.1.101-127.0.0.1-name:es-node2dns:-es-node2.example.com-localhostip:-192.168.1.102-127.0.0.1-name:es-node3dns:-es-node3.example.com-localhostip:-192.168.1.103-127.0.0.1
bin/elasticsearch-certutil cert\--caelastic-stack-ca.p12\--ca-pass your_ca_password\--ininstances.yml\--outcerts.zip

解压certs.zip后,将对应节点的证书文件分发到各节点的config目录中。

3.4 证书生成工具对比

工具用途输出格式
elasticsearch-certutil ca生成CA证书PKCS#12 (.p12)
elasticsearch-certutil cert生成节点证书PKCS#12 (.p12)
elasticsearch-certutil http生成HTTP层证书PEM (.crt/.key)
openssl(第三方)灵活生成各类证书PEM/DER等

注意:Transport层默认使用PKCS#12格式证书,HTTP层使用PEM格式。elasticsearch-certutil http可以方便地生成HTTP层所需的PEM格式证书。


四、TLS/SSL配置详解

4.1 分发证书文件

将生成的证书文件复制到每个节点的config目录下:

# 在每个节点上执行cpelastic-certificates.p12 config/

4.2 配置Transport层加密

编辑elasticsearch.yml

xpack.security.enabled:truexpack.security.transport.ssl.enabled:truexpack.security.transport.ssl.verification_mode:certificatexpack.security.transport.ssl.keystore.path:elastic-certificates.p12xpack.security.transport.ssl.truststore.path:elastic-certificates.p12

如果证书设置了密码,需要将密码存入密钥库:

bin/elasticsearch-keystoreaddxpack.security.transport.ssl.keystore.secure_password bin/elasticsearch-keystoreaddxpack.security.transport.ssl.truststore.secure_password

verification_mode选项说明

模式说明
full验证证书链和主机名(最严格)
certificate验证证书链,不验证主机名
peer验证对端证书,不验证自己
none不验证(最不安全,仅测试用)

4.3 配置HTTP层加密

首先生成PEM格式证书:

bin/elasticsearch-certutil http

然后配置elasticsearch.yml

xpack.security.http.ssl.enabled:truexpack.security.http.ssl.keystore.path:http.p12

配置完成后,客户端需要通过HTTPS访问:

curl-khttps://localhost:9200

4.4 完整的安全配置示例

以下是一个三节点集群的完整安全配置(elasticsearch.yml):

cluster.name:es-productionnode.name:es-node1# ===== 节点发现配置 =====discovery.seed_hosts:["192.168.1.101","192.168.1.102","192.168.1.103"]cluster.initial_master_nodes:["es-node1","es-node2","es-node3"]# ===== 安全配置 =====xpack.security.enabled:true# Transport层TLSxpack.security.transport.ssl.enabled:truexpack.security.transport.ssl.verification_mode:certificatexpack.security.transport.ssl.keystore.path:elastic-certificates.p12xpack.security.transport.ssl.truststore.path:elastic-certificates.p12# HTTP层TLSxpack.security.http.ssl.enabled:truexpack.security.http.ssl.keystore.path:elastic-certificates.p12

注意:每个节点的node.name不同,但安全配置保持一致。


五、启用Basic Auth认证

启用TLS后,还需要配置身份认证。Elasticsearch内置了多个系统账户,最常用的是elastic超级用户。

5.1 内置用户列表

用户名角色用途
elasticsuperuser内置超级管理员
kibana_systemkibana_systemKibana连接ES使用
logstash_systemlogstash_systemLogstash连接ES使用
beats_systembeats_systemBeats连接ES使用
apm_systemapm_systemAPM连接ES使用
remote_monitoring_userremote_monitoring_collector跨集群监控

5.2 设置内置用户密码

启动节点后,使用elasticsearch-setup-passwords工具设置密码:

# 交互式设置(推荐,可以为每个用户设不同密码)bin/elasticsearch-setup-passwords interactive# 自动生成随机密码bin/elasticsearch-setup-passwords auto

交互式设置输出示例:

Initiating the setup of passwordsforreserveduserselastic,apm_system,kibana_system,logstash_system,beats_system,remote_monitoring_user. You will be prompted to enter passwords as the process progresses. Please confirm that you would like tocontinue[y/N]y Enter passwordfor[elastic]: Reenter passwordfor[elastic]: Enter passwordfor[apm_system]: Reenter passwordfor[apm_system]:...

重要:请务必妥善保存密码!建议使用密码管理器统一管理。

5.3 使用认证访问集群

设置密码后,所有请求都需要认证:

# 带认证的请求curl-uelastic:your_password-khttps://localhost:9200# 查看集群健康状态curl-uelastic:your_password-khttps://localhost:9200/_cluster/health?pretty

响应示例:

{"name":"es-node1","cluster_name":"es-production","cluster_uuid":"abc123...","version":{"number":"7.17.0",...},"tagline":"You Know, for Search"}

5.4 创建自定义用户和角色

通过API创建角色和用户:

// 创建角色POST_security/role/my_readonly_role{"indices":[{"names":["logs-*"],"privileges":["read"]}]}// 创建用户并分配角色POST_security/user/app_user{"password":"app_user_password","roles":["my_readonly_role"],"full_name":"Application Read User","email":"app@example.com"}

验证用户权限:

curl-uapp_user:app_user_password-khttps://localhost:9200/logs-2024.01/_search

六、跨集群复制安全设置

如果你的ES集群之间需要配置跨集群搜索(Cross-Cluster Search)或跨集群复制(Cross-Cluster Replication),需要额外配置安全设置。

6.1 远程集群连接配置

在远程集群上,需要配置remote_cluster_client角色:

# elasticsearch.yml - 远程集群节点配置node.roles:[remote_cluster_client]

6.2 建立跨集群信任关系

本地集群需要信任远程集群的CA证书。有两种方式:

方式一:共享CA证书

将远程集群的CA证书添加到本地集群的信任库中:

# 将远程集群CA证书导入本地集群的密钥库bin/elasticsearch-keystoreadd\xpack.security.remote_cluster.ssl.truststore.path

方式二:使用API添加远程集群

POST_cluster/settings{"persistent":{"cluster":{"remote":{"cluster_two":{"seeds":["192.168.2.101:9300","192.168.2.102:9300"],"skip_unavailable":true}}}}}

6.3 验证跨集群连接

// 跨集群搜索GETcluster_two:logs-*/_search{"query":{"match_all":{}}}

七、总结与最佳实践

核心要点回顾

配置项关键参数说明
安全总开关xpack.security.enabled设为true启用安全功能
Transport加密xpack.security.transport.ssl.enabled节点间通信加密
HTTP加密xpack.security.http.ssl.enabled客户端通信加密
证书格式PKCS#12 / PEMTransport用p12,HTTP可选pem
认证方式Basic Auth通过内置或自定义用户认证
敏感配置Keystore使用密钥库存储敏感信息

安全配置最佳实践

  1. 尽早启用安全:不要等到生产环境上线后再加安全配置,尽早启用可以避免后期改造的麻烦。如果是Elasticsearch 8.x,默认已开启安全功能。

  2. 证书密码管理:将证书密码存入Keystore,不要明文写在配置文件中。建议使用统一的密码管理工具。

  3. 定期轮换证书:建议每年轮换一次CA和节点证书,可以通过elasticsearch-certutil重新生成并替换。

  4. 最小权限原则:为不同应用创建专用用户和角色,避免所有服务共用elastic超级用户。

  5. 网络隔离:除了TLS加密外,还应通过防火墙限制9200和9300端口的访问来源,Transport层端口(9300)只对集群内部节点开放。

  6. 审计日志:如果是Platinum许可,启用审计日志记录关键操作,便于事后追溯。

  7. 密钥库备份:妥善备份elasticsearch.keystore文件和CA证书,丢失后无法恢复已加密的配置。


上一篇【第06篇】Elasticsearch索引生命周期管理与数据流
下一篇【第08篇】Elasticsearch集群扩展与运维——水平扩展与节点管理


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 22:22:24

当产品经理也能“写代码”:蚂蚁百宝箱开启自然语言构建智能体新时代

“帮我做一个618大促的营销智能体,能自动识别高潜用户、生成个性化文案、并通过企微触达。”——当产品经理在对话框中敲下这样一段需求,几分钟后,一个完整可用的智能体便在测试环境中运转了起来。这不是科幻电影,而是蚂蚁百宝箱智…

作者头像 李华
网站建设 2026/5/22 22:22:23

Android Studio中文界面终极指南:3步实现高效母语开发体验

Android Studio中文界面终极指南:3步实现高效母语开发体验 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Andr…

作者头像 李华
网站建设 2026/5/22 22:17:10

3种终极方法破解Navicat Mac版试用限制:一键无限重置教程

3种终极方法破解Navicat Mac版试用限制:一键无限重置教程 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为N…

作者头像 李华
网站建设 2026/5/22 22:15:32

2026大学生考证全攻略:这一年,如何用证书为未来铺路?

你好啊,很高兴能和你聊聊这个话题。每当看到年轻的面孔在图书馆里埋头苦读,或是听到大家在食堂里焦虑地讨论“就业难”、“内卷”时,我总会想起自己当年的模样。其实,作为过来人,我深知大学这段时光的宝贵。它不仅是象…

作者头像 李华
网站建设 2026/5/22 22:12:46

【金蝶云星空】出纳做账-付款退款单使用场景

学习目标学习本内容后,您将掌握如何使用付款退款单。业务场景付款退款单 付款退款单与付款业务对应,处理付款业务所发生的退款,包括采购业务付款的退款或者其他业务付款的退款。支持手工新增或者关联应付系统负数的应付单、其他应付单生成付…

作者头像 李华
网站建设 2026/5/22 22:10:54

m4s-converter:解锁B站缓存视频的跨平台无损转换解决方案

m4s-converter:解锁B站缓存视频的跨平台无损转换解决方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 在数字内容时代&#xff0c…

作者头像 李华