Elasticsearch:将文档级安全性 (DLS) 添加到你的内部知识搜索

作者:来自 Elastic Sean Story

你的企业很可能淹没在内部数据中。

你拥有问题跟踪、笔记记录、会议记录、维基页面、视频录制、聊天以及即时消息和私信。 并且不要忘记电子邮件!

难怪如此多的企业都在尝试创造工作场所搜索体验 - 为员工提供集中、一站式的内部信息搜索服务。

通过 Elastic 的连接器(connectors)目录,这相对容易做到。 但是,当你将所有数据编入索引并准备好进行搜索后,如何确保其安全? 毕竟,苔丝(来自工程部门)不应该查看鲍勃(来自人力资源部门)关于绩效评估的笔记。 你如何确保访问此统一搜索栏的每个单独用户都只能获得他们有权查看的数据的独特视图?

进入文档级安全性 (document level security - DLS)。

背景

关注 Elasticsearch 一段时间的人可能已经意识到,DLS 已经成为 Elasticsearch 的一项功能相当长一段时间了。 它是用户授权(user authorization)这一更大主题的一部分,而且确实非常简单。 你将元数据嵌入到 Elasticsearch 文档中,然后创建一个 Elasticsearch 查询,根据描述用户授权的文档元数据进行过滤。 该查询用于创建 Elasticsearch 角色。

在查询时,当搜索用户进行身份验证时,他们的角色(如果有)将被识别,并且嵌入的查询过滤器(如果有)将应用于他们的搜索。

让我们看一个简单的例子。 假设我们有两个文档:

PUT example/_doc/1
{"my-data": true,"text": "This data is mine"
}PUT example/_doc/2
{"my-data": false,"text": "This data belongs to someone else"
}

仅获取我的数据的查询是:

GET example/_search
{"query": {"term": {"my-data": {"value": true}}}
}

该查询可以嵌入到角色中,例如:

POST /_security/role/my_role
{"indices": [{"names": [ "example" ],"privileges": ["read"],"query": {"term": {"my-data": {"value": true}}}}]
}

注意:我们必须为我们的 Elasticsearch 集群配置安全才可以顺利地运行上面的命令。

因此,如果我的用户被分配角色 my_role,如果我这样做:

GET example/_search

我们可以使用如下的命令来进行验证:

curl -k -XGET -u liuxg:password "https://localhost:9200/example/_search" -H "kbn-xsrf: reporting"

从上面的输出中,我们可以看到只有文档 1 被搜索到。文档 2 没有被搜索到。

虽然这个例子在理论上很简单,但它有相对较多的移动部件。

  • 你必须确保文档包含相关元数据("my-data": true 与 "my-data": false)
  • 你必须相信这些文档中的元数据是准确的
  • 你必须使用精心设计的 Elasticsearch 查询为每个搜索用户创建一个角色
  • 你必须确保您创建的每个角色在查询时正确映射到正确的用户
  • 你必须确保上述所有内容均保持最新。

最后一项尤其困难。 当你企业中的人员加入、离开、切换团队或晋升时,这需要进行更改 - 可能会更改你的(元)数据和你的角色。 如果你添加支持共享或访问编辑的数据源,你肯定需要确保你的(元)数据保持最新。

使用 Elastic 连接器

连接器文档级安全性基于 Elasticsearch DLS 构建。 对于许多连接器来说,这包括同步相关元数据和角色描述符以支持 DLS。 这会导致内容索引中的文档自动包含元数据(通常在 _allow_access_control 字段中)来描述有权搜索该文档的人员/组,以及特殊 .search-acl-filter-<index 中的文档 -name> 索引,包含为给定搜索用户构建具体角色或 API 密钥所需的角色描述符 JSON。

你可以在此处找到哪些连接器具有可用的 DLS。 在本博客中,我们将引用一个使用 Sharepoint Online 连接器的示例应用程序。 这是我们启用 DLS 的第一个连接器,但该示例可以轻松适应任何启用 DLS 的连接器。

