1. 程式人生 > 實用技巧 >基於open_distro的ES文件訪問控制

基於open_distro的ES文件訪問控制

基於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的預設表現不一致)