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