目录
-
- 一、背景
- 二、启用安全功能的配置步骤
-
- [2.1 修改配置文件](#2.1 修改配置文件)
- [2.2 生成证书(生产环境推荐)](#2.2 生成证书(生产环境推荐))
-
- [2.3 重启集群](#2.3 重启集群)
- [2.4 使用 setup-passwords 命令设置账号密码](#2.4 使用 setup-passwords 命令设置账号密码)
- [2.5 补充:许可证处理(ERROR: X-Pack Security is not available.)](#2.5 补充:许可证处理(ERROR: X-Pack Security is not available.))
- [2.6 验证连接](#2.6 验证连接)
- 三、验证安全功能、初始化用户密码与故障排查
-
- [3.1 验证安全功能](#3.1 验证安全功能)
- [3.2 验证登录](#3.2 验证登录)
- [3.3 故障排查](#3.3 故障排查)
- 四、用户管理与安全最佳实践
-
- [4.1 创建和管理自定义用户](#4.1 创建和管理自定义用户)
-
- [1)通过 Kibana 管理](#1)通过 Kibana 管理)
- [2)通过 API 管理](#2)通过 API 管理)
- [4.2 密码策略与安全最佳实践](#4.2 密码策略与安全最佳实践)
- [4.3 Docker容器中的密码持久化](#4.3 Docker容器中的密码持久化)
- 五、补充:Elasticsearch-Head访问带安全认证的ES
- 六、总结

一、背景
在云计算时代,许多开发者和学习者在云服务器上部署 Elasticsearch 用于学习和测试。然而,一个真实的案例就发生在了我的身上:
小编昨天在云服务器上部署了Elasticsearch后,当时正常存储了一些测试索引,但第二天发现所有数据被清空,并插入了一条名为read_me的恶意勒索索引,内容如下:
Your database has been deleted from your server, but all the information remains stored on our cluster.
The instructions for recovery are as follows: You must send 0.0061 BTC to the following wallet: XXX ...

好在小编的 ES 上面没有重要数据,不然可就后悔莫及了,这说明了数据安全的重要性。当 Elasticsearch 暴露在公网上且没有启用任何安全认证时,恶意攻击者可以轻易访问、篡改甚至勒索您的数据。
因此,建议无论 ES 是用于生产环境、测试环境还是个人学习,都必须启用安全认证机制。默认情况下,Elasticsearch 不启用任何认证,任何能够访问ES端口的人都可以完全控制您的数据。
二、启用安全功能的配置步骤
启用安全功能的配置步骤如下:
2.1 修改配置文件
编辑主配置文件 elasticsearch.yml,添加以下配置:
yaml
# 启用安全功能
xpack.security.enabled: true
# 设置传输层通信的加密(推荐)
xpack.security.transport.ssl.enabled: true
主配置文件默认路径在:/user/share/elasticsearch/config/elasticsearch.yml
2.2 生成证书(生产环境推荐)
对于生产环境,强烈建议配置TLS加密。可以使用ES自带的elasticsearch-certutil工具生成证书:
bash
# 生成CA和证书
bin/elasticsearch-certutil ca
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
将生成的证书文件放入配置指定的目录。修改 elasticsearch.yml 配置如下:
yaml
# 设置传输层通信的加密(推荐)
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
2.3 重启集群
修改配置后,需要重启所有ES节点以使配置生效。
2.4 使用 setup-passwords 命令设置账号密码
ES 提供了elasticsearch-setup-passwords工具来批量设置密码。
该工具位于Elasticsearch安装目录的bin子目录(/usr/share/elasticsearch/bin/)下,进入目录之后,执行如下命令:
interactive模式允许为每个用户单独设置强密码;
bash
# 交互式设置所有内置用户的密码
./elasticsearch-setup-passwords interactive
auto模式会为所有用户生成随机密码并输出到控制台。
bash
# 或为特定用户设置密码(非交互式)
./elasticsearch-setup-passwords auto
2.5 补充:许可证处理(ERROR: X-Pack Security is not available.)
对于 Elasticsearch 6.3.2版本,需要注意许可证问题:
问题现象 :即使设置xpack.security.enabled: true,仍可能出现"X-Pack Security is not available"错误。

根本原因:
在 Elasticsearch 6.3.2 版本中,X-Pack 的可用性取决于 许可证类型。根据相关资料,X-Pack 分为三种类型:
| 许可证类型 | 功能范围 | 安全功能 |
|---|---|---|
| Basic (默认) | 基础功能 | 有限或不可用 |
| Platinum | 完整功能 | 完整可用 |
Elasticsearch 6.3.2 的默认许可证是 Basic ,而 Basic 许可证不包含完整的安全功能(如用户认证、角色管理、审计日志等)。
解决方案:
-
检查当前许可证:
bashcurl -X GET "http://localhost:9200/_license?pretty"

- 启用30天试用许可证(解锁完整X-Pack功能):
bash
curl -H "Content-Type: application/json" -XPOST \
"http://localhost:9200/_xpack/license/start_trial?acknowledge=true"

- 再次设置账号密码
再次使用 elasticsearch-setup-passwords 工具来设置账号密码,这次我们输入一个 y 之后就可以设置成功了。

2.6 验证连接
再次发送如下请求:
bash
curl -X GET "http://localhost:9200/_license?pretty"
确认请求状态变为 401,则说明许可证已经生效。

三、验证安全功能、初始化用户密码与故障排查
3.1 验证安全功能
在设置密码前,先验证安全功能是否已启用:
bash
# 检查安全功能状态
curl -X GET "http://172.17.0.2:9200/_xpack/security/_authenticate?pretty"
# 对于ES 6.3.2,检查许可证
curl -X GET "http://172.17.0.2:9200/_license?pretty"
3.2 验证登录
设置完成后,可以使用curl命令测试登录:
bash
curl -u elastic:your_password -X GET "https://localhost:9200/_cluster/health?pretty"
如果返回集群健康状态,则表示认证成功。
3.3 故障排查
1)常见错误及解决方案
错误1:X-Pack Security is not available
- 原因:许可证类型不支持安全功能(常见于ES 6.3.2)
- 解决:启用试用许可证(见二、2.2节)
错误2:403 Forbidden
- 原因:用户权限不足或安全功能未正确启用
- 解决:检查许可证和配置文件
错误3:Connection refused
- 原因:ES服务未运行或网络问题
- 解决:检查服务状态和端口
2)诊断命令
bash
# 检查许可证状态
curl -X GET "http://172.17.0.2:9200/_license?pretty"
# 检查节点设置
curl -X GET "http://172.17.0.2:9200/_nodes/settings?pretty"
# 检查集群健康状态
curl -X GET "http://172.17.0.2:9200/_cluster/health?pretty"
四、用户管理与安全最佳实践
4.1 创建和管理自定义用户
1)通过 Kibana 管理
-
登录 Kibana 管理界面。
-
进入 Stack Management > Security > Users。
-
点击 Create user。
-
填写用户名、全名、电子邮件。
-
在 Roles 部分,为用户分配一个或多个预定义角色(如
kibana_admin,monitoring_user)或自定义角色。 -
设置密码并确认。
2)通过 API 管理
也可以使用ES的User API进行管理。
bash
curl -u elastic:your_password -X POST "https://localhost:9200/_security/user/john_doe" -H "Content-Type: application/json" -d'
{
"password" : "user_password",
"roles" : [ "my_custom_role" ],
"full_name" : "John Doe"
}
'
4.2 密码策略与安全最佳实践
1)强密码策略
在 elasticsearch.yml 中配置密码复杂度要求:
yaml
xpack.security.authc.password_policy.length.min: 8
xpack.security.authc.password_policy.character.category.lowercase.min: 1
xpack.security.authc.password_policy.character.category.uppercase.min: 1
xpack.security.authc.password_policy.character.category.digit.min: 1
xpack.security.authc.password_policy.character.category.special.min: 1
2)定期轮换密码
建议定期(如每90天)轮换重要账户的密码。可以使用API更新用户密码:
bash
curl -u elastic:your_password -X POST "https://localhost:9200/_security/user/john_doe/_password" -H "Content-Type: application/json" -d'
{
"password" : "new_strong_password"
}
'
3)使用 API Key
对于应用程序访问,推荐使用API Key而非长期有效的用户名/密码,以降低安全风险。
4.3 Docker容器中的密码持久化
1)容器重启对密码的影响
在Docker容器中运行Elasticsearch时,密码信息的持久化取决于数据存储方式:
-
数据卷挂载 :如果将ES的数据目录(默认为
/usr/share/elasticsearch/data)挂载到宿主机或持久化存储卷,密码信息(存储在.security索引中)将持久保存,容器重启后密码不会丢失。 -
临时存储:如果未挂载数据卷,使用容器的临时存储,容器重启或删除后,所有数据(包括用户密码)将丢失。
2)确保密码持久化的最佳实践
- 使用Docker命令时,挂载数据卷:
bash
# 使用Docker命令时挂载数据卷
docker run -d \
--name elasticsearch \
-v es-data:/usr/share/elasticsearch/data \
-v es-config:/usr/share/elasticsearch/config \
-p 9200:9200 \
elasticsearch:8.x.x
- 在使用docker-compose时,挂载数据卷:
yaml
# 在使用docker-compose时
version: '3.8'
services:
elasticsearch:
image: elasticsearch:8.x.x
volumes:
- es-data:/usr/share/elasticsearch/data
- es-config:/usr/share/elasticsearch/config
ports:
- "9200:9200"
volumes:
es-data:
es-config:
3)容器重启后的处理
-
密码保留:如果使用了持久化存储,容器重启后所有用户密码和角色配置都会保留,无需重新设置。
-
密码丢失 :如果未使用持久化存储,容器重启后需要重新执行
elasticsearch-setup-passwords命令初始化内置用户密码,并重新创建自定义用户。
重要提醒:在生产环境中,务必配置持久化存储,并定期备份ES数据,以防止意外数据丢失。
五、补充:Elasticsearch-Head访问带安全认证的ES
ES开启了身份安全认证功能后,elasticsearch-head自然也是需要配置才能正常访问我们ES的。
操作方式:
- 我们需要在访问路径后面加上用户和密码就可以正确地访问 Elasticsearch-Head 了,如下所示:
http://192.168.111.129:9100/?auth_user=elastic\&auth_password=elastic

六、总结
正确设置和管理ES的账号密码是保障数据安全的基础。
通过启用安全功能、初始化内置用户、创建自定义用户并遵循强密码策略,可以有效防止未授权访问。建议结合角色权限管理、TLS加密和API Key等机制,构建多层次的安全防护体系。
另外,在Docker环境中,确保使用持久化存储是保障密码和配置不丢失的关键。
整理完毕,完结撒花~🌻