上一篇【第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.remove2.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_password3.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.1bin/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_passwordverification_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:92004.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 内置用户列表
| 用户名 | 角色 | 用途 |
|---|---|---|
elastic | superuser | 内置超级管理员 |
kibana_system | kibana_system | Kibana连接ES使用 |
logstash_system | logstash_system | Logstash连接ES使用 |
beats_system | beats_system | Beats连接ES使用 |
apm_system | apm_system | APM连接ES使用 |
remote_monitoring_user | remote_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 / PEM | Transport用p12,HTTP可选pem |
| 认证方式 | Basic Auth | 通过内置或自定义用户认证 |
| 敏感配置 | Keystore | 使用密钥库存储敏感信息 |
安全配置最佳实践
尽早启用安全:不要等到生产环境上线后再加安全配置,尽早启用可以避免后期改造的麻烦。如果是Elasticsearch 8.x,默认已开启安全功能。
证书密码管理:将证书密码存入Keystore,不要明文写在配置文件中。建议使用统一的密码管理工具。
定期轮换证书:建议每年轮换一次CA和节点证书,可以通过
elasticsearch-certutil重新生成并替换。最小权限原则:为不同应用创建专用用户和角色,避免所有服务共用
elastic超级用户。网络隔离:除了TLS加密外,还应通过防火墙限制9200和9300端口的访问来源,Transport层端口(9300)只对集群内部节点开放。
审计日志:如果是Platinum许可,启用审计日志记录关键操作,便于事后追溯。
密钥库备份:妥善备份
elasticsearch.keystore文件和CA证书,丢失后无法恢复已加密的配置。
上一篇【第06篇】Elasticsearch索引生命周期管理与数据流
下一篇【第08篇】Elasticsearch集群扩展与运维——水平扩展与节点管理