当您需要设置集群、索引、字段或其他操作的访问权限时,可以通过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索引),索引名支持通配符(*)及正则表达式。详细信息,请参见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 | 指定索引名称,支持索引全名、别名、通配符及正则表达式。详细信息,请参见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* | 指定索引名称,支持索引全名、别名、通配符及正则表达式。详细信息,请参见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 | 指定索引名称,支持索引全名、别名、通配符及正则表达式。详细信息,请参见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* | 指定索引名称,支持索引全名、别名、通配符及正则表达式。详细信息,请参见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控制台。
提示用户无权限。