基于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的默认表现不一致)

posted @ 2020-08-16 19:18  wangzhen3798  阅读(1169)  评论(0编辑  收藏  举报