配置Hive单表动态视图的访问控制权限
操作场景
在多租户数据管理场景中,不同用户需要访问同一张表中的不同数据子集。传统的访问控制方式需要为每个用户创建独立的视图,管理复杂且维护成本高。如何在保证数据安全的前提下,简化多用户访问控制的配置?MRS Hive提供基于动态视图的访问控制机制,通过current_user()函数实现单表动态视图,一个视图即可为不同用户自动过滤出对应的数据子集。开启Kerberos认证的MRS Hive可以创建一个视图并控制用户访问权限,支持授权给不同的用户访问,同时限定不同用户只能访问各自的数据。
本文介绍如何配置Hive单表动态视图的访问控制权限。
- 动态视图(Dynamic View):Hive提供的一种视图类型,视图定义中包含current_user()等动态函数,在查询时根据当前用户动态生成查询结果。与静态视图不同,动态视图的查询条件会随用户身份变化。
- current_user()函数:Hive内置函数,返回当前执行查询的用户名称。在动态视图中使用该函数,可以实现基于用户身份的数据过滤。
约束与限制
- 未开启Kerberos认证的集群的“current_user()”函数无法区别客户端提交任务的用户,因此,当前访问控制仅对开启了Kerberos认证的集群的Hive有效。
- 如果已经在实际业务逻辑中使用了“current_user()”函数,那么,在安全模式(开启了Kerberos认证的集群)与普通模式(未开启Kerberos认证的集群)互转时,需要充分评估可能的风险。
- 动态视图的访问控制依赖于表中的数据字段(如type字段),需要确保表中包含用于区分用户的数据列。
前提条件
- 集群已启用Kerberos认证(安全模式)。
- 已安装Hive客户端。
- 已创建具有相应权限的Hive业务用户。
- 基表已创建并包含用于区分用户的数据列。
配置Hive视图的访问控制权限
- 以Hive客户端安装用户登录安装客户端的节点。
- 执行以下命令,切换到客户端安装目录,配置环境变量并认证用户。
切换至客户端安装目录:
cd 客户端安装目录加载环境变量:
source bigdata_env
认证用户:
kinit Hive业务用户 - 执行以下命令登录Hive客户端。
beeline
- 配置Hive视图的访问控制权限示例:
- 不采用“current_user”函数,要实现不同的用户访问不同数据,需要创建不同的视图:
- 将视图v1授权给用户hiveuser1,hiveuser1用户可以访问表table1中“type='hiveuser1'”的数据:
create view v1 as select * from table1 where type='hiveuser1';
- 将视图v2授权给用户hiveuser2,hiveuser2用户可以访问表table1中“type='hiveuser2'”的数据:
create view v2 as select * from table1 where type='hiveuser2';
- 将视图v1授权给用户hiveuser1,hiveuser1用户可以访问表table1中“type='hiveuser1'”的数据:
- 采用“current_user”函数,则只需要创建一个视图:
将视图v分别赋给用户hiveuser1、hiveuser2,当hiveuser1查询视图v时,“current_user()”被自动转化为hiveuser1,当hiveuser2查询视图v时,“current_user()”被自动转化为hiveuser2:
create view v as select * from table1 where type=current_user();
- 不采用“current_user”函数,要实现不同的用户访问不同数据,需要创建不同的视图:
验证操作:
配置完成后,可通过以下方式验证访问控制是否生效:
- 使用hiveuser1用户登录beeline,执行以下命令查询视图:
select * from v;
确认返回的数据仅为type='hiveuser1'的记录。
- 使用hiveuser2用户登录beeline,执行相同的查询命令:
select * from v;
确认返回的数据仅为type='hiveuser2'的记录。
- 使用hiveuser1用户尝试访问hiveuser2的数据,确认访问被拒绝或返回空结果。
常见问题
- 普通模式下动态视图不生效
未开启Kerberos认证的集群(普通模式)无法识别用户身份,current_user()函数无法返回正确的用户名称。
在普通模式下使用静态视图方式为每个用户创建独立的视图。
- 查询视图返回空结果
查询视图返回空结果可能是因为基表中没有对应当前用户的数据,或用户名称与type字段值不匹配。
检查基表中是否存在type字段值等于当前用户名称的数据。确认用户名称拼写正确,大小写敏感。
相关文档
- 了解Hive数据操作,请参考Hive客户端使用实践。
- 了解如何创建Hive用户并绑定角色,请参考创建Hive用户并绑定角色。
- 了解Hive常见问题,请参考Hive常见问题。