一.简介
Hive权限在开发过程中常常用到,Hive本身的权限用来防止用户做不合适的事情,粒度没有那么细(不到列级别、行级别),它是不完整的,数据开发平台用“SQL Standards Based Authorization in HiveServer2”对用户提交的SQL进行权限控制。
Hive权限控制模式主要四种:
- 在Hive 0.13版本之前,是Default Authorization,简称v1,当然官方文章上曾提及该版本存在一些问题。
- 在Hive 0.13或者之后的版本中,提出的是 SQL Standards Based Hive Authorizatio,简称v2。
- Storage Based Authorization in the Metastore Server(用于Metastore Server API的授权,Hive配置不控制权限,通过Hdfs文件进行权限控制)。
- Authorization using Apache Ranger & Sentry方式。
二.元数据字典
2.1 表描述
表名 | 作用 |
---|---|
BUCKETING_COLS | 存储bucket字段信息,通过SD_ID与其他表关联 |
CDS | 一个字段CD_ID,与SDS表关联 |
COLUMNS_V2 | 存储字段信息,通过CD_ID与其他表关联 |
DATABASE_PARAMS | 表存储数据库的相关参数,在CREATE DATABASE时候用,DBS和DATABASE_PARAMS这两张表通过DB_ID字段关联。 |
DBS | 存储hive的database信息 |
FUNCS | 用户注册的函数信息 |
FUNC_RU | 用户注册函数的资源信息 |
GLOBAL_PRIVS | 全局变量,与表无关 |
IDXS | 索引表,存储Hive索引相关的元数据 |
INDEX_PARAMS | 索引相关的属性信息 |
PARTITIONS | 分区记录,SD_ID, TBL_ID关联 |
PARTITION_KEYS | 存储分区字段,TBL_ID关联 |
PARTITION_KEY_VALS | 分区的值,通过PART_ID关联。与PARTITION_KEYS共用同一个字段INTEGER_IDX来标示不同的分区字段。 |
PARTITION_PARAMS | 存储某分区相关信息,包括文件数,文件大小,记录条数等。通过PART_ID关联 |
PART_COL_PRIVS | 分区字段的权限信息 |
PART_COL_STATS | 分区字段的统计信息 |
PART_PRIVS | 分区的授权信息 |
ROLES | 角色表,和GLOBAL_PRIVS配合,与表无关 |
SDS | 存储输入输出format等信息,包括表的format和分区的format。关联字段CD_ID,SERDE_ID |
SD_PARAMS | 存储Hive存储的属性信息 |
SEQUENCE_TABLE | 存储sqeuence相关信息,与表无关 |
SERDES | 存储序列化反序列化使用的类 |
SERDE_PARAMS | 序列化反序列化相关信息,通过SERDE_ID关联 |
SKEWED_COL_NAMES | 跟数据倾斜相关 |
SKEWED_COL_VALUE_LOC_MAP | 跟数据倾斜相关 |
SKEWED_STRING_LIST | 跟数据倾斜相关 |
SKEWED_STRING_LIST_VALUES | 跟数据倾斜相关 |
SKEWED_VALUES | 跟数据倾斜相关 |
SORT_COLS | 排序字段,通过SD_ID关联 |
TABLE_PARAMS | 表相关信息,是否外部表,通过TBL_ID关联 |
TAB_COL_STATS | 表字段的统计信息。使用ANALYZE语句对表字段分析后记录在这里 |
TBLS | 存储表信息,关联字段DB_ID,SD_ID, |
TBL_COL_PRIVS | 表字段的授权信息 |
TBL_PRIVS | 表赋权限相关信息,通过TBL_ID关联 |
VERSION | 版本 |
VERSION_copy | 版本,通过VER_ID关联 |
注意:本章只分析跟权限相关的表。
主要元数据表:
Db_privs 记录了User/Role在DB上的权限
Tbl_privs 记录了User/Role在table上的权限
Tbl_col_privs 记录了User/Role在table column上的权限
Roles 记录了所有创建的role
Role_map 记录了User与Role的对应关系
2.2 授权关键字
ALTER | 更改表结构,创建分区 |
---|---|
CREATE | 创建表 |
DROP | 删除表,或分区 |
INDEX | 创建和删除索引 |
LOCK | 锁定表,保证并发 |
SELECT | 查询表权限 |
SHOW_DATABASE | 查看数据库权限 |
UPDATE | 为表加载本地数据的权限 |
三.用户、组和角色
3.1 简介
用户级权限:对于操作系统上用户进入Hive服务的权限控制,和HDFS权限控制一致,都是ACL
支撑。
这里面最好Hadoop,Hive超级管理员是一个用户,这样省的出现一些奇怪的问题。(hive.users.in.admin.role=hdfs)
Hive的权限管理,可以基于用户和组,这个用户和组基于服务器系统创建,也可以基于角色。
3.2 原理
Hive基于元数据库来管理多用户并控制权限。数据分为元数据和数据文件两部分,元数据存储在mysql,而数据文件则是HDFS,控制元数据即控制可访问的数据文件。
配置:
hive.security.authorization.enabled参数是开启权限验证,默认为false。
hive.security.authorization.createtable.owner.grants参数是指表的创建者对表拥有所有权限。
Hive的权限管理是通过用户(User)、组(Group)、角色(Role)来定义,角色定义了权限,赋予给组或用户,用户归属于组。
四.Grant和Revoke权限
角色
# 创建角色
create role role_name;
# 显示角色
show roles;
# 删除角色
drop role role_name;
用户
# 用户进入admin角色权限
set hive.users.in.admin.role;
set role admin;
# 查看某用户的所有角色
show role grant user user_name
# 给角色添加用户
grant role role_name to user user_name;
用户授权
# 基于数据库
grant select on database default to useradmin;
# 基于某张表
grant select on table ppdata to user admin;
组授权
# 基于数据库
grant select on database default to group admin;
# 基于某张表
grant select on table ppdata to group admin;
角色授权
# 基于数据库
grant select on database default to role admin;
# 基于某张表
grant select on table ppdata to role admin;
用户移除权限
# 基于数据库
revoke select on database default from useruserB;
# 基于某张表
revoke select on table ppdata from useruserB;
查看角色权限
# 在某个数据库的权限
show grant role role_name on database database_name;
# 在某表的权限
show grant role role_name on [table] table_name;
五.Hive和Hadoop权限关系
原理我在第三模块介绍一些,Hive基于元数据库来管理多用户并控制权限。数据分为元数据和数据文件两部分,元数据存储在mysql,而数据文件则是HDFS,控制元数据即控制可访问的数据文件。
5.1 示例
-- 1 创建 admin 角色
create role admin;
create role role_user2;
-- 2 查看角色
show roles;
-- 3 将 yore 表的 ALL 权限赋予给 admin 角色
grant all on table default.yore to role admin;
-- 3 将 yore 表的 select 权限赋予给 role_user2 角色
grant select on table default.yore to role role_user2;
-- 4.1 将角色 admin 的权限赋予 user1 用户
-- GRANT ROLE admin TO USER user1;
-- 4.2 将角色 role_user2 的权限赋予 user2 用户
-- GRANT ROLE role_user2 TO USER `user2`;
-- 5.1 将 admin 角色添加到 user1
grant role admin to group user1;
-- 5.2 将 role_user2 角色添加到 user2
grant role role_user2 to group user2;
-- 6 查看 user1 用户组的角色信息
SHOW ROLE GRANT GROUP user1;
-- chakan role_user2 下的权限信息
SHOW GRANT ROLE role_user2;
-- 7 回收角色
-- 7.1 回收 某个角色对 库的 权限
REVOKE SELECT ON TABLE yore FROM ROLE role_user2;
-- 7.2 回收摸个组下的 某个角色的权限
REVOKE ROLE role_user2 [, role_name] FROM GROUP user2;
这样可以,通过user1访问,授权的表,绑定角色,Hdfs文件用户和组还是原来的超级管理员角色。
六.数据开放平台的应用
6.1 简介
支持一些组件操作开发平台,其中用到Hive权限管理。
功能点 | 描述 |
---|---|
脚本编辑 | 支持脚本语言:Hql、Sql、Python、scala等 支持对接多计算引擎:Spark、Hive等 支持语法自动补充全、语法高亮、SQL语法自动纠错功能 |
智能诊断 | 自动检测用户代码,返回描述 |
管理台 | 基本任务和会话管理 引擎参数和资源设置 资源使用展示,展示用户队列资源和服务器资源 |
6.2 功能
- 管理员可以将指定用户加入角色admin。
- 数据库dataset的所有者为角色admin,只有具有角色admin的用户才可以在此库中完成建表、修改表、删除表等操作。
- 普通用户无法查看或使用没有权限的数据库、没有权限的表(需要扩展现有的权限机制)。
- 管理员可将数据库dataset中的表(视图)查询权限赋予某个角色或某个用户。
- 普通用户是自己用户主(从)库的所有者,即拥有库内所有表(视图)的所有权限。
- 普通用户可以将自己拥有的权限赋予给其它角色或用户。
由于平台基于大数据架构上集成,支持多租户,权限管理一脉相承。
根据平台用户查询db
mybatis的xml
select NAME from(
select t2.NAME as NAME
from DB_PRIVS t1, DBS t2
where (lcase(t1.PRINCIPAL_NAME) = #{userName,jdbcType=VARCHAR}
OR t1.PRINCIPAL_NAME IN (SELECT ROLE FROM(SELECT r.ROLE_NAME AS ROLE, u.PRINCIPAL_NAME AS USER FROM ROLES r LEFT JOIN (SELECT * FROM ROLE_MAP WHERE PRINCIPAL_TYPE = 'USER') u ON r.ROLE_ID = u.ROLE_ID)AS T where T.USER = #{userName,jdbcType=VARCHAR}))
and lcase(t1.DB_PRIV) in ('select','all') and t1.DB_ID =t2.DB_ID
union all
select t3.NAME as NAME
from TBL_PRIVS t1, TBLS t2 , DBS t3
where t1.TBL_ID=t2.TBL_ID and lcase(t1.TBL_PRIV) in ('select','all') and (
lcase(t1.PRINCIPAL_NAME) = #{userName,jdbcType=VARCHAR} or lcase(t1.PRINCIPAL_NAME) in (SELECT ROLE FROM(SELECT r.ROLE_NAME AS ROLE, u.PRINCIPAL_NAME AS USER FROM ROLES r LEFT JOIN (SELECT * FROM ROLE_MAP WHERE PRINCIPAL_TYPE = 'USER') u ON r.ROLE_ID = u.ROLE_ID)AS T where T.USER = #{userName,jdbcType=VARCHAR}))
and t2.DB_ID=t3.DB_ID) a
GROUP BY NAME
order by NAME
这个有两部分,一部分查询DBS和DB_PRIVS角色,还有一部分,TBL_PRIVS, TBLS,DBS
查询角色。
根据平台用户查询表
mybatis的xml
select t2.TBL_NAME as NAME, t2.TBL_TYPE as TYPE, t2.CREATE_TIME as CREATE_TIME, t2.LAST_ACCESS_TIME as LAST_ACCESS_TIME, t2.OWNER as OWNER
from DB_PRIVS t1,TBLS t2, DBS t3
where t1.DB_ID =t3.DB_ID
and t2.DB_ID=t3.DB_ID
and lcase(t1.DB_PRIV) in ('select','all')
and lcase(t1.PRINCIPAL_NAME) = #{userName,jdbcType=VARCHAR}
and t3.NAME = #{dbName,jdbcType=VARCHAR}
union
select t2.TBL_NAME as NAME, t2.TBL_TYPE as TYPE, t2.CREATE_TIME as CREATE_TIME, t2.LAST_ACCESS_TIME as LAST_ACCESS_TIME, t2.OWNER as OWNER
from DB_PRIVS t1,TBLS t2, DBS t3
where t1.DB_ID =t3.DB_ID
and t2.DB_ID=t3.DB_ID
and lcase(t1.DB_PRIV) in ('select','all')
and lcase(t1.PRINCIPAL_NAME) in (select ROLE_NAME from ROLES where ROLE_ID in (select ROLE_ID from ROLE_MAP where PRINCIPAL_NAME = #{userName,jdbcType=VARCHAR}))
and t3.NAME = #{dbName,jdbcType=VARCHAR}
union
select t2.TBL_NAME as NAME, t2.TBL_TYPE as TYPE, t2.CREATE_TIME as CREATE_TIME, t2.LAST_ACCESS_TIME as LAST_ACCESS_TIME, t2.OWNER as OWNER
from TBL_PRIVS t1, TBLS t2 , DBS t3
where t1.TBL_ID=t2.TBL_ID
and t2.DB_ID=t3.DB_ID
and lcase(t1.TBL_PRIV) in ('select','all')
and t1.PRINCIPAL_NAME = #{userName,jdbcType=VARCHAR}
and t3.NAME = #{dbName,jdbcType=VARCHAR}
union
select t2.TBL_NAME as NAME, t2.TBL_TYPE as TYPE, t2.CREATE_TIME as CREATE_TIME, t2.LAST_ACCESS_TIME as LAST_ACCESS_TIME, t2.OWNER as OWNER
from TBL_PRIVS t1, TBLS t2 , DBS t3
where t1.TBL_ID=t2.TBL_ID
and t2.DB_ID=t3.DB_ID
and lcase(t1.TBL_PRIV) in ('select','all')
and t1.PRINCIPAL_NAME in (select ROLE_NAME from ROLES where ROLE_ID in (select ROLE_ID from ROLE_MAP where PRINCIPAL_NAME = #{userName,jdbcType=VARCHAR}))
and t3.NAME = #{dbName,jdbcType=VARCHAR}
order by NAME;
- 查询DB_PRIVS,TBLS,DBS角色关系
- 查询TBL_PRIVS,TBLS,DBS角色关系
七.演化
后续整个平台基于Ldap结合起来,把Linux用户,平台用户统一管理起来。
可以集成Sentry统一管理。
八.不足
权限的赋予是以表级别或视图级别进行的,不支持数据库级别的授权。这可能会带来同一个团队成员之间或不同团队成员之间共享数据不方便,均需要以表或视图进行相应的授权,但好处是用户的数据(表或视图)更安全。
九.总结
目前平台用的Hive权限介绍完了,还有些不足,后续可以通过平台的工作空间管理。