文章六: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博客 按着这个博客进行一下设置就可以了。

相关推荐
极光代码工作室12 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
hyf32663312 小时前
泛程序:从零开始搭建稳定程序项目框架
运维·服务器·爬虫·百度·seo
Leighteen12 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
事变天下12 小时前
迈瑞的足球之夏:从一次救援到全球守护
大数据·科技
NiceCloud喜云13 小时前
海外云服务器怎么选?适用场景、价格和避坑经验总结
运维·服务器
名字还没想好☜13 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine
中微极客13 小时前
多智能体编排实战:CrewAI vs AutoGen(2026版)
大数据·网络·人工智能
圆山猫13 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
caishenzhibiao13 小时前
期货先行者主图 同花顺期货通指标
java·c语言·c#
西邮彭于晏14 小时前
图文详解:Git分支创建、合并与冲突解决|新手零门槛完整教程
大数据·git·elasticsearch