文章六:ElasticSearch 集群通信安全权限

上一章节(文章五:Elasticsearch安全通信-CSDN博客)介绍了如何通过自定义证书文件,构建具备通信安全保障的 Elasticsearch 集群;本章则聚焦于数据权限控制,重点讲解索引增删改查等操作的精细化权限配置方法。

1、掌握 Elasticsearch 集群通信IP限制

上一个章节中我们可以通过创建证书的时候,规定哪些ip的节点可以加入到我们的集群中,这节课我们使用动态配置的方式(默认是收费功能),限制集群的通信。该规则仅作用于节点间的 transport 端口(9300),不影响 HTTP 端口(9200)的客户端访问。

cpp 复制代码
PUT _cluster/settings
{
  "transient": {
    "xpack.security.transport.filter.enabled": true,
    "xpack.security.transport.filter.allow": [
      "192.168.86.103",
      "192.168.86.104"
    ],
    "xpack.security.transport.filter.deny": [
      "192.168.86.1",
      "192.168.86.105",
      "192.168.86.106"
    ]
  }
}
请求方式与路径

PUT _cluster/settings

  • 这是 Elasticsearch 的集群设置更新 API,用于动态修改集群级别的配置,无需重启节点即可生效。
transient 字段

表示这些设置是临时生效的

  • 临时设置会在集群重启或节点重启后失效,不会写入配置文件。
  • 与之相对的是 persistent(永久设置),会持久化保存。
xpack.security.transport.filter.enabled: true
  • 开启 X-Pack 安全模块的传输层 IP 过滤功能
  • 作用:控制 Elasticsearch 节点间(transport 端口,默认 9300)的内部通信,仅允许 / 拒绝特定 IP 的节点接入集群。
xpack.security.transport.filter.allow
  • 白名单规则:仅允许列表中的 IP 与本节点建立内部通信。
  • 示例中允许:192.168.86.103192.168.86.104 这两个节点接入集群。
xpack.security.transport.filter.deny
  • 黑名单规则:拒绝列表中的 IP 与本节点建立内部通信。
  • 示例中拒绝:192.168.86.1192.168.86.105192.168.86.106 这三个 IP 的节点接入集群。

2、掌握 Elasticsearch 集群访问IP限制

当前的规则就是限制的http层面的连接的ip限制。 如果需要控制客户端通过 9200 端口访问集群,可使用对应的 HTTP 过滤配置:

cpp 复制代码
PUT _cluster/settings
{
  "transient": {
    "xpack.security.http.filter.enabled": true,
    "xpack.security.http.filter.allow": ["192.168.86.1"],
    "xpack.security.http.filter.deny": ["192.168.86.100"]
  }
}

3、掌握 Elasticsearch 集群操作用户权限配置

基本命令的功能

接口地址 作用 权限类型 能否自定义 / 修改 适用场景 核心返回字段 & 说明
GET _security/privilege 查询应用级权限包 自定义应用权限(Application Privilege) ✅ 可新增、编辑、删除 管控 Kibana 界面、自研业务系统的功能操作(页面、按钮、UI 功能) 1. application:归属应用(如 kibana)2. name:权限包名称3. actions:具体可执行的 UI 操作
GET _security/privilege/_builtin 查询系统内置基础权限 原生底层权限 ❌ 系统内置,无法修改、删除、新增 管控 ES 集群、索引、远程集群的数据与运维操作(读写、管理、监控等) 1. cluster:集群级别权限(全集群操作)2. index:索引级别权限(数据读写、索引管理)3. remote_cluster:跨集群访问权限

配置角色:

我们使用kibana可视化的方式创建角色,创建了一个只可以读取索引kibana_sample_data_ecommerce索引元信息的角色。对于kibana中,他只是可以使用dev_tool功能。

配置项 作用 默认状态
Role name 角色名称,用于绑定用户 手动填写
Cluster privileges 集群级操作权限(监控、安全管理等) 无任何权限
Run As privileges 身份模拟(代其他用户操作) 不可使用
Index privileges 对指定索引的读写、管理权限 无任何权限

创建用户:

权限管理生效展示:

只是可以查询索引的元数据,没有别的任何权限

通过RestAPI创建角色:

cpp 复制代码
PUT _security/role/kibana_sample_data_ecommerce_search
{
  "cluster": [],
  "indices": [
    {
      "names": [
        "kibana_sample_data_ecommerce"
      ],
      "privileges": [
        "view_index_metadata",
        "read"
      ],
      "field_security": {
        "grant": [
          "*"
        ],
        "except": []
      },
      "allow_restricted_indices": false
    }
  ],
  "applications": [
    {
      "application": "kibana-.kibana",
      "privileges": [
        "feature_dev_tools.all"
      ],
      "resources": [
        "space:default"
      ]
    }
  ],
  "run_as": [],
  "metadata": {},
  "transient_metadata": {
    "enabled": true
  }
}

