當您需要設定叢集、索引、欄位或其他動作的存取權限時,可以通過Elasticsearch X-Pack的RBAC(Role-based Access Control)機制,為自訂角色指派許可權,並將角色指派給使用者,實現許可權管控。Elasticsearch提供了多種內建角色,您可以在內建角色的基礎上擴充自訂角色,以滿足特定需求。本文介紹幾種常見的角色配置,以及如何通過角色配置實現許可權管控。
背景資訊
Elasticsearch支援X-Pack RBAC機制。詳細資料,請參見User authorization。
Elasticsearch支援多種安全認證功能。詳細資料,請參見Elasticsearch身份認證和授權。
操作步驟
本文僅提供6.7版本和7.x版本的操作步驟,其他版本操作可能略有不同,具體以實際介面為準。
建立角色。
登入Kibana控制台,根據提示進入Kibana首頁。
具體步驟,請參見登入Kibana控制台。
進入組態管理頁面。
6.7版本:在左側導覽列,單擊管控。
7.x版本:在頁面左上方,單擊
表徵圖,然後選擇管控 > Stack Management。
在安全管理地區,單擊角色管理。
單擊Create role,然後輸入相關參數配置。
參數
說明
角色名稱
角色名稱。
Cluster privileges
定義叢集的操作許可權,例如查看叢集健康度和Settings、建立快照等。詳細資料,請參見Cluster privileges。
Run As privileges
扮演該角色的使用者,可選。如果此處未選擇,可在建立使用者時,為該使用者指定對應角色。具體操作,請參見建立使用者。
Index privileges
定義索引的操作許可權,例如唯讀查看所有索引的所有欄位(索引名設定為*後,授予read索引),索引名支援萬用字元(*)及Regex。詳細資料,請參見Indices privileges。配置時,需要填寫以下參數:
Indices:選擇對應的索引模式。例如heartbeat-*。
說明如果沒有索引模式,請先在管控頁面,單擊Kibana中的Index Pattern,按照頁面提示建立一個索引模式。
Privileges:為角色指派的許可權。
Granted fields (optional):授權的欄位,可選。
Kibana privileges
定義Kibana操作許可權。
重要Kibana 7.0以下版本僅支援Base privileges,預設為所有空間授權;7.0及以上版本在Base privileges的基礎上,還支援Feature privileges,即對Kibana特定功能授權,需要指定Kibana空間。
建立角色時,需要為該角色指派對應許可權。本文的角色許可權配置樣本如下:
為普通使用者授予指定索引的唯讀(Read)許可權。設定使用者僅能訪問指定索引,不能進行其他動作。
詳細資料,請參見配置索引唯讀許可權。
為普通使用者授予查看所有或部分Dashboard的許可權。
詳細資料,請參見配置Dashboard操作許可權。
為普通使用者授予部分索引的讀寫權限,及所有叢集的唯讀許可權。例如查看叢集健康度、快照及Settings,寫入索引資料和更新索引Mapping等。
詳細資料,請參見配置索引讀寫和叢集唯讀許可權。
為普通使用者授予Kibana Discover的唯讀和索引唯讀許可權,該使用者可以進入Kibana的Discover頁面查看該索引的資料。
詳細資料,請參見配置Discover Read索引資料許可權。
為普通使用者授予建立刪除索引的許可權、增刪改查文檔的許可權以及修改索引配置的許可權,同時禁止使用者登入Kibana控制台。
詳細資料,請參見配置建立刪除索引、增刪改查文檔以及修改索引配置的許可權。
單擊Create role。
建立使用者,並為該使用者指派對應角色,為其授予該角色擁有的許可權。
進入組態管理頁面。
6.7版本:在左側導覽列,單擊管控。
7.x版本:在頁面左上方,單擊
表徵圖,然後選擇管控 > Stack Management。
在安全管理地區,單擊Users。
單擊Create new user,然後輸入相關參數配置。
參數
說明
使用者名稱
使用者名稱稱,用來登入Kibana控制台。自訂輸入。
登入密碼
該使用者的密碼,用來登入Kibana控制台。自訂輸入。
確認密碼
確認密碼,與登入密碼保持一致。
Full name
使用者全名,自訂輸入。
Email address
使用者的Email地址。
角色管理
為使用者指派角色。選擇已建立的角色,或系統預置的角色,可選擇多個。
重要在建立角色時,如果您已選擇了對應使用者,此處依然需要選擇角色,否則登入時會報錯。
單擊Create user。
通過自訂使用者登入Kibana控制台,執行相關操作驗證許可權是否生效。
配置索引唯讀許可權
情境描述
為普通使用者授予指定索引的唯讀許可權。該使用者可通過Kibana查詢索引資料,但無權訪問叢集。
角色配置
表 1. 許可權說明
權限類別型 | 許可權Key | 許可權Value | 描述 |
Index privileges | indices | kibana_sample_data_logs | 指定索引名稱,支援索引全名、別名、萬用字元及Regex。詳細資料,請參見Indices Privileges。 |
privileges | read | 設定索引唯讀許可權。唯讀許可權包括count、explain、get、mget、scripts、search、scroll等操作許可權。詳細資料,請參見privileges-list-indices。 | |
Granted fields (optional) | * | 索引欄位。*表示索引的所有欄位。 | |
Kibana privileges | privileges | read | 為所有空間授予Kibana唯讀許可權。預設為none,表示所有空間無許可權訪問Kibana。 重要 Kibana 7.0以下版本僅支援Base privileges,預設為所有空間授權;7.0及以上版本在Base privileges的基礎上,還支援Feature privileges,即對Kibana特定功能授權,需要指定Kibana空間。 |
驗證
通過普通使用者登入Kibana控制台,執行讀索引命令,返回結果正常。
GET /kibana_sample_data_logs/_search執行寫索引命令,返回未授權的錯誤資訊。
POST /kibana_sample_data_logs/_doc/1 { "productName": "testpro", "annual_rate": "3.22%", "describe": "testpro" }{ "error": { "root_cause": [ { "type": "security_exception", "reason": "action [indices:data/write/index] is unauthorized for user [user-test]" } ], "type": "security_exception", "reason": "action [indices:data/write/index] is unauthorized for user [user-test]" }, "status": 403 }
配置Dashboard操作許可權
情境描述
授予普通使用者指定索引的唯讀許可權,且可查看該索引對應的Dashboard資料。
角色配置
在建立使用者時,為該使用者指派角色:read-index和kibana_dashboard_only_user。
read-index:自訂角色樣本,需要您自行建立。該角色擁有指定索引的唯讀許可權。
kibana_dashboard_only_user:Kibana內建角色,該角色擁有查看指定索引Dashboard資料的許可權。
說明在Kibana 7.0及以上版本中,kibana_dashboard_only_user角色已經被廢棄。如果要查看指定索引的Dashboard,只需要為該索引配置讀許可權,詳細資料,請參見配置索引唯讀許可權。
kibana_dashboard_only_user角色與自訂角色配合使用可應用於很多情境。如果您僅需為自訂角色設定Dashboards only roles功能,可在管控頁面的Kibana地區,找到Dashboard部分,綁定自訂角色(預設是kibana_dashboard_only_user角色)。
驗證
通過普通使用者登入Kibana控制台,可查看對應索引的Dashboard大盤。
儀錶盤名為 heartbeat-dashboard,包含 heartbeat-visu 折線圖,Y 軸為 Count,X 軸為 @timestamp per 30 seconds,展示心跳檢測計數隨時間的變化趨勢。
配置索引讀寫和叢集唯讀許可權
情境描述
為普通使用者授予指定索引的讀、寫和刪除許可權,以及叢集和Kibana的唯讀許可權。
角色配置
表 2. 許可權說明
權限類別型 | 許可權Key | 許可權Value | 描述 |
Cluster privileges | 叢集 | monitor | 叢集唯讀許可權。例如查看叢集的健康度、狀態、熱線程、節點資訊、阻塞的任務等。 |
Index privileges | indices | heartbeat-*,library* | 指定索引名稱,支援索引全名、別名、萬用字元及Regex。詳細資料,請參見roles-indices-priv。 |
privileges | read | 設定索引唯讀許可權。唯讀許可權包括count、explain、get、mget、scripts、search、scroll等操作許可權。詳細資料,請參見privileges-list-indices。 | |
create_index | 建立索引許可權。如果在建立索引時,定義了索引別名,還需要授予索引manage許可權。 重要 索引別名需要同時滿足indices下定義的匹配規則。 | ||
view_index_metadata | 索引中繼資料的唯讀許可權,包括aliases、aliases exists、get index、exists、field mappings、mappings、search shards、type exists、validate、warmers、settings和ilm。 | ||
write | 對文檔執行所有寫操作的許可權,包括index、update、delete、bulk和更新mapping操作。與create和index許可權相比,該許可權的覆蓋面更大。 | ||
monitor | 監控所有操作的許可權,包括index recovery、segments info、index stats和status。 | ||
delete | 刪除索引文檔許可權。 | ||
delete_index | 刪除索引許可權。 | ||
granted fields | * | 待授權的索引欄位,*表示索引的所有欄位。 | |
Kibana privileges | privileges | read | 為所有空間授予Kibana唯讀許可權。預設為none,表示所有空間無許可權訪問Kibana。 重要 Kibana 7.0以下版本僅支援Base privileges,預設為所有空間授權;7.0及以上版本在Base privileges的基礎上,還支援Feature privileges,即對Kibana特定功能授權,需要指定Kibana空間。 |
驗證
通過普通使用者登入Kibana控制台,執行如下命令均正常。
GET _cat/indices?v
GET _cluster/stats
GET /product_info/_search
GET /product_info1/_search
POST /kibana_sample_data_logs/_doc/2
{
"productName":"testpro",
"annual_rate":"3.22%",
"describe":"testpro"
}
PUT /product_info2/_doc/1
{
"productName":"testpro",
"annual_rate":"3.22%",
"describe":"testpro"
}
DELETE product_info
--- Output ---
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .monitoring-es-6-2020.12.14 xxx 1 1
green open .kibana_1 xxx 1 1
green open kibana_sample_data_logs xxx 5 1 2 0 18.1kb 9kb
green open .monitoring-kibana-6-2020.12.12 xxx 1 1
green open .monitoring-es-6-2020.12.11 xxx 1 1
green open .monitoring-es-6-2020.12.10 xxx 1 1
green open .monitoring-kibana-6-2020.12.14 xxx 1 1
green open .monitoring-es-6-2020.12.09 xxx 1 1
green open .kibana_task_manager xxx 1 1
green open .monitoring-kibana-6-2020.12.13 xxx 1 1
green open .monitoring-kibana-6-2020.12.09 xxx 1 1
green open product_info1 xxx 5 1 0 0 2.5kb 1.2kb
green open .monitoring-kibana-6-2020.12.11 xxx 1 1
green open .monitoring-es-6-2020.12.12 xxx 1 1
green open product_info2 xxx 5 1 1 0 9.3kb 4.6kb
green open .monitoring-kibana-6-2020.12.10 xxx 1 1
green open .monitoring-es-6-2020.12.13 xxx 1 1
green open .security-6 xxx 1 1查看叢集中所包含索引的詳細資料
GET /_cat/indices?v查看叢集狀態
GET /_cluster/stats查詢product_info索引中的資料
GET /product_info/_search查詢product_info1索引中的資料
GET /product_info1/_search通過POST方式,向kibana_sample_data_logs索引中寫入資料
POST /kibana_sample_data_logs/_doc/2 { "productName": "testpro", "annual_rate": "3.22%", "describe": "testpro" }通過PUT方式,向product_info2索引中寫入資料
PUT /product_info2/_doc/1 { "productName": "testpro", "annual_rate": "3.22%", "describe": "testpro" }刪除product_info索引
DELETE product_info
配置Discover Read索引資料許可權
情境描述
為普通使用者授予Kibana Discover的唯讀和索引唯讀許可權,該使用者可以進入Kibana的Discover頁面查看該索引的資料。
角色配置
表 3. 許可權說明
權限類別型 | 許可權Key | 許可權Value | 描述 |
Cluster privileges | Privileges | monitor | 授予所有叢集的唯讀操作許可權,例如叢集健康和狀態、熱線程、節點資訊、節點和叢集統計資訊以及待處理的叢集任務。 |
Index privileges | Indices | kibana_sample_data_ecommerce | 指定索引名稱,支援索引全名、別名、萬用字元及Regex。詳細資料,請參見Indices Privileges。 |
Privileges | read | 設定索引唯讀許可權。唯讀許可權包括count、explain、get、mget、scripts、search、scroll等操作許可權。詳細資料,請參見privileges-list-indices。 | |
Granted fields (optional) | * | 索引欄位。 | |
Kibana privileges | Privileges | read | 為所有空間授予Kibana唯讀許可權。預設為none,表示所有空間無許可權訪問Kibana。 重要 Kibana 7.0以下版本僅支援Base privileges,預設為所有空間授權;7.0及以上版本在Base privileges的基礎上,還支援Feature privileges,即對Kibana特定功能授權,需要指定Kibana空間,例如授予Discover頁面的唯讀許可權。 |
驗證
通過普通使用者登入Kibana控制台,可通過Discover頁面查看指定索引的資料。
當前查看的索引為 kibana_sample_data_ecommerce,頁面成功展示了該索引中的電商訂單文檔詳情。
配置建立刪除索引、增刪改查文檔以及修改索引配置的許可權
情境描述
為普通使用者授予建立刪除索引的許可權、增刪改查文檔的許可權以及修改索引配置的許可權,同時禁止使用者登入Kibana控制台。
角色配置
表 4. 許可權說明
權限類別型 | 許可權Key | 許可權Value | 描述 |
Index privileges | Indices | test* | 指定索引名稱,支援索引全名、別名、萬用字元及Regex。詳細資料,請參見Indices Privileges。 |
Privileges | create_index | 建立索引的許可權。如果建立索引請求中包含添加到索引的別名,則需要同時授予manage許可權。 | |
delete_index | 刪除索引的許可權。 | ||
index | 索引和更新文檔的許可權,以及更新索引mappings的許可權。 | ||
delete | 刪除文檔的許可權。 | ||
read | 索引唯讀許可權。唯讀許可權包括count、explain、get、mget、scripts、search、scroll等操作許可權。詳細資料,請參見privileges-list-indices。 | ||
manage | 索引系統管理權限。系統管理權限包括aliases、analyze、cache clear、close、delete,、exists、flush、mapping、open、force merge、refresh、settings、search shards、templates、validate等操作許可權。 | ||
Granted fields (optional) | * | 索引欄位。 | |
Kibana privileges | Privileges | none | 設定為none(預設),表示所有空間無許可權訪問Kibana。 重要 Kibana 7.0以下版本僅支援Base privileges,預設為所有空間授權;7.0及以上版本在Base privileges的基礎上,還支援Feature privileges,即對Kibana特定功能授權,需要指定Kibana空間。 |
驗證
通過curl命令訪問執行個體,建立索引然後刪除。
[root@iZbp17az4re1xxx ~]# [root@iZbp17az4re1xxx ~]# curl -u 'test:xxx' -XPUT "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role" {"acknowledged":true,"shards_acknowledged":true,"index":"test_role"}[root@iZbp17az4re1kuerxxx ~]# [root@iZbp17az4re1xxx ~]# [root@iZbp17az4re1xxx ~]# curl -u 'test:xxx' -XDELETE "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role" {"acknowledged":true} root@iZbp17az4re1kuerxxx ~]#修改索引配置,本樣本將索引資料設定為冷資料。
[root@iZbp17az4re1kuere ~]# [root@iZbp17az4re1kuere ~]# curl -u 'test:xxx' -XPUT "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role/ settings" -H 'content-Type:application/json' -d '{"index":{"routing":{"allocation":{"require.box_type": "warm"}}}}' {"acknowledged":true}[root@iZbp17az4re1kuere-xxx ~]#對文檔進行增刪改查。
[root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# curl -u 'test_xxx' -XPOST "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role/_doc/1" -H 'content-Type:application/json' -d '{"test":"you know, for search"}' {"_index":"test_role","_type":"_doc","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":0,"_primary_term":1} [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# curl -u 'test_xxx' -XPOST "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role/_doc/2" -H 'content-Type:application/json' -d '{"test":"you know, for search"}' {"_index":"test_role","_type":"_doc","_id":"2","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":1,"_primary_term":1} [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# curl -u 'test_xxx' -XPOST "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role/_doc/2" -H 'content-Type:application/json' -d '{"test":"you know, for search, 2.0"}' {"_index":"test_role","_type":"_doc","_id":"2","_version":2,"result":"updated","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":2,"_primary_term":1} [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# curl -u 'test_xxx' -XGET "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role/_search?q=test:'search'" {"took":64,"timed_out":false,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0},"hits":{"total":2,"max_score":0.19100356,"hits":[{"_index":"test_role","_type":"_doc","_id":"1","_score":0.19100356,"_source":{"test":"you know,for search"}},{"_index":"test_role","_type":"_doc","_id":"2","_score":0.17439455,"_source":{"test":"you know,for search, 2.0"}}]}} [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]# curl -u 'test_xxx' -XDELETE "http://es-cn-co92y5p2b000xxx.elasticsearch.aliyuncs.com:9200/test_role/_doc/2" {"_index":"test_role","_type":"_doc","_id":"2","_version":3,"result":"deleted","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":3,"_primary_term":1} [root@iZbp17az4re1kueren xxx ~]# [root@iZbp17az4re1kueren xxx ~]#使用者登入Kibana控制台。
提示使用者無許可權。