上一章节(文章五: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.103、192.168.86.104这两个节点接入集群。
xpack.security.transport.filter.deny
- 黑名单规则:拒绝列表中的 IP 与本节点建立内部通信。
- 示例中拒绝:
192.168.86.1、192.168.86.105、192.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 |
过期时间 | 非必填 | 格式如 1d、7d、30d,不写代表永久有效 |
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博客 按着这个博客进行一下设置就可以了。