Hive 权限管理

目前hive支持简单的权限管理,默认情况下是不开启,这样所有的用户都具有相同的权限,同时也是超级管理员, 也就对hive中的所有表都有查看和改动的权限,这样是不符合一般数据仓库的安全原则的。下面一起来看看Hive的权限管理。

一、Hive 三种授权模型

1.1 基于存储的授权

Storage Based Authorization in the Metastore Server基于存储的授权(也就是HDFS的授权模型),可以对Metastore中的元数据进行保护,但是没有提供更加细粒度的访问控制(例如:列级别、行级别)。

1.2 基于SQL标准的Hive授权

SQL Standards Based Authorization in HiveServer2 基于(grant)SQL标准的Hive授权,完全兼容SQL的授权模型,推荐使用该模式。除支持对于用户的授权认证,还支持角色 role 的授权认证

role 可理解为是一组权限的集合,通过 role 为用户授权一个用户可以具有一个或多个角色,默认包含两种角色:publicadmin;其中admin 用户可以在配置文件里进行配置,角色的命名是大小写不敏感的,这一点和SQL相同,但是用户名是对大小写敏感的。

通过hiveserver2的方式访问hive数据,默认提供两种角色:publicadmin,所有用户默认属于角色public,而授权则必须是具有角色admin的用户才可以完成(普通用户仅可以将自己获得的权限授权给其它用户);因此我们必须添加至少一个用户拥有角色admin,创建/删除角色命令用户和组使用的是Linux机器上的用户和组,而角色必须自己(hive)创建。

public 角色
默认情况下所有用户默认属于角色public,而授权则必须是具有角色admin的用户才可以完成(普通用户仅可以将自己获得的权限授权给其它用户)
public 用户有执行授权操作的权限,但是默认情况下public 用户是没有创建表的权限的。

admin 角色
用户除了admin 角色的其他角色都是默认给用户的,也就是说只要你有这个角色的权限,当你执行 show current roles;都是可以看到的,但是admin角色不行,即使你属于这个角色的列表,你也需要通过 set role admin; 来获取这个角色的权限;也就是说admin 角色是不在用户的current roles 列表里的,可以通过 set hive.users.in.admin.role; 查看哪些用户拥有admin 权限。

1.3 hive 默认授权

Default Hive Authorization (Legacy Mode) hive默认授权,设计目的仅仅只是为了防止用户产生误操作,而不是防止恶意用户访问未经授权的数据。
这是因为这种权限管理机制是不完善的,它并没有权限校验的机制,例如你执行grant 操作,它并不去检测你是否有权限,它的检测发生在SQL编译的阶段。

二、基于SQL标准的Hive授权特点

2.1 基于SQL标准授权的优点

  • 完全兼容SQL的授权模型;
  • 除支持对于用户的授权认证,还支持角色role的授权认证;
  • role可理解为是一组权限的集合,通过role为用户授权;
  • 一个用户可以具有一个或多个角色。

2.2 基于SQL标准授权的限制

  • 启用当前认证方式之后,dfs, add, delete, compile, and reset 等命令被禁用;
  • 通过 set 命令设置 hive configuration 的方式被限制某些用户使用。也可通过修改配置文件 hive-site.xmlhive.security.authorization.sqlstd.confwhitelist 进行配置,哪些用户可以使用这些命令,其实就是白名单(add 或者 drop 函数的命令属于admin 角色所有,所以这个时候如果要添加自定义函数的话可以通过admin 用户添加一个永久函数然后其他用户使用的方式来完成);
  • 添加、删除函数以及宏(批量规模)的操作,仅为具有 admin 的用户开放;
  • 用户自定义函数(开放支持永久的自定义函数),可通过具有admin角色的用户创建,其他用户都可以使用;
  • Transform功能被禁用。

三、基于SQL标准的Hive权限配置

前置条件

Hadoop、Hive是可用的前提

3.1 hive 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[hadoop@hadoop1 ~]$ vim apache-hive-2.3.9-bin/conf/hive-site.xml
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
<description>开启权限配置</description>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
<description>默认情况下,HiveServer2以提交查询的用户执行查询访问(true),如果hive.server2.enable.doAs设置为false,查询将以运行hiveserver2进程的用户访问。</description>
</property>
<property>
<name>hive.users.in.admin.role</name>
<value>root</value>
<description>指定超级管理员是哪个用户</description>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory</value>
<description>授权管理器类名</description>
</property>
<property>
<name>hive.security.authenticator.manager</name>
<value>org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator</value>
<description>认证器管理器类名</description>
</property>

配置完后启动 hiveserver2

1
[hadoop@hadoop1 ~]$ nohup hive --service hiveserver2 >> apache-hive-2.3.9-bin/hiveserver2.log 2>&1 &

3.2 获取admin角色的权限

