bigywater.tech
Elasticsearch · 162

Field Level Security

本机真实用trial许可证解锁field level security,给用户配上排除salary字段的field_security后,验证GET和search都只返回name和department,salary这个字段真实从_source中整条消失而不是显示成null;最关键的发现是用range查询按这个隐藏的salary字段筛选数据,受限用户真实查出0条结果,哪怕这条文档的salary确实满足查询条件,而管理员账号跑同一查询能正常匹配到,揭示了FLS让隐藏字段在查询语义层面也彻底消失、不只是展示层面抹除的真实安全设计。

配上field_security排除salary后GET
真实只返回name和department
search同一条文档
真实结果跟GET完全一致
用range查询按隐藏字段筛选
真实查出0条,管理员跑同查询能匹配到

做的事:本机真实提前用trial许可证把field level security这个功能解锁,往索引写一条带三个字段的文档,真实给用户配上排除salary字段的field_security

代码真实激活trial许可证: POST /_license/start_trial?acknowledge=true 真实写入: PUT /fls_test/_doc/emp1 {"name":"Alice","department":"sales","salary":95000} PUT /_security/role/no_salary_role { "indices": [{"names":["fls_test"],"privileges":["read"], "field_security":{"grant":["*"],"except":["salary"]}}] } 真实建用户nosalaryuser绑定这个role

真实测第一种场景:用这个受限用户直接GET这条文档

代码GET /fls_test/_doc/emp1

验证:真实只返回了name和department,salary真实从_source里被整条拿掉了,不是显示成null

实测 · 本机 Elasticsearch 8.15.0 执行输出
{"found":true,"_source":{"name":"Alice","department":"sales"}}
  ← 真实连salary这个字段名都没有出现,不是salary:null

真实测第二种场景:用同一个用户search这条文档,确认跟GET的行为一致

代码GET /fls_test/_search

验证:真实结果跟GET完全一致,_source里真实同样没有salary字段

实测 · 本机执行输出
hits.hits[0]._source: {"name":"Alice","department":"sales"}

真实测最关键的第三种场景:用range查询去按salary这个看不见的字段筛选数据,看这个被隐藏的字段是否还能被用来过滤

代码真实用nosalaryuser执行: GET /fls_test/_search {"query":{"range":{"salary":{"gt":50000}}}} 真实再用管理员账号跑同一条查询做对照

验证:受限用户真实查出0条结果,哪怕这条文档的salary真实是95000满足条件;管理员账号跑同一条查询真实能匹配到

实测 · 本机执行输出
nosalaryuser查询: hits.total.value: 0   ← 真实查不到,哪怕数据本身满足条件

管理员flsadmin跑同一条查询:
→ hits.total.value: 1, _source含salary:95000   ← 真实确认数据和条件都对得上
这组真实对比揭示了field level security一个容易被低估的真实能力:它真实不只是在最终把结果返回给调用方之前做一层"展示层面"的字段抹除,而是真实让这个被排除的字段在整个查询执行过程中都表现得跟不存在一样——哪怕底层索引里这个字段真实有数据、真实满足查询条件,受限用户发起的任何引用这个字段的查询(本次是range过滤)也真实会得到跟"这个字段压根没有数据"完全一致的结果。这跟document level security"让看不见的文档伪装成不存在"是同一个设计哲学的延伸:FLS真实让看不见的字段在查询语义上也彻底消失,不会因为"虽然不能看字段内容,但至少能用它筛选"这种折中漏出一丝关于这个字段数据的真实信息。

分步演示:从GET和search真实抹除隐藏字段,到range查询按隐藏字段筛选也真实查不到数据的完整验证

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

FLS让隐藏字段不只在展示上消失,连查询筛选这个字段也会得到跟字段不存在一样的结果
这一步新验证的字段级安全场景

    本文用到的工具

    • 真实独立搭建的Elasticsearch 8.15.0节点(开启security并激活trial许可证,测完即销毁)
    • 真实的role的 field_security 字段(Field Level Security)
    京ICP备2026067502号-1京公网安备11010502063487号