如果你的连接器符合条件,并且你拥有 Platinum+ Elasticsearch 许可证,则可以通过连接器配置页面上的开关启用 DLS。

从那里开始,只需运行完全同步和访问控制同步,Elasticsearch 将获得所需的所有数据。

一个例子

然后什么?

一旦 Elasticsearch 拥有角色描述符和文档数据以及这些角色过滤器的足够元数据,你就可以构建安全的搜索体验。

我们已经构建了一个示例知识搜索应用程序,我们将在本博客中使用它,欢迎你查看其源代码。 但是,我们确实想强调,这只是一个示例 - 它尚未准备好在生产中自行运行。 请运用良好的判断力,不要运行你未阅读或不理解的代码。

该应用程序的架构非常简单。

它由 Flask 后端和 React 前端组成。 后端配置了环境变量以与 Elasticsearch 建立连接。

export ELASTICSEARCH_URL=...
export ELASTIC_USERNAME=...
export ELASTIC_PASSWORD=...

使用此连接,后端提供三个端点:

  • GET /api/persona 此端点列出连接器在访问控制同步期间找到的 “身份” 或 “角色” 的标识符。 前端使用此列表填充角色下拉列表,以便演示搜索结果如何根据所选角色而变化。
  • GET /api/indices 该端点列出了你的搜索应用程序中已包含的索引。 前端使用此列表来允许你选择要搜索的列表。
  • GET /api/api_key?persona=<persona> 此端点根据所选角色创建并返回 Elasticsearch API 密钥。 在生产系统中,角色不会是请求参数,而是从身份验证凭据中推断出来。 然后前端使用此 API 密钥向 Elasticsearch 发出搜索请求。

注意事项

如上所述,该示例不应在生产中使用。 差距包括:

  • 它不实现身份验证。 生产就绪的应用程序需要一种方法让用户进行身份验证并验证其身份,而不是从下拉列表中选择用户。
  • 它不使用 SSL/TLS。 后端当前通过 HTTP(而不是 HTTPS)将 Elasticsearch API 密钥传输到前端。
  • 前端直接向 Elasticsearch 发出 /_search 请求。 根据生产用例,你可能不希望像这样向最终用户公开 Elasticsearch。 相反,建议从前端向后端发出请求(同样,实施身份验证),然后让后端将这些请求转换为 Elasticsearch 查询。

源代码

下面我们链接到使用 DLS 实现搜索所需的关键代码片段。

创建经过身份验证的用户的角色描述符

代码链接

identity = elasticsearch_client.get(index=identities_index, id=persona)permissions = identity["_source"]["query"]["template"]["params"]["access_control"]role_descriptor = {"dls-role": {"cluster": ["all"],"indices": [{"names": [search_app_name],"privileges": ["read"],"query": {"template": {"params": {"access_control": permissions},"source": """{"bool": {"should": [{"bool": {"must_not": {"exists": {"field": "_allow_access_control"}}}},{"terms": {"_allow_access_control.enum": {{#toJson}}access_control{{/toJson}}}}]}}""",}},}],"restriction": {"workflows": ["search_application_query"]},}}

你可能会注意到,此角色描述符中的查询模板比本博客前面提供的简单示例要复杂得多。 这个查询做了几件事:

  1. 它使用查询模板,而不是显式查询。 这使得在阅读时更容易将一长串权限列表与查询语法分开。
  2. 它使用布尔查询。 这使我们能够结合多个逻辑检查。
  3. 它授予对不包含 _allow_access_control 字段的任何文档的访问权限
  4. 它授予对 _allow_access_control 字段包含此用户 permissions 中找到的值的文档的访问权限

从该角色描述符创建 API 密钥

代码链接

