🌺The Begin🌺点点关注,收藏不迷路🌺

前言

Elasticsearch 作为企业级搜索引擎,存储着日志、订单、用户、业务等核心敏感数据安全认证、权限控制是生产环境必不可少的环节。

从 ES 6.3+ 开始,官方内置了 Elastic Stack Security 安全模块,支持账号密码登录、角色权限、IP 白名单、TLS 加密、RBAC 权限模型等企业级安全能力。

本文从开启安全、身份认证、RBAC 权限模型、用户/角色/权限配置、索引级/操作级权限、实战案例全流程讲解,搭配流程图+可直接复制的命令,带你快速实现 ES 安全加固。

一、Elasticsearch 安全核心能力

  1. 身份认证:用户名/密码登录
  2. RBAC 权限模型:基于角色的权限控制
  3. 索引权限:允许/禁止读写某个索引
  4. 操作权限:禁止删除索引、禁止查看集群信息
  5. IP 白名单:仅允许指定IP访问
  6. TLS/SSL 加密:传输加密,防止数据窃听
  7. 审计日志:记录登录、操作行为

二、ES 权限认证整体流程图

开启ES Security安全模块

设置内置超级用户密码

创建自定义角色:配置索引+操作权限

创建用户:绑定角色

客户端使用用户名密码连接

ES认证用户→校验角色→校验权限

允许/拒绝访问


三、第一步:开启 Elasticsearch 安全认证

3.1 修改 elasticsearch.yml 配置

所有节点添加以下配置:

# 开启安全认证
xpack.security.enabled: true

# 开启单个节点也能启用安全(单节点测试)
discovery.type: single-node

# 开启HTTP加密访问(可选,生产建议开启)
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required

3.2 重启 Elasticsearch

3.3 自动生成内置用户密码(超级管理员)

ES 内置 5 个管理用户:elastic、kibana、logstash_system等。

执行命令自动生成密码

./bin/elasticsearch-setup-passwords auto

手动设置密码

./bin/elasticsearch-setup-passwords interactive

elastic 是超级管理员账号,拥有最高权限。


四、第二步:RBAC 权限模型(核心)

ES 使用 RBAC(基于角色的访问控制)

  1. 用户(User):登录账号
  2. 角色(Role):权限集合
  3. 权限(Privilege):索引权限 + 操作权限

关系:用户 → 绑定 → 角色 → 拥有 → 权限


五、第三步:权限粒度说明(生产常用)

ES 支持极细粒度权限控制

5.1 索引级别权限

  • read:只读
  • write:只写
  • delete:删除
  • create:创建文档
  • index_all:所有权限
  • view_index_metadata:查看索引元数据

5.2 集群级别权限

  • cluster_all:所有集群权限
  • monitor:查看集群状态
  • manage:管理集群
  • cluster:admin:超级操作

5.3 常用权限组合

  • 只读用户:read
  • 读写用户:read、write
  • 管理员:all
  • 日志查看员:仅读指定日志索引

六、第四步:实战:创建角色 + 用户 + 分配权限

6.1 创建角色(指定索引权限)

需求:创建一个只能访问 product_* 索引、只读权限的角色 product_read_role

请求方式:POST
地址:/_security/role/product_read_role

{
  "indices": [
    {
      "names": ["product_*"],
      "privileges": ["read"]
    }
  ]
}

6.2 创建用户并绑定角色

需求:创建用户 user1,密码 123456,绑定角色 product_read_role

地址:/_security/user/user1

{
  "password": "123456",
  "roles": ["product_read_role"],
  "full_name": "普通查询用户"
}

6.3 测试认证

未认证访问会直接报错:

{
  "error": "Unauthorized",
  "status": 401
}

账号密码访问:

http://user1:123456@localhost:9200/product_index/_search

七、第五步:生产常用权限场景实战

场景1:只允许查询,禁止修改/删除

{
  "indices": [
    {
      "names": ["log_*"],
      "privileges": ["read"]
    }
  ]
}

场景2:允许读写,但禁止删除索引

{
  "indices": [
    {
      "names": ["order_*"],
      "privileges": ["read","write"]
    }
  ]
}

场景3:超级管理员(仅限内部使用)

{
  "cluster": ["all"],
  "indices": [
    {
      "names": ["*"],
      "privileges": ["all"]
    }
  ]
}

场景4:禁止查看集群信息

{
  "cluster": ["monitor"]
}

八、第六步:Spring Boot 集成带密码的 ES

8.1 application.yml 配置

spring:
  elasticsearch:
    uris: http://localhost:9200
    username: user1
    password: 123456

8.2 无需修改代码,直接连接

Spring Data Elasticsearch 自动携带认证信息。


九、第七步:高级安全加固(生产必配)

9.1 IP 白名单

仅允许指定 IP 访问:

xpack.security.transport.filter.allow: [192.168.1.0/24]

9.2 禁用自动创建索引

action.auto_create_index: false

9.3 开启 TLS/SSL 传输加密

xpack.security.transport.ssl.enabled: true

9.4 密码策略

  • 定期修改
  • 长度 ≥ 12
  • 区分超级账号/普通账号

十、ES 认证权限执行流程图

客户端请求

携带用户名密码

ES验证身份合法性

认证成功?

返回401

获取用户绑定角色

校验角色权限

有权限?

返回403无权限

执行操作并返回结果


十一、常见问题

  1. 启动报错:security enabled,但未配置密码
    • 执行 setup-passwords 生成密码
  2. 连接 401 未授权
    • 检查账号密码是否正确
  3. 403 无权限
    • 角色权限未配置正确索引
  4. Kibana 无法连接
    • kibana.yml 配置 elasticsearch.usernamepassword

十二、总结

Elasticsearch 权限管理与认证核心流程非常清晰:

  1. 开启 xpack.security
  2. 设置超级管理员密码
  3. 基于 RBAC 模型:创建角色 → 分配权限 → 创建用户 → 绑定角色
  4. 客户端使用账号密码连接
  5. 生产环境配合 IP 白名单、TLS 加密

一套完整的 ES 安全体系可以保证:

  • 未认证用户无法访问
  • 普通用户无法越权操作
  • 敏感索引禁止删除/修改
  • 企业数据安全合规

是生产环境 必须开启 的核心功能!


在这里插入图片描述


🌺The End🌺点点关注,收藏不迷路🌺
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