Hive权限管理应用

简介: Hive权限管理应用

一.简介

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权限介绍完了,还有些不足,后续可以通过平台的工作空间管理。

目录
相关文章
|
1月前
|
SQL JSON 关系型数据库
bigdata-22-Hive高阶应用
bigdata-22-Hive高阶应用
35 0
|
1月前
|
SQL HIVE
hive窗口函数应用实例
hive窗口函数应用实例
115 3
|
1月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
128 1
|
9月前
|
SQL 大数据 开发工具
大数据Hive窗口函数应用实例 2
大数据Hive窗口函数应用实例
103 0
|
9月前
|
SQL 大数据 开发工具
大数据Hive窗口函数应用实例 1
大数据Hive窗口函数应用实例
60 0
|
9月前
|
SQL 分布式计算 关系型数据库
大数据Hive安装与应用
大数据Hive安装与应用
126 0
|
9月前
|
SQL 数据可视化 大数据
大数据Hive行列转换应用与实现
大数据Hive行列转换应用与实现
131 0
|
10月前
|
SQL 算法 Linux
Hive应用实例:WordCount
Hive应用实例:WordCount
155 0
|
SQL 分布式计算 大数据
BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
|
SQL 并行计算 数据挖掘