生产ES环境如何申请指定索引模式下的数据查看权限账号

一、背景描述

早上某事业部同事联系到我,说他们 AI 程序应用 P 版日志放在了生产 XXX 空间下,希望能帮忙创建一个公共账户,拥有只读取 XXX 命名空间下 XXX_AI 索引模式的权限,暂时放开给 AI 部门相关同事使用。

二、操作过程

之前都是给某个账号设置查询某个空间下所有索引的访问权限,现在要指定索引索引,该如何实现呢。

查询了相关资料,操作如下:

2.1 创建角色

这里先解释一个概念,什么是 ES 的角色。

ES 中角色的概念您可以将其理解为 一个权限的集合 或 一个权限的蓝图。它本身并不与任何用户直接关联,而是定义了"什么操作可以在什么资源上执行"。

角色的核心目的是实现权限的抽象和复用。您不需要为每个用户单独配置一堆零散的权限,而是创建一个角色(例如 log_reader, db_writer),然后将这个角色分配给需要相同权限的所有用户。

一个 ES 角色主要由几大块权限定义构成:集群权限 (Cluster Privileges)、索引权限 (Index Privileges)、应用权限 (Application Privileges)、运行身份 (Run As)、元数据 (Metadata)等。

总结就是:角色(Role)是 Elasticsearch 安全体系的枢纽。 它就像是一个权限容器,将集群、索引、应用等不同维度的权限打包在一起。用户(User) 通过被分配一个或多个角色来获得实际的权限,从而能够与 ES 集群和 Kibana 进行交互。

如下是创建角色命令及详细注释

复制代码
PUT /_security/role/xxx_ai_space_restricted_user
{
  // 集群权限配置:定义角色在整个Elasticsearch集群级别的操作权限
  // 空数组表示此角色没有任何集群级别的特殊权限
  "cluster": [],
     // 索引权限配置:定义角色对特定索引的操作权限
  "indices": [
    {
      // 指定此权限规则适用的索引名称模式
      // 可以使用通配符 * 来匹配多个索引
      // 此例中,角色可以访问所有以 'xxx_ai' 开头的索引
      "names": ["xxx_ai*"],
      // 定义在此索引上允许的操作权限 
      "privileges": [
        "read",                    // 复合权限:包含读取操作如get、search等
        "view_index_metadata"     // 允许查看索引的元数据(映射、设置等)
     ]    
      // 可选的更细粒度控制:
      // "field_security": {...} 可限制只能访问特定字段
      // "query": {...} 可限制只能查询符合特定条件的文档 
    }
     // 可以添加更多索引权限规则,以应对不同的索引模式
  ],
  // 应用程序权限配置:定义角色对集成应用程序(如Kibana)的访问权限
  "applications": [
    {
      // 指定应用程序标识符
      // 'kibana-.kibana' 是Kibana应用程序的标准标识符
      "application": "kibana-.kibana",
      // 定义在Kibana中允许的功能特性权限
      "privileges": [
        "feature-discover.read",    // 允许使用Discover功能进行数据探索
        "feature-dashboard.read",   // 允许查看仪表板
        "feature-visualize.read",   // 允许查看可视化图表
        "feature-savedObjectsManagement.read"   // 允许查看和管理已保存对象
       // 注意:这些是Kibana功能特性权限,不是Elasticsearch索引权限
       // 更多功能特性可在Kibana权限设置中查看
      ],
      // 指定这些应用程序权限适用的资源范围
      // 这是实现Kibana多租户空间隔离的关键配置
      // "space:xxx" 表示这些权限仅适用于名为'xxx'的Kibana空间
      // 如果设置为"*"则表示适用于所有空间
      "resources": ["space:xxx"]
    }
     // 可以添加更多应用程序权限规则,以授予其他应用程序的访问权
  ]
    // 可选字段:
    // "run_as": [] - 允许此角色代表其他用户执行操作(高级功能)
    // "metadata": {} - 用于存储角色的元数据信息(如描述、创建者等)
    // "transient_metadata": { "enabled": true } - 临时元数据配置
}

