基于xpack的ES用户管理(授权)
基于xpack的ES用户管理(授权)
之前研究了【基于xpack的用户认证】,了解了用户认证的原理和具体操作,继续研究基于xpack的授权
基本概念
-
RBAC
Elasticsearch默认的授权管理是通过RBAC机制,也就是基于角色的访问控制(role based access control)
-
受保护的资源(Secured Resource)
在ES中集群、索引、文档、字段、别名、用户都可以是被保护的对象
-
权限字(Privilege)
每个被保护的资源都有与之对应的一组允许执行的动作,集群的权限有:all,manage,monitor等,索引的权限有:all,create,delete,index,read,write,manage等
-
许可(permissions)
一组被授权的资源和其权限字的集合
-
角色(Role)
一组许可的集合,默认的角色有:superuser,kibana_system,logstash_system,apm_system,monitor_system等,可以通过命令查看
GET /_security/role
- 用户(User)
被认证的用户,系统自带的用户可以通过命令查看
GET /_security/user
授权控制级别
Elasticsearch自带的xpack插件支持多个级别和层次的授权
-
集群级别
-
索引级别
-
文档级别(基础版不支持,需要license)
-
字段级别(基础版不支持,需要license)
如何通过角色授权
首先要确保elasticsearch.yml中安全配置xpack.security.enabled
和xpack.security.dls_fls.enabled
为true
在xpack中有三种方式可以添加角色,分别是:
-
通过图形化界面;Kibana->Security->Roles
-
设置ES_HOME/config/roles.yml
-
通过role API
-
role API的格式
POST /_security/role/clicks_admin { "run_as": [ "clicks_watcher_1" ], "cluster": [ "monitor" ], "indices": [ { "names": [ "events-*" ], "privileges": [ "read" ], "field_security" : { "grant" : [ "category", "@timestamp", "message" ] }, "query": "{\"match\": {\"category\": \"click\"}}" } ] }
-
给用户赋予角色
PUT /_security/user/wangzhen { roles:[clicks_admin] }
-
注意事项
- field_security 和 query 即文档级和字段级的权限需要更高级的license如黄金级和白金级
- 文档级和字段级的权限是OR的关系,如role_1有文档级的权限,role_2没有,当用户同时有role_1和role_2两个角色是就能看到所有的文档(因为role_2可以看到所有的文档)
- 文档级和字段级的权限只对"读"操作有效,对于"写"操作无效,即仍然可以修改看不到的字段