基于open_distro的ES文档访问控制
前言
open distro for elasticsearch 是由亚马逊AWS支持的基于Apache License,Version 2.0协议的100%开源的Elasticsearch发行版。与Elastic公司官方的Elasticsearch版本最大的区别是:剔除了基于elastic协议发布的xpack插件,增加了开源插件。新增插件功能包括安全、告警、索引生命周期管理、性能分析、SQL等企业级功能。简单理解就是集成了开源版xpack插件的elasticsearch。
文档级别安全控制
在一些场景下,除了集群和索引级别的权限控制,我们希望控制的粒度更细一些,希望不同的用户只能看到自己有权限访问的文档,而不是一个索引中的所有文档,open distro 提供了document level 的访问控制,我们可以在创建角色时,指定dls属性来实现。
配置方式
文档级别(document level)的权限控制,是在创建角色(role)时在dls中指定的,因此也有三种方式来配置:
-
通过配置文件初始化
在ES_HOME/plugins/opendistro_security/securityconfig/roles.yml 中设置
-
通过kibana的图形话界面配置
在kibana ->Security 模块 -> Roles -> Index Permissions -> Document Level Security Query中配置
-
通过REST API 配置
配置文件初始化和kibana图形话界面的配置方式,不方面在开发中进行脚本管理和现场实施。REST API方式很好的解决了这些问题。
REST API 设置步骤
-
创建具有文档权限的角色
PUT _opendistro/_security/api/roles/public_data { "cluster_permissions": [ "*" ], "index_permissions": [{ "index_patterns": [ "pub*" ], "dls": "{\"term\": { \"public\": true}}", "allowed_actions": [ "read" ] }] }
-
创建用户,并给用户赋予该角色
PUT /_opendistro/_security/api/internalusers/public_user { "password":"123456" } PUT /_opendistro/_security/api/rolesmapping/public_data { "users":["public_user"] }
public_user 用户就只能查看pub开头的索引,且文档中public 属性为true的字段
注意事项
-
所有能在_search 的query中使用的语法均能在dls中使用,但是需要做字符转义,如:双引号转换为反斜线加双引号,且dls不建议写太复杂
-
对于文档中没有 public 属性的文档,那么用户看不到该文档
-
文档级权限之间的关系是or的关系,比如public_data_2角色只能查看name为wangzhen的文档,public_data角色只能查看public 为true的文档,用户public_user 拥有public_data和public_data_2两个角色,那么public_user能查看public为true的文档或者name为wangzhen的文档。
-
如果public_data_3角色没有设置dls,而public_data设置了dls,那么拥有这两个角色的用户只能查看dls设置的文档(和xpack的默认表现不一致)