拥有admin角色的用户需要运行命令 set role admin 去获取admin角色的权限,也会就是说即使你在admin 角色列表里,依然需要去获取一次才能拥有权限.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[hadoop@hadoop2 ~]$ beeline
Beeline version 2.3.9 by Apache Hive
beeline> !connect jdbc:hive2://hadoop1:10000 root
Connecting to jdbc:hive2://hadoop1:10000
Enter password for jdbc:hive2://hadoop1:10000: *
Connected to: Apache Hive (version 2.3.9)
Driver: Hive JDBC (version 2.3.9)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://hadoop1:10000> set hive.users.in.admin.role;
+--------------------------------+
| set |
+--------------------------------+
| hive.users.in.admin.role=root |
+--------------------------------+
1 row selected (0.029 seconds)
0: jdbc:hive2://hadoop1:10000> show current roles;
+---------+
| role |
+---------+
| public |
+---------+
1 row selected (0.257 seconds)
0: jdbc:hive2://hadoop1:10000> set role admin;
No rows affected (0.204 seconds)
0: jdbc:hive2://hadoop1:10000> show current roles;
+--------+
| role |
+--------+
| admin |
+--------+
1 row selected (0.089 seconds)

3.3 Hive 的权限操作

Hive 权限控制

操作解释
ALL所有权限
ALTER允许修改元数据(modify metadata data of object)—表信息数据
UPDATE允许修改物理数据(modify physical data of object)—实际数据
CREATE允许进行Create操作
DROP允许进行DROP操作
INDEX允许建索引(目前还没有实现)
LOCK当出现并发的使用允许用户进行LOCK和UNLOCK操作
SELECT允许用户进行SELECT操作
SHOW_DATABASE允许用户查看可用的数据库

3.3.1 角色的添加、删除、查看、设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#查看用户当前的角色
> show current roles;
+---------+
| role |
+---------+
| public |
+---------+

#设置当前用户的角色
> set role admin;
> show current roles;
+--------+
| role |
+--------+
| admin |
+--------+

#创建角色
> create role test;
> create role test1;

#查看所有存在的角色
> show roles;
+---------+
| role |
+---------+
| admin |
| public |
| test |
| test1 |
+---------+

#删除角色
> drop role test1;
> show roles;
+---------+
| role |
+---------+
| admin |
| public |
| test |
+---------+

3.3.2 角色的授予角色、删除、查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#将角色授予给某个用户、角色
> grant test to user hadoop;
> grant test to role public;

#查看授予某个用户、角色的角色列表
> show role grant user hadoop;
+---------+---------------+----------------+----------+
| role | grant_option | grant_time | grantor |
+---------+---------------+----------------+----------+
| admin | true | 1635326661000 | admin |
| public | false | 0 | |
| test | false | 1635389763000 | hadoop |
+---------+---------------+----------------+----------+

> show role grant role public;
+-------+---------------+----------------+----------+
| role | grant_option | grant_time | grantor |
+-------+---------------+----------------+----------+
| test | false | 1635389776000 | hadoop |
+-------+---------------+----------------+----------+

#查看属于某种角色的用户、角色列表:
> show principals test;
+-----------------+-----------------+---------------+----------+---------------+----------------+
| principal_name | principal_type | grant_option | grantor | grantor_type | grant_time |
+-----------------+-----------------+---------------+----------+---------------+----------------+
| hadoop | USER | false | hadoop | USER | 1635389763000 |
| public | ROLE | false | hadoop | USER | 1635389776000 |
+-----------------+-----------------+---------------+----------+---------------+----------------+

#移除某个用户、角色的角色
> revoke test from user hadoop;
> show role grant user hadoop;
+---------+---------------+----------------+----------+
| role | grant_option | grant_time | grantor |
+---------+---------------+----------------+----------+
| admin | true | 1635326661000 | admin |
| public | false | 0 | |
+---------+---------------+----------------+----------+

> revoke test from role public;
> show role grant role public;
+-------+---------------+-------------+----------+
| role | grant_option | grant_time | grantor |
+-------+---------------+-------------+----------+
+-------+---------------+-------------+----------+

3.3.3 权限的授予、移除、查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#将权限授予给某个用户、角色
> grant select on t1 to user test;
> grant select on t1 to role public;

#查看某个用户、角色的权限
> show grant user test on t1;
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| default | t1 | | | test | USER | SELECT | false | 1635390383000 | hadoop |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+

> show grant role public on t1;
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+
| default | t1 | | | public | ROLE | SELECT | false | 1635390615000 | hadoop |
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+----------------+----------+

#移除某个用户、角色的权限
> revoke select on t1 from user test;
> show grant user test on t1;
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor|
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------+----------+
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------+----------+

> revoke select on t1 from role public;
> show grant role public on t1;
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------+----------+
| database | table | partition | column | principal_name | principal_type | privilege | grant_option | grant_time | grantor|
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------+----------+
+-----------+--------+------------+---------+-----------------+-----------------+------------+---------------+-------------+----------+
-------------本文结束感谢您的阅读-------------