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.rhkb.cn/news/249802.html

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

相关文章

【知识点】Java常用

文章目录 基础基础数据类型内部类Java IOIO多路复用重要概念 Channel **通道**重要概念 Buffer **数据缓存区**重要概念 Selector **选择器** 关键字final 元注解常用接口异常处理ErrorException JVM与虚拟机JVM内存模型本地方法栈虚拟机栈 Stack堆 Heap方法区 Method Area (JD…

视频压缩很简单,只需看这几个!【无损压缩】

在当今数字化的时代&#xff0c;视频成为了信息传递、娱乐和沟通的重要媒介。然而&#xff0c;随着高清和超高清视频的流行&#xff0c;视频文件的体积也相应增大&#xff0c;给存储、传输和分享带来了一系列挑战。为了克服这些问题&#xff0c;视频压缩技术应运而生。本文将深…

论文阅读:Brain–Computer EMO: A Genetic Algorithm Adapting to the Decision Maker

Brain–Computer Evolutionary Multiobjective Optimization: A Genetic Algorithm Adapting to the Decision Maker 作者&#xff1a;Roberto Battiti、Andrea Passerini 期刊&#xff1a;IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTA TION、OCTOBER 2010 DOI&#xff1a;10.11…

window 安装 jenkins 编写脚本

set JAVA_HOMED:\RuanJianKaiFa\jdk\jdk11 set CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOMe%\lib\tools.jar; set Path%JAVA_HOME%\bin; java -jar jenkins.war 下载jenkins.war包&#xff0c;编写一个txt文档&#xff0c;把脚本复制进去&#xff0c;修改文件后缀为.bat文件…

Nginx简单阐述及安装配置

目录 一.什么是Nginx 二.Nginx优缺点 1.优点 2.缺点 三.正向代理与反向代理 1.正向代理 2.反向代理 四.安装配置 1.添加Nginx官方yum源 2.使用yum安装Nginx 3.配置防火墙 4.启动后效果 一.什么是Nginx Nginx&#xff08;“engine x”&#xff09;是一个高性能的HTTP…

【每日一题】7.LeetCode——合并两个有序链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》|《数据结构与算法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢…

Java黑马——拼图小游戏

拼图小游戏&#xff08;GUI&#xff09; AWT包会有些兼容问题&#xff0c;不支持某些中文 在本次游戏的GUI开发中&#xff0c;我们将使用Swing包 一、主界面分析 这些东西统一称为组件&#xff0c;JFrame是一个组件、JMenuBar也是一个组件、等等 1、练习一&#xff1a;创建主…

WiFi 7 的核心要点

目录 WiFi 7 是什么&#xff1f; WiFi 7 的主要feature功能&#xff1a; 320Mhz channel 4K QAM Multi-Link Operation (MLO)&#xff0c;多链路操作 512 block ACK OFDMA&#xff1a;multiple RUs to single STA. 总结&#xff1a;性能是第一优先级&#xff0c;WiFi 7&#xf…

leetcode 19 , 118

19 .删除链表倒数第n个节点 思路1&#xff1a; 我首先想到的就是使用两个loop来进行解决&#xff1a; 遍历所有节点&#xff0c;得到需要删除节点的位置。再遍历一边所有节点&#xff0c;找到需要删除节点进行删除。 解决方案1&#xff1a; class Solution {public ListNod…

AI与数字孪生

源自&#xff1a;译文 “人工智能技术与咨询” 发布 AI和数字孪生 预测分析&#xff1a;网络安全水晶球 面对不断变化的威胁&#xff0c;提供自适应安全防护 自然语言处理&#xff1a;解码威胁语言 先进技术&#xff1a;人工智能作为数字孪生安全的基础 道德考量 面向未来…

maven中的version加不加SNAPSHOT的区别

我们平时开发时经常看到maven的pom.xml文件里面的包有两种 因为maven的远程仓库一般分为public(Release)和SNAPSHOT&#xff0c;前者代表正式版本&#xff0c;后者代表快照版本。 具体有什么区别呢&#xff1a; 举例说明&#xff0c;你开发了一个基础功能&#xff0c;打包发布…

服务器C盘突然满了,是什么问题

随着时代的发展、互联网的普及&#xff0c;加上近几年云计算服务的诞生以及大规模普及&#xff0c;对于服务器的使用目前是非常普遍的&#xff0c;用户运维的主要对象一般也主要是服务器方面。在日常使用服务器的过程中&#xff0c;我们也会遇到各式各样的问题。最近就有遇到用…

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外&#xff0c;它还能够完成多种任务&#xff0c;如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用&#xff0c;而且免费的chatGPT网站&#xff0c;AI…

026-安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全

026-安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全 #知识点&#xff1a; 1、PHP新闻显示-数据库操作读取显示 2、PHP模版引用-自写模版&Smarty渲染 3、PHP模版安全-RCE代码执行&三方漏洞 演示案例&#xff1a; ➢新闻列表&…

洗眼镜用超声波清洗机是不是智商税?值得入手超声波清洗机推荐

为了不洗眼镜大家都可以懒到什么程度&#xff1f;从一开始佩戴眼镜开始&#xff0c;就非常懒得洗眼镜&#xff0c;就算是眼镜脏了就随便用衣角或者是纸巾擦擦就完事了~基本都是很少用水去清洗。由于我一副眼镜使用的时长不是很久&#xff0c;老板也问我为什么频繁换眼镜&#x…

程序员自由创业周记#26:实习生

程序员自由创业周记#26&#xff1a;实习生 不发工资的实习生 一个人的力量是有限的&#xff0c;尤其是创业。因为要兼顾很多&#xff0c;需要的做的事也很多&#xff0c;而且时间有限&#xff0c;所以有一个帮手至关重要。不过鉴于创业的启动资金有限&#xff0c;雇人在现阶段…

Echars3D 饼图开发

关于vue echart3D 饼图开发 首先要先下载 "echarts-gl", 放在main.js npm install echarts-gl --save <template><div class"cointan"><!-- 3d环形图 --><div class"chart" id"cityGreenLand-charts"><…

【2024美国大学生数学建模竞赛】2024美赛C题网球运动中的势头,网球教练4.0没人比我更懂这个题了!!!

【2023美国大学生数学建模竞赛】2024美赛C题 问题分析、数学模型、实现代码、完整论文 引言 本人是计算机博士&#xff0c;拥有10年网球球龄&#xff0c;2023年的温网决赛&#xff0c;熬夜到半夜全称观看完了直播&#xff0c;对于网球规则、比赛的数据非常熟悉&#xff0c;这个…

【数据结构】 归并排序详解

1.基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide andConquer&#xff09;的一个非常典型的应用。 将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序…

Linux内核源码

记得看目录哦&#xff01; 1. 为什么要阅读Linux内核2. Linux0.01内核源码3. 阅读linux内核源码技巧4. linux升级内核5. linux的备份和恢复5.1 安装dump和restore5.2 使用dump完成备份5.3 使用restore完成恢复 1. 为什么要阅读Linux内核 2. Linux0.01内核源码 3. 阅读linux内核…