Hive之——安全

转载请注明出处:https://blog.csdn.net/l1028386804/article/details/88648094

和Hadoop安全功能相结合

Hive v0.70增加了和Hadoop安全功能的结合,这意味着,当Hive提交到安全集群的JobTracker上时,将使用合适的认证处理过程。用户权限可以被授予也可以被回收。

使用Hive进行验证

如果文件和文件夹是多个用户共同拥有,那么文件的权限就变得非常重要。HDFS中文件目录权限和Unix中的模式非常类似,都包含有3层:用户、组和其他。同时具有3种权限:可读、可写和可执行。Hive中有一个配置变量hive.files.umask.value来定义对于新创建的文件设置的默认权限的umask值,也就是掩码字节数。

<property>
<name>hive.files.umask.value</name>
<value>0002</value>
</property>

同时,当属性hive.metastore.authorization.storage.checks的值为true时,如果用户没有权限删除表底层的文件,Hive就会阻止用户来删除这样的表。这个参数的默认值是false。其应该设置为true的:

<property>
<name>hive.metastore.authorization.storage.checks</name>
<value>true</value>
</property>

当在安全模式下执行时,Hive元数据存储要尽可能的将hive.metastore.execute.setugi设置为true。

<property>
<name>hive.metastore.execute.setugi</name>
<value>false</value>
</property>

Hive中的权限管理

Hive v0.7.0增加了HiveQL进行授权设置的功能。默认授权模块是不开启的,需要将如下的属性设置为true,才能开启授权:

<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>

<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>ALL</value>
</property>

默认情况下,hive.security.authorization.createtable.owner.grants的值是null,这使得用户无法访问自己的表,因此,我们也要给予表创建者对应的权限才能访问自己创建的表。

用户、组和角色

可以对用户(user)、组(group)、或者角色(role)授予权限或者回收权限。

hive> set hive.security.authorization.enabled=true;
hive> create table authorization_test(key int, value string); --->会报权限错误

我们使用的用户没有在default数据库下创建表的权限。我们可以对多个实体进行授权。第一个实体就是用户(user),Hive中的用户就是用户的系统用户名。我们可以确定其名称,并按照如下语句将在default数据库下的创建表(create)权限授予这个用户:

hive> set system:user.name;
hive> grant create on database default to user edward;
hive> create table authorization_test(key int, value string);

通过show grant查看授权结果

hive> show grant user edward on database default;
databasedefault
principalName    edward
principalType    USER
privilegeCreate
grantTimeMon Mar 18 17:37:00 EDT 2019
grantoredward

可以基于组级别授权,Hive中组和用户的住POSIX组是等价的。

hive> create table authorization_test_group(a int, b int);
hive> select * from authorization_test_group;----> 权限异常
hive> grant select on table authorization_test_group to group edward;
hive> select * from authorization_test_group;

也可以使用角色(role)。用户可以放置在角色中同时可以为角色进行授权。角色关系灵活,因为和组不一样,组由系统外部控制,角色是由Hive内部控制:

hive> create table authorization_test_role(a int, b int);
hive> select * from authorization_test_role;----> 权限异常
hive> create role users_who_can_select_authentication_test_role;
hive> grant role users_who_can_select_authentication_test_role to user edward;
hive> grant select on table authorization_test_role to role users_who_can_select_authentication_test_role;
hive> select * from authorization_test_role;

Grant和Revoke权限

权限    描述
ALL赋予所有的权限
ALTER有修改表结构的权限
CREATE有创建表的权限
DROP有删除表或表中的分区权限
INDEX创建表索引的权限
LOCK开启并发后,锁定和解锁定表的权限
SELECT查询表或者分区中数据的权限
SHOW DATABASE    查看所有数据库的权限
UPDATE向表或者分区中插入或加载数据的权限

以create权限为例:

hive> set hive.security.authorization.enabled=true;
hive> create database edsstuff;
hive> use edsstuff;
hive> create table a (id int);--->权限异常
hive> grant create on database edsstuff to user edward;
hive> create table a (id int);
hive> create external table a (id int);

同样,我们可以通过如下命名授予ALTER权限:

hive> alter table a replace columns(a int, b int); --->权限异常
hive> grant alter on table a to user edward;
hive> alter table a replace columns(a int, b int);

注意:为分区表新增分区的操作是不需要alter权限的:

hive> alter table a_part_table add partition(b=5);

往表中加载数据的话需要使用UPDATE权限:

hive> load data inpath '${env:HIVE_HOME}/NOTICE' into table a_part_table partition(b=5);---> 权限异常
hive> grant update on table a_part_table to user edward;
hive> load data inpath '${env:HIVE_HOME}/NOTICE' into table a_part_table partition(b=5);

删除表或者分区需要drop权限:

hive> alter table a_part_table drop partition(b=5);--->权限异常

从表或者分区中查询数据需要select权限

hive> select id from a_part_table;--->权限异常
hive> grant select on table a_part_table to user edward;
hive> select id from a_part_table;

授予全部的权限:

hive> grant all on table a_part_table to user edward;

分区级别的权限

Hive中分区表非常常见。默认是在表级别授予权限,不过,同样可以在分区级别进行授权。为达到这个目标,只需要将表属性PARTITION_LEVEL_PRIVILEGE设置为TRUE即可:

hive> create table authorize_part(key int, value string) partitioned by (ds string);
hive> alter table authorize_part set tblproperties("PARTITION_LEVEL_PRIVILEGE"="TRUE");--->权限异常
hive> grant alter on table authorize_part to user edward;
hive> alter table authorize_part set tblproperties("PARTITION_LEVEL_PRIVILEGE"="TRUE");
hive> grant select on table authorize_part to user edward;
hive> alter table authorize_part add partition(ds='3');
hive> alter table authorize_part add partition(ds='4');
hive> select * from authorize_part where ds = '3';
hive> revoke select on table authorize_part partition(ds='3') from user edward; 
hive> select * from authorize_part where ds = '3';--->权限异常
hive> select * from authorize_part where ds = '4';

自动授权

用户经常会期望创建表后不再执行烦人的授权命令,就可以具有相关的权限,而直接去执行后续的查询等等。早期,用户可能需要具有ALL权限才可以,不过现在为默认情况制定更细节的权限。
属性hive.security.authorization.createtable.owner.grants中可以定义为创建表的用户自动授予这张表的指定的权限。比如下面的例子为用户自动授予对其所创建表的表的select和drop权限:

<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>select, drop</value>
</property>

类似的,可以在创建表时自动授予指定用户指定的权限。属性hive.security.authorization.createtable.user.grants控制这个行为。
比如下面的例子展示了Hive管理员账号admin1和用户edward默认授予所有表的读权限,而user1只有创建表的权限。

<property>
<name>hive.security.authorization.createtable.user.grants</name>
<value>admin,edward:select;user1:create</value>
<property>

对于组(group)和角色(role)同样具有类似的属性来控制自动授予的权限。对于组,该属性名为hive.security.authorization.createtable.group.grants;对于角色,这个属性是hive.security.authorization.createtable.role.grants。这些属性的值的形式和前面介绍的是相同的。