Elasticsearch权限控制与加密

加密方式

目前在数据存储领域常见的三种:透明加密、半透明加密、非透明加密,其含义如下:

  • 透明加密:主要是底层存储层的自动加密和解密,防止数据库文件被物理copy走后,破解数据。用户使用无感知,所有有权限的数据库用户均能直接访问数据。
  • 半透明加密:用户仅能查看自己插入的数据,其他人插入的数据显示为空值或者乱码
  • 非透明加密:使用密钥通过加密解密函数进行数据的加密解密,不用函数查看到的数据为加密后的数据。

安全插件

open distro for elasticsearch 是由亚马逊AWS支持的基于Apache License,Version 2.0协议的100%开源的Elasticsearch发行版。与Elastic公司官方的Elasticsearch版本最大的区别是:剔除了基于elastic协议发布的xpack插件,增加了开源插件。新增插件功能包括安全、告警、索引生命周期管理、性能分析、SQL等企业级功能。简单理解就是集成了开源版xpack插件的elasticsearch。 其中安全插件功能包含索引的文档级和字段级的访问控制,能够实现半透明加密效果。

  • 文档级别控制

    在一些场景下,除了集群和索引级别的权限控制,我们希望控制的粒度更细一些,希望不同的用户只能看到自己有权限访问的文档,而不是一个索引中的所有文档,open distro 提供了document level 的访问控制,我们可以在创建角色时,指定dls属性来实现。能够通过配置实现不同的用户看到不同的数据或者只看到自己插入的数据,具体操作方式参见《基于open_distro的ES文档访问控制》

  • 字段级别控制

    目前open distro 能够实现以下几种字段控制方式:

    • 字段隐藏

      通过include和exclude配置特定权限的用户看不到字段

    • 字段打码

      通过filed_masking设置特定权限的用户能够看到字段,但是字段是乱码(经过盐值和特定hash算法加密后的值)

    • 字段字符替换

      可以通过配置将字段的前n个或者后n个字符替换成*或者x,被替换测字符可配置

实现步骤

  • 配置盐值

在各节点的elasticsearch.yml中添加以下配置,并重启ES集群

opendistro_security.compliance.salt: abcdefghijklmnopqrstuvqxyz1234567890
  • 创建角色并赋予用户,该角色和用户的权限如下:

    • test_employe_filed 索引的工资字段salary 隐藏(过滤掉)
    • test_employe_filed 索引的住址字段address 打码
    • test_employe_field索引的姓名字段name第一个字符替换为*

    脚本如下:

    ## 创建角色
    PUT  _opendistro/_security/api/roles/role_wangzhen
    {
      "cluster_permissions": [
        "*"
      ],
      "index_permissions": [
        {
          "index_patterns": [
            "test_employe_field"
          ],
          "dls": "",
          "fls": [
            "~salary"
          ],
          "masked_fields": [
              "address",
              "name::/^[^A-Za-z0-9_]{1,1}/::*"
          ],
          "allowed_actions": ["read","write","create","admin"]
        }
      ]
    }
    
    ## 创建用户
    PUT _opendistro/_security/api/internalusers/user_wangzhen
    {
      "password":"6789@jkl",
      "backend_roles":[],
      "attributes":{
        "age":18
      }
    }
    
    ## 将角色赋予用户
    PUT _opendistro/_security/api/rolesmapping/role_wangzhen
    {
       "users":["user_wangzhen"]
    }
    
    
  • 插入测试数据

    POST /test_employe_field/_doc
    {
      "name":"王震",
      "age":18,
      "address":"中国",
      "salary":10000
    }
    
    POST /test_employe_field/_doc
    {
      "name":"李四",
      "age":19,
      "address":"中国",
      "salary":5000
    }
    
  • 使用该用户登陆,并查询数据

    # 查询语句
    GET /test_employe_field/_search
    {
      "query": {
        "match_all": {}
      }
    }
    
    
    #查询结果
        "hits" : [
          {
            "_index" : "test_employe_field",
            "_type" : "_doc",
            "_id" : "R0GCdnQBjEUYbyAfFED7",
            "_score" : 1.0,
            "_source" : {
              "address" : "2f474637fd7b804f362b64ece9f97ec6df48cf0c64f93ec73273fd54b033ea0d",
              "name" : "*震",
              "age" : 18
            }
          },
          {
            "_index" : "test_employe_field",
            "_type" : "_doc",
            "_id" : "U0GHdnQBjEUYbyAfOkB1",
            "_score" : 1.0,
            "_source" : {
              "address" : "2f474637fd7b804f362b64ece9f97ec6df48cf0c64f93ec73273fd54b033ea0d",
              "name" : "*四",
              "age" : 19
            }
          }
        ]
    

注意事项

  • 字段替换功能只能对字符串字段使用

  • 角色与角色间的权限是AND关系,一个用户拥有多个角色时,可能会出现一些奇怪现象。建议一个用户只有一个角色

  • 文档级控制语句需要使用的字段不能被过滤或打码,即字段级控制在文档级控制语句前执行。

posted @ 2020-09-15 17:18  wangzhen3798  阅读(5082)  评论(0编辑  收藏  举报