api_key = elasticsearch_client.security.create_api_key(name=search_app_name+"-internal-knowledge-search-example-"+persona, expiration="1h", role_descriptors=role_descriptor)return {"api_key": api_key['encoded']}

使用 API 密钥搜索

代码链接

const apiKey = searchPersonaAPIKey;const client = SearchApplicationClient(appName,searchEndpoint,apiKey,{facets: {description: {type: "text",},},},{disableCache: true,});const sortArray = Object.values(sorts).map((sort) => ({[sort.title]: sort.sortDirection,}));const rawResults = await client().query(query).setSort(sortArray).setPageSize(10).addParameter("indices", indexFilter).search();const searchResults = rawResults.hits.hits.map((hit: any) => {return mapHitToSearchResult(hit);});

原文:Adding Document Level Security (DLS) to your Internal Knowledge Search — Elastic Search Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661834.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react 之 UseReducer

UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数&#xff0c;根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…

【飞书小技巧】——飞书文档转 markdown 详细教程

飞书文档转 markdown 详细教程 基于项目:https://github.com/Wsine/feishu2md 如何使用 在线版 访问 https://feishu2md.onrender.com/ 粘贴文档链接即可&#xff0c;文档链接可以通过 分享 > 开启链接分享 > 复制链接 获得。 点击下载之后,会提示 Please wait. It ma…

2024/2/1学习记录

echarts 为柱条添加背景色&#xff1a; 若想设置折线图的点的样式&#xff0c;设置 series.itemStyle 指定填充颜色就好了&#xff0c;设置线的样式设置 lineStyle 就好了。 在折线图中倘若要设置空数据&#xff0c;用 - 表示即可&#xff0c;这对于其他系列的数据也是 适用的…

【C/C++】C/C++编程——整型(二)

在 C 中&#xff0c;整型数据可以分为有符号数&#xff08;Signed&#xff09;和无符号数&#xff08;Unsigned&#xff09;&#xff0c;这两种类型主要用于表示整数值&#xff0c;但它们在表示范围和用途方面有所不同。默认情况下&#xff0c;整数类型如 int、short、long 都是…

中科大计网学习记录笔记(三):接入网和物理媒体

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

基于tidevice实现iOS app自动化使用详解

目录 1、IOS自动化工具概述 2、tidevice工具的原理和使用 2.1、tidevice的原理 2.2、tidevice实现的功能 2.3、tidevice的安装 2.4、tidevice的使用 2.4.1、设备管理 1、查看已连接的设备的列表 2、检测设备连接状态 3、等待设备连接&#xff0c;只要有就连接就结束监…

2024-01-06-AI 大模型全栈工程师 - 如何训练百亿参数大模型

摘要 2024-01-06 周六 杭州 晴 本节内容: 讲座模式&#xff0c;学习大模型训练的相关流程。 课程内容 1. Transformer 回顾 2. 模型架构-生成式 3. 预训练数据的构建 4. 中文字典的构建 4. 预训练目标的构建 5. 预训练相关-预训练策略 6. 预训练相关-并行化训练 7. 预训练…

搭建高效企业培训平台:教育系统源码开发详解

为了更好地满足企业培训的需求&#xff0c;许多组织纷纷转向数字化教育&#xff0c;搭建高效的企业培训平台成为当务之急。本篇文章&#xff0c;小编将为您讲解教育系统源码的开发细节&#xff0c;为搭建一个功能强大、灵活高效的企业培训平台提供详尽的指南。 一、教育系统的…

Django响应(一)

一、HttpResponse与JsonResponse 1.1、HttpResponse 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/request-response/#django.http.HttpResponse 返回给浏览器端的响应对象 from django.http import HttpResponse response = HttpResponse("Heres the text o…

程序的内存模型

师从黑马程序员 内存分区模型 内存大方向划分为4个区域 1、代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统管理的 2、全局区&#xff1a;存放全局变量环和静态变量以及常量 3、栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#…

H12-811_503

