基于open_distro的ES用户管理(授权)
背景
open distro for elasticsearch 是由亚马逊AWS支持的基于Apache License,Version 2.0协议的100%开源的Elasticsearch发行版。与Elastic公司官方的Elasticsearch版本最大的区别是:剔除了基于elastic协议发布的xpack插件,增加了开源插件。新增插件功能包括安全、告警、索引生命周期管理、性能分析、SQL等企业级功能。简单理解就是集成了开源版xpack插件的elasticsearch。
用户授权
在通过用户认证后,open_distro_security插件需要一系列机制进行用户授权,来验证用户可以执行哪些操作,不允许执行哪些操作。open_distro_security也提供了RBAC(基于角色的访问控制),简单来说就是:先创建角色,角色拥有一系列权限,再把角色赋予用户,最后计算得出某个用户具体拥有哪些权限。关于用户角色映射(map users to roles)的理解:一般情况下,创建用户后,给用户赋予角色。但是在open_distro_security插件中这个过程是相反的,是创建角色后,把角色和用户关联映射起来。
概念
- 被保护资源
被保护的资源分为两个类:集群和索引,被保护(访问控制的对象)可以是某个索引的数据,也可以是某个API。 - 权限(permission)
可以在某个被保护资源上执行的操作,详细权限列表参见文档通常情况下,不建议直接给用户赋予权限,而应该给用户添加动作组。 - 动作组(Action Group)
单个权限的控制粒度太细了,一组相关权限的组合就称为“动作组”。创建新组的最佳实践是:在已有的组上,赋予新的权限,而不是创建一个全新的组。默认的动作组有:
- 通用(可以用在索引和集群控制上)
- UNLIMITED:没有限制
- 集群级别
- CLUSTER_ALL
- CLUSTER_MONITOR
- CLUSTER_COMPOSITE_OPS_RO
- CLUSTER_COMPOSITE_OPS
- MANAGE_SNAPSHOTS
- 索引级别
- INDICES_ALL
- GET
- READ
- WRITE
- DELETE
- CRUD
- SEARCH
- SUGGEST
- CREATE_INDEX
- INDICES_MONITOR
- MANAGE_ALIASES
- MANAGE
- 角色(Role)
在角色中需定义名称、集群权限(集群动作组)、要保护的索引、索引权限(索引动作组)、文档级控制权限、字段级控制权限。插件默认有一些初始化好的角色,如:
- all_access
- readall
- kibana_server
授权方式
在open_distro security的安全插件中可以通过三种方式打到授权的目的:
- 通过配置文件管理
在$ES_HOME/plugins/opendistro_security/securityconfig 目录中的roles.yml和roles_mapping.yml,并用/plugins/opendistro_security/tools/securityadmin.sh 完成初始化。 - 通过kibana图形化界面
使用opendistroforelasticsearch 版本的kibana 管理工具,Security模块进行Users、Roles、RoleMapping的管理工作 - 通过Restful API接口
配置文件的方式适合系统第一次安装后的初始化场景,kibana图形化界面适用临时运维管理。只有Restful API接口适合软件研发过程中的管理工作,且能以脚本的形式归档和统一分发执行。所以详细介绍一下通过API命令
API管理命令
- 创建角色
PUT _opendistro/_security/api/roles/test_role2
{
"cluster_permissions":["cluster_composite_ops","indices_monitor"],
"index_permissions":[
{
"index_patterns":["test*"],
"allowed_actions":[
"read","write"
]
}
],
"tenant_permissions":[]
}
- 删除角色
DELETE _opendistro/_security/api/roles/test_role2
- 获取角色
GET _opendistro/_security/api/roles/
- 将新建的角色赋予用户
PUT _opendistro/_security/api/rolesmapping/test_role2
{
"users":[test_user2]
}
注意事项及疑问
- 新建的自定义角色,必须通过rolesmapping API 将角色和用户映射起来(用户赋予角色),否则用户没权限
- 没有通过rolesmapping API而直接在创建用户的backend_roles中指定该角色,不起作用,无效。
- rolesmapping/<rol> role 必须是自定义的角色名,不是任意字符串
- 疑问:创建用户时的backend_roles和自定义角色是什么关系?