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

整理完毕,完结撒花~🌻

相关推荐
M78佐菲8 小时前
ARM学习笔记(1)
linux·arm开发·笔记·嵌入式硬件·学习
红姐跨境书8 小时前
从零打造高性能 API 网关: Go 语言中的双缓冲 Dynamic Config 最佳实践
安全
无敌贵点大王10 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
是翎12 小时前
深度长文|2026产品经理AI实践手册
人工智能·深度学习·学习·自然语言处理·数据挖掘
Linux-lucky12 小时前
32-38-Linux学习之旅之MySQL综合
linux·运维·学习·mysql·ubuntu
知识分享小能手13 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
迪康Defender13 小时前
终端安全实战:如何高效解决企业U盘泄密与管控难题
运维·网络·安全·web安全·终端安全管理
网安小学生(兼顾数据库版)14 小时前
固件+软件供应链:ONEKEY+Mend如何实现全链路安全覆盖
网络·安全·web安全
vx-程序开发14 小时前
【计算机毕设】django校园跑腿服务系统83141
java·数据库·vue.js·spring boot·spring·elasticsearch·django
珠海西格电力15 小时前
零碳园区管理系统“智慧大脑”功能对园区运营成本的影响有哪些?
大数据·人工智能·安全·系统架构·能源