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 许可证不包含完整的安全功能(如用户认证、角色管理、审计日志等)。

解决方案

  1. 检查当前许可证

    bash 复制代码
    curl -X GET "http://localhost:9200/_license?pretty"
  1. 启用30天试用许可证(解锁完整X-Pack功能):
bash 复制代码
curl -H "Content-Type: application/json" -XPOST \
  "http://localhost:9200/_xpack/license/start_trial?acknowledge=true"
  1. 再次设置账号密码

再次使用 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 管理
  1. 登录 Kibana 管理界面。

  2. 进入 Stack Management > Security > Users

  3. 点击 Create user

  4. 填写用户名、全名、电子邮件。

  5. Roles 部分,为用户分配一个或多个预定义角色(如kibana_admin, monitoring_user)或自定义角色。

  6. 设置密码并确认。

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环境中,确保使用持久化存储是保障密码和配置不丢失的关键。

整理完毕,完结撒花~🌻

相关推荐
一名优秀的码农2 小时前
vulhub系列-54-Red(超详细)
安全·web安全·网络安全·网络攻击模型·安全威胁分析
Old Uncle Tom2 小时前
智能体技能(Skills)供应链安全: 基于八攻击点的纵深防御体系
网络·人工智能·安全·ai·agent
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,MongoDB副本集的核心机制(11)
数据库·学习·mongodb
技术小黑2 小时前
TensorFlow学习系列09 | 优化猫狗识别
人工智能·学习·tensorflow
hzhsec2 小时前
钓鱼邮件分析与排查
服务器·前端·安全·web安全·钓鱼邮件
啥咕啦呛2 小时前
第一周Java学习自测题目
学习
Xudde.3 小时前
班级作业笔记报告0x05
笔记·学习·安全·web安全
123过去3 小时前
fcrackzip使用教程
linux·网络·测试工具·安全
JoshRen3 小时前
springboot之集成Elasticsearch
spring boot·后端·elasticsearch