503.如下图所示&#xff0c;下列说法正确是&#xff1f;( ) A.主机A和主机B的广播地址相同 B.主机A可以ping通主机B C.主机A和主机B不能获取对方的MAC地址 D.主机A的ARP缓存中存在如下条目10.0.12.5 MAC-B 答案&#xff1a;C 注释&#xff1a; 两个主机IP地址的网…

四大组件 - ContentProvider

参考&#xff1a;Android 这 13 道 ContentProvider 面试题&#xff0c;你都会了吗&#xff1f; 参考&#xff1a;《Android 开发艺术探索》 第 9.5 节&#xff08;ContentProvider 的工作过程&#xff09; 参考&#xff1a;内容提供者程序 参考&#xff1a;<provider>&g…

Nucleosome, Recombinant Human, H2BK120ub1 dNuc, Biotinylated

EpiCypher&#xff08;国内授权代理商欣博盛生物&#xff09;是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher生产的在E. coli中表达的重组人单核小体(组蛋白H2A、H2B、H3和H4各2个;accession numbers:H2A-P04908;H2B-O60814;H3.1-P68431;H4…

SpringMVC处理ajax请求之@ResponseBody注解,将后端数据响应到浏览器

上一篇文章讲到SpringMVC处理ajax请求用到的RequestBody注解SpringMVC处理ajax请求&#xff08;RequestBody注解&#xff09;&#xff0c;ajax向后端传递的数据格式详解-CSDN博客&#xff0c;这个注解帮我们解决了如何将客户端的数据通过json数据传递到服务器&#xff0c;简单说…

数据探索与可视化:可视化分析数据关系-中

目录 一、前言 二、介绍 Ⅰ.一个分类变量和一个连续变量 Ⅱ.两个分类变量的一个连续变量 Ⅲ.两个分类变量和两个连续变量 Ⅳ.一个分类变量和多个连续变量 ①.平行坐标轴 ②.矩阵散点图 三、结语 一、前言 在做数据分析的时候&#xff0c;很少会遇到连续变量和分类变量…

PyTorch如何支持 GPU 加速计算

在 PyTorch 中&#xff0c;torch.Tensor 是核心的数据结构&#xff0c;它与 NumPy 的 ndarray 类似&#xff0c;用于存储和操作多维数据。但与 NumPy 不同的是&#xff0c;PyTorch 的 Tensor 除了能在 CPU 上运行之外&#xff0c;还能够无缝地利用 GPU 进行计算加速。 GPU 加速…

读千脑智能笔记01_新皮质

作者简介 1988年至1992年&#xff0c;创造了平板电脑GridPad&#xff0c;它属于第一批平板电脑 1992年&#xff0c;成立了Palm公司&#xff0c;之后在长达10年的时间内&#xff0c;设计了一些最早的掌上电脑和智能手机&#xff0c;如PalmPilot和Treo 在2002年创立了红木神经科学…

《HTML 简易速速上手小册》第9章:HTML5 新特性(2024 最新版)

文章目录 9.1 HTML5 新增标签和属性9.1.1 基础知识9.1.2 案例 1&#xff1a;创建一个结构化的博客页面9.1.3 案例 2&#xff1a;使用新的表单元素创建事件注册表单9.1.4 案例 3&#xff1a;创建一个具有高级搜索功能的搜索表单 9.2 HTML5 表单增强9.2.1 基础知识9.2.2 案例 1&a…

VScode注释快捷键,RStudio注释快捷键, Texmaker注释快捷键

VScode&#xff1a;一款界面简单的代码编辑器&#xff1b;RStudio: R语言的IDE&#xff0c;包含代码编辑器&#xff0c;运行&#xff0c;绘图窗口等&#xff1b;Texmaker&#xff1a;Latex编译器&#xff08;编辑编译&#xff09;&#xff0c;界面简单&#xff0c;个人认为比Te…

揭秘远程控制APP的便捷之美!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…