bigywater.tech
Elasticsearch · 166

Kibana 与 Elasticsearch 权限边界

本机真实查内置的kibana_system这个role的完整定义,发现62条index权限规则几乎全部对应Kibana内部系统索引,唯独一条对*通配符生效的规则只给了view_index_metadata和monitor这两个最小权限;真实建一个业务索引,用绑定kibana_system的用户测试发现查mapping和stats都成功,但用_search读取文档实际内容真实被拒绝,精确验证了Kibana系统账号能看到任意索引的结构和健康状况却读不到任何业务数据内容的真实权限边界。

查kibana_system的完整role定义
真实62条规则,唯独一条对*只给监控权限
绑定kibana_system的用户查业务索引mapping/stats
真实都成功
同一用户用_search读文档内容
真实直接被拒绝

做的事:本机真实查内置的kibana_system这个role的完整定义,看它的权限范围真实有多大

代码GET /_security/role/kibana_system

验证:真实数出来62条index权限规则,几乎全部精确对应.kibana、.fleet、.ml这些Kibana内部系统索引,唯独有一条真实是对星号*通配符生效的

实测 · 本机 Elasticsearch 8.15.0 执行输出
kibana_system真实的index权限规则共62条,节选:
→ [".kibana*",".reporting-*"] -> ["all"]
→ [".monitoring-*"] -> ["read","read_cross_cluster"]
→ [".fleet-agents*"] -> ["all"]
→ ...(真实还有近60条都是类似的具体系统索引前缀)
→ ["*"] -> ["view_index_metadata","monitor"]   ← 唯独这一条真实对所有索引生效

这个真实数据揭示了kibana_system这个内置账号权限设计的核心思路:对Kibana自己内部需要完整读写的那些系统索引(.kibana*、.fleet*、.ml*等),真实给了all这种完整权限;但对集群里任何其他索引(包括真实业务数据用的索引),真实只给了view_index_metadata和monitor这两个非常有限的权限——意味着Kibana的这个系统账号真实只能看到"这个索引长什么样、健康状况如何",看不到真实的业务数据内容。

真实建一个普通的业务索引,写入一条数据,拿绑定kibana_system的真实用户去测mapping、stats和search这三种访问方式

代码真实写入business_data索引: {"secret":"classified business data"} 真实建用户kibanasvc绑定kibana_system这个role 真实分别测: GET /business_data/_mapping GET /business_data/_search GET /business_data/_stats

验证:查mapping和stats真实都成功了,但用_search去读这条文档的实际内容,真实直接被拒绝

实测 · 本机执行输出
GET /business_data/_mapping → 真实成功,返回了字段结构
GET /business_data/_stats   → 真实成功,返回了监控统计数据

GET /business_data/_search  → 403 security_exception:
  "action [indices:data/read/search] is unauthorized for user [kibanasvc]
   with effective roles [kibana_system] on indices [business_data],
   this action is granted by the index privileges [read,all]"
这组真实对比精确验证了Kibana与Elasticsearch之间真实的权限边界:Kibana后台真实用这个kibana_system账号去连Elasticsearch,这个账号真实能看到集群里任何索引的结构、健康状况、监控指标(这正是Kibana的索引管理页面、监控面板这类功能真实依赖的权限),但真实读不到任何一条业务索引里具体的文档内容——如果真实希望Kibana的使用者能在Discover页面里查看某个索引的数据,必须真实给登录Kibana的那个用户单独配上对应索引的read权限,不能指望kibana_system这个系统级账号本身的权限真实蹭出额外的数据访问能力。这是一条真实刻意设计出来的边界:Kibana这个应用本身运行所需的权限,跟真实使用Kibana的人能看到哪些业务数据,是两套真实完全独立的权限体系。

分步演示:从kibana_system角色定义里唯一对*通配符生效的最小权限规则,到mapping/stats成功而search被拒绝的真实边界

每一步都是本文在一个真实独立搭建、开启security的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。

kibana_system真实能看到任何索引长什么样,但真实读不到任何业务数据的具体内容
这一步新验证的Kibana权限边界场景

    本文用到的工具

    • 真实独立搭建的Elasticsearch 8.15.0节点(开启security,测完即销毁)
    • 真实的内置 kibana_system role 定义
    京ICP备2026067502号-1京公网安备11010502063487号