以上命令该如何操作呢,以上命令可以通过 curl 命令登录 ES 服务器执行,也可以在 Kibana 开发工具上执行,这里使用 Kibana 开发工具来执行,首先登录账号要有足够的权限可以执行上述命令。

登录 Kibana 管理界面,在开发工具下执行:

复制代码
PUT /_security/role/xxx_ai_space_user
{
  "cluster": [],
  "indices": [
    {
      "names": ["xxx_ai*"],
      "privileges": ["read", "view_index_metadata"]
    }
  ],
  "applications": [
    {
      "application": "kibana-.kibana",
      "privileges": [
        "feature-discover.read",
        "feature-dashboard.read", 
        "feature-visualize.read",
        "feature-savedObjectsManagement.read" 
      ],
      "resources": ["space:xxx"]
    }
  ]
}

执行命令返回 200-OK,表示执行成功。

2.2 创建用户

上面创建了角色后,接下来就要创建一个账号,让这个账号拥有上述创建的角色权限。

可以有如下几种方式来创建:

**方式一)**使用管理员账号登录 Kibana,然后依次打开 Stack Management --> User(用户),按照以下方式来创建,设置需要的相关信息,并选择之前创建的角色和 Kibana 角色。

然后点击"创建用户"按钮,就创建了相应用户并设置了权限。

方式二)使用开发工具来创建,使用管理员账号,登录开发工具,执行如下命令:

复制代码
PUT /_security/user/xxx_ai_reader
{
  "password": "set_your_strong_password_here",
  "roles": ["xxx_ai_space_user", "kibana_user", "system_kibana"],
  "full_name": "xxx_ai_reader",
  "email": ""
}

方式三) 通过curl 命令来创建

登录 ES 服务器,早 esuser 用户下执行

复制代码
curl -u elastic:elastic密码 -X PUT "http://<your-es-host>:9200/_security/user/xxx_ai_reader" \
-H 'Content-Type: application/json' \
-d '
{
  "password": "set_your_strong_password_here",  # 设置密码
  "roles": ["xxx_ai_index_reader", "kibana_system", "system_kibana"],  # 分配角色
  "full_name": "xxx_ai_reader",  # 用户全名
}
'

三、验证测试

使用上述创建的 xxx_ai_reader 用户,登录 Kibana, 选择对应空间,然后查看 xxx_ai 前缀索引信息,如下所示:

可以正常看到 XXX_ai 开头的前缀索引的相关日志信息。

再试试能否查看其它非 xxx_ai 前缀的索引日志信息

可以看到无法查看非 xxx_ai 前缀的索引日志信息。

四、附录

当前 ES 生产集群有很多空间,目前我还没找到如何设置让该用户登录后就直接打开其所在的空间,这块等我有时间再摸索下,到时补充下。

相关推荐
Sirius Wu2 小时前
大数据平台ETL任务导入分库分表数据
大数据·数据仓库·etl
Elasticsearch3 小时前
使用 LLMs 快速构建 Elastic connector:一个 Crawl4AI 教程
elasticsearch
沐风清扬3 小时前
SpringAI1.0.1实战教程:避坑指南25年8月最新版
java·大数据·elasticsearch·搜索引擎·springai
IT研究室3 小时前
大数据毕业设计选题推荐-基于大数据的餐饮服务许可证数据可视化分析系统-Spark-Hadoop-Bigdata
大数据·hadoop·spark·毕业设计·源码·数据可视化·bigdata
电商数据girl4 小时前
Python 爬虫获得淘宝商品详情 数据【淘宝商品API】
大数据·开发语言·人工智能·爬虫·python·json·php
W-GEO4 小时前
GEO优化策略:AI搜索引擎的“动态响应”与GEO优化公司的实时优化能力
大数据·人工智能·chatgpt
TDengine (老段)5 小时前
TDengine IDMP 应用场景:电动汽车
大数据·数据库·物联网·ai·时序数据库·iot·tdengine
技术与健康11 小时前
LLM实践系列:利用LLM重构数据科学流程03- LLM驱动的数据探索与清洗
大数据·人工智能·重构
TDengine (老段)12 小时前
TDengine IDMP 应用场景:工业锅炉监控
大数据·数据库·物联网·信息可视化·时序数据库·tdengine