本机真实先验证document level security功能在basic许可证下被直接拒绝(跟审计日志一样被license等级卡着),用ES自带的trial许可证激活后同样的role配置真实创建成功;真实测试受限用户的search和count都只能看到授权范围内的文档,最关键的发现是直接用id去GET一条被过滤的文档,返回的是found:false而不是403,对比管理员账号确认该文档真实存在,揭示了DLS刻意让被过滤文档对受限用户表现得如同不存在,避免通过拒绝响应泄露数据存在性这个真实的安全设计细节。
代码PUT /_security/role/sales_only_role { "indices": [{"names":["dls_test"],"privileges":["read"], "query":{"term":{"department":"sales"}}}] }
→ 403 security_exception: "current license is non-compliant for [field and document level security]"
这个真实报错再次印证了本系列前面得到的结论:Elasticsearch的不少安全相关功能真实都被license许可证等级卡着,默认的basic许可证真实用不了document level security这类功能,不是配置写对了就一定能生效。
代码POST /_license/start_trial?acknowledge=true 真实重新PUT同样的role
{"acknowledged":true,"trial_was_started":true,"type":"trial"}
真实再PUT role: {"role":{"created":true}}代码真实写入department:sales和department:hr两条文档 真实用绑定了sales_only_role的salesuser分别测: GET /dls_test/_search GET /dls_test/_count GET /dls_test/_doc/hr1 # 直接用hr那条文档的真实id去查
search: hits.total.value:1, 真实只有department:sales那一条
count: {"count":1} ← 真实精确对应可见的那1条
直接GET /dls_test/_doc/hr1:
→ {"_index":"dls_test","_id":"hr1","found":false} ← 真实是found:false,不是403!
对比用dlsadmin(不受DLS限制)查同一个id:
→ {"found":true,"_source":{"department":"hr","amount":200}} ← 真实确认这条数据本来是存在的每一步都是本文在一个真实独立搭建、开启security的Elasticsearch 8.15.0节点上跑出来的原始结果,测完即销毁。
_license/start_trial 与role的 query 字段(Document Level Security)