加密方式
目前在數據存儲領域常見的三種:透明加密、半透明加密、非透明加密,其含義如下:
- 透明加密:主要是底層存儲層的自動加密和解密,防止數據庫文件被物理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關系,一個用戶擁有多個角色時,可能會出現一些奇怪現象。建議一個用戶只有一個角色
-
文檔級控制語句需要使用的字段不能被過濾或打碼,即字段級控制在文檔級控制語句前執行。