通过RestAPI创建用户:

cpp 复制代码
PUT _security/user/lisi
{
  "password": "123456",
  "roles": [
    "kibana_sample_data_ecommerce_search"
  ],
  "full_name": "lisi",
  "email": "admin@test.com",
  "metadata": {},
  "enabled": true
}

Api_key

API Key 是 Elasticsearch 提供的一种轻量级、安全的程序认证方式 ,主要用于服务、脚本、应用程序对接 ES,替代传统的用户名 + 密码认证,Basic 免费版即可使用,不需要付费订阅。它由系统自动生成加密密钥,权限可以独立限制、支持设置过期时间,并且可以随时撤销,安全性远高于直接使用账号密码,非常适合自动化脚本、数据采集程序、后端服务等场景使用。

参数 含义 是否必填 说明
name API Key 名称 必填 用于标识、管理密钥,建议见名知意
expiration 过期时间 非必填 格式如 1d7d30d,不写代表永久有效
role_descriptors 独立权限配置 非必填 给密钥单独设置权限,不填则继承当前用户的全部权限
id 密钥唯一 ID 系统生成 创建后自动返回,用于撤销 / 查询密钥
api_key 密钥明文 系统生成 仅展示一次,必须保存
encoded 最终使用密钥 系统生成 直接放在请求头里使用的字符串
cpp 复制代码
POST /_security/api_key
{
  "name": "自定义名称",
  "expiration": "过期时间",
  "role_descriptors": {}
}

使用kibana创建api_key

4、掌握 Elasticsearch 数据操作用户权限配置

query进行权限控制:

上面再创建角色的时候只是通过kibana的可视化功能创建了一个,但是实际上,如果使用DSL的方式创建的时候可以执行一下过滤的条件,也就是增加query的方式,这样的话可以更好的管理角色的权限,

cpp 复制代码
PUT _security/role/kibana_sample_data_ecommerce_search
{
  "cluster": [],
  "indices": [
    {
      "names": [
        "kibana_sample_data_ecommerce"
      ],
      "privileges": [
        "view_index_metadata",
        "read"
      ],
      "query": {
        "bool": {
          "filter": [
            {
              "term": {
                "day_of_week": "Monday"
              }
            }
          ]
        }
      }, 
      "field_security": {
        "grant": [
          "*"
        ],
        "except": []
      },
      "allow_restricted_indices": false
    }
  ],
  "applications": [
    {
      "application": "kibana-.kibana",
      "privileges": [
        "feature_dev_tools.all"
      ],
      "resources": [
        "space:default"
      ]
    }
  ],
  "run_as": [],
  "metadata": {},
  "transient_metadata": {
    "enabled": true
  }

}

字段级别的权限控制

在上面的配置中,其实显示了字段级别权限的控制了,下面的案例中展示了当前角色只可以看到其中一个字段。

cpp 复制代码
 "field_security": {
        "grant": [
          "customer_full_name"
        ],
        "except": []
      },

有时间的话大家可以看一下,就在我们查看mapping的时候,也只是可以看到这一个属性的类型什么的。

5、掌握 Elasticsearch 集群审计日志配置

Elasticsearch安全审计日志设置与最佳实践_es开启审计日志-CSDN博客 按着这个博客进行一下设置就可以了。

相关推荐
vensli1 小时前
消息跨端架构演进:基于 C++ 的多端一致性研发框架实践
java·人工智能·软件工程·安卓
云烟成雨TD1 小时前
Spring AI Alibaba 1.x 系列【70】思考模式
java·人工智能·spring
小脑斧1231 小时前
AI Skills 全链路自动化运营实践:抖音热点、小红书种草与文生图一体化方案
大数据·人工智能·小红书·skills·自动化运营
白露与泡影1 小时前
告别OOM焦虑:Flink 内存模型原理与诊断调优
大数据·flink
瑞雪兆丰年兮1 小时前
[从0开始学Java|第十六、十七天]项目阶段(拼图小游戏)
java·开发语言
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第85题】【Mysql篇】第15题:MySQL 的事务中,幻读是怎么解决的?
java·开发语言·数据库·mysql·面试
清水白石0081 小时前
Python 变量的本质:从“盒子思维”到“引用思维”,彻底理解赋值到底发生了什么
java·python·ajax
Solis程序员1 小时前
TreeMap 核心原理与实战
java·数据结构·算法
一 乐1 小时前
在线考试|基于Springboot的在线考试管理系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·毕设·在线考试管理系统