Hue 创建用户后无权限访问Hive

image.png

在hue中创建完用户后,还需要在主节点中创建这个user并在hive和hadoop中为这个user赋予权限,经过我这边的测试,步骤如下:

Hue添加用户

添加管理员用户

##进入hue目录
cd /usr/lib/hue/

##创建超级用户
sudo build/env/bin/hue  createsuperuser

添加普通用户(按照以下步骤授予权限)

通过Hue访问hive,首先要在Hue创建登录用户。

Linux添加用户

##在主节点中创建user emrhue
sudo useradd emrhue  #添加用户
sudo passwd emrhue   #设置用户密码
gpasswd -a emrhue emrhue   #给用户分组

Hive 配置文件添加权限

SQL Standards Based Authorization in HiveServer2默认提供两种角色:public和admin,所有用户默认属于角色public,而授权则必须是具有角色admin的用户才可以完成(普通用户仅可以将自己获得的权限授权给其它用户),由于EMR中hive是默认没有admin user的,为了在hive中创建role,您需要使用amin权限,因此您需要配置hive配置文件/etc/hive/conf/hive-site.xml并加入下面的配置:

$ vim /etc/hive/conf/hive-site.xml
###... ... ...
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>

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

<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl</value>
</property>

<property>
<name>hive.users.in.admin.role</name>
<value>hive</value>
<description>定义超级管理员 启动的时候会自动创建Comma separated list of users who are in admin role for bootstrapping.
More users can be added in ADMIN role later.</description>
</property>
###... ... ...

重启hive 服务

systemctl restart hive-server2.service
systemctl restart hive-webhcat-server.service
systemctl restart  hive-hcatalog-server.service

检查hive 启动状态

sudo systemctl status *hive*

授权用户

apache官方的hive权限文档请参考:https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization

进入hive shell

##使用上面授权的超级管理员用户进入hive shell:
[root@ip-172-21-3-198 ~]# su hive -s /bin/bash -c 'hive'

创建hive角色

##显示用户当前角色的列表。
hive> SHOW CURRENT ROLES;
SHOW CURRENT ROLES;
OK
public

##指定 admin 角色将成为当前角色中的唯一角色。
hive> set role admin;
set role admin;
OK

##创建新角色(将其与系统用户绑定,同名即可)。只有管理员角色具有此权限。
hive> create role emrhue;
create role emrhue;
OK

##查看已经有的角色
hive> show roles;
show roles;
OK
admin
emrhue
public

报错信息:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Current user : root is not allowed to add roles. User has to belong to ADMIN role and have it as current role, for this action.原因分析:
创建hive的角色需要用admin权限的账号,前面步骤中设置的hive.users.in.admin.role=hive,所以需要切换linux hive账户来执行命令

对账户授权

创建好emr-hive账户后,对账户进行授权,操作如下

##把default数据库的所有权限赋予emrhue角色(根据实际情况修改数据库名)
hive> grant all on database default to role emrhue with grant option;

##将角色emrhue赋予linux用户emrhue
hive> grant role emrhue to user emrhue;
grant role emrhue to user emrhue;

##赋予 default数据库test表的select权限给用户emrhue ,emrhue用户就可以正常查询hive中的test表中的数据了
hive> grant select on test to user emrhue;

##赋予这个用户test表全部的权限可以用下面的语句,再次测试insert语句就可以正常执行了
hive> grant all on table test to role emrhue with grant option;

##授予用户default数据库 select权限,这样用户下的角色拥有同样权限(根据实际情况修改数据库名)
hive> grant select on database default to user emrhue;

##把某个库的权限直接给用户!
hive> grant ALL ON DATABASE default TO USER emrhue;
##列出给定角色/用户已授予的所有角色,其中principal_name 是用户或角色的名称。
hive> SHOW ROLE GRANT ROLE emrhue;
hive> SHOW ROLE GRANT USER emrhue;

##查看角色已有权限
hive> show grant role emrhue;

##查看角色在default数据库的已有权限
hive> show grant role emrhue on database default;

##查看指定用户在某个库的权限
hive> show grant user emrhue on database default;

##列出属于此角色的所有角色和用户,只有管理员角色具有此权限。
hive> SHOW PRINCIPALS emrhue;

##回收用户role角色
#hive> revoke role emrhue from user emrhue;

##回收用户权限
#hive> revoke all from user emrhue;

##回收角色对库的所有权限
#hive> revoke all on database default from role emrhue;

HDFS权限控制

切换用户emrhue后,进入hive shell 报错:Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: user=emrhue, access=WRITE, inode="/user":hdfs:hdfsadmingroup:drwxr-xr-x

设置hive配置文件

# vim /etc/hive/conf/hive-site.xml
##
<property>
    <name>hive.security.metastore.authorization.manager</name>
    <value>org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider</value>
</property>

<property>
<name>hive.metastore.pre.event.listeners</name>
    <value>org.apache.hadoop.hive.ql.security.authorization.AuthorizationPreEventListener</value>
</property>

<property>
<name>hive.security.metastore.authenticator.manager</name>
    <value>org.apache.hadoop.hive.ql.security.HadoopDefaultMetastoreAuthenticator</value>
</property>

HDFS权限设置

EMR的Kerberos安全集群已经设置了Hive的warehouse的HDFS相关权限;
对于非Kerberos安全集群,用户需要做如下步骤设置hive基本的HDFS权限:

##切换hadoop用户
##权限设置成777,1表示stick bit(不能删除别人创建的文件/文件夹)
su hadoop -c 'hadoop fs -chmod -R 1777 /user/hive/warehouse'

有了上述设置基础权限后,可以通过对warehouse文件夹授权,让相关用户/用户组能够正常创建表/读写表等

##设置hdfs用户权限
su hadoop -c 'hadoop fs -setfacl -m user:emrhue:rwx /user/hive/warehouse'

##设置hdfs用户组权限
su hadoop -c 'hadoop fs -setfacl -m group:emrhue:rwx /user/hive/warehouse'

Hive 语法介绍

角色管理命令

创建/显示角色
##显示用户当前角色的列表。用户的所有操作都是通过查看用户的权限和用户的所有当前角色来授权的。
##默认的当前角色具有除管理员角色之外的所有用户角色(即使用户也属于管理员角色)。任何用户都可以运行此命令。
hive> SHOW CURRENT ROLES;
SHOW CURRENT ROLES;
OK
public

##语法:SET ROLE (role_name|ALL|NONE);
##如果指定了role_name,则该角色将成为当前角色中的唯一角色。
##将role_name设置为 ALL 将刷新当前角色列表(如果向用户授予了新角色),并将其设置为默认角色列表。
##将role_name设置为 NONE 将删除当前用户的所有当前角色。(它在HIVE-11780中引入,并将包含在即将推出的1.3.0和1.2.2版本中。
##如果将用户不属于的角色指定为role_name,则会导致错误。
hive> set role admin;
set role admin;
OK

##语法:CREATE ROLE role_name;
##创建新角色。只有管理员角色具有此权限。
##角色名称 ALL、DEFAULT 和 NONE 均为保留。
hive> create role role_admin;
create role role_admin;
OK

##查看已经有的角色
hive> show roles;
show roles;
OK
admin
public
role_admin

##列出属于此角色的所有角色和用户。
##只有管理员角色具有此权限。
hive> SHOW PRINCIPALS emrhue;
SHOW PRINCIPALS role_admin;
OK

##删除角色(只有管​​理员角色对此具有权限。)
DROP ROLE role_admin;
授予角色
##将一个或多个角色授予其他角色或用户。
##如果指定了“WITH ADMIN OPTION”,则用户获得将角色授予其他用户/角色的权限。
##如果授权语句最终创建了角色之间的循环关系,则该命令将失败并出现错误。

GRANT role_name [, role_name] ...
TO principal_specification [, principal_specification] ...
[ WITH ADMIN OPTION ];

principal_specification
  : USER user
  | ROLE role
撤销角色
##从 FROM 子句中的用户/角色撤消角色的成员资格。
##从 Hive 0.14.0 开始,可以使用 REVOKE ADMIN OPTION FOR <role> ( HIVE-6252 ) 仅撤销 ADMIN OPTION。

REVOKE [ADMIN OPTION FOR] role_name [, role_name] ...
FROM principal_specification [, principal_specification] ... ;

principal_specification
  : USER user
  | ROLE role
显示角色授予
SHOW ROLE GRANT (USER|ROLE) principal_name;
  • 其中principal_name是用户或角色的名称。
  • 列出给定用户或角色已被授予的所有角色。
  • 目前任何用户都可以运行此命令。但这可能会在未来发生变化,以允许用户仅看到他们自己的角色授予,并且需要额外的权限才能查看其他用户的角色授予。
##显示角色授予示例
0: jdbc:hive2://localhost:10000> GRANT role1 TO USER user1;
No rows affected (0.058 seconds)

0: jdbc:hive2://localhost:10000> SHOW ROLE GRANT USER user1;
+---------+---------------+----------------+----------+
|  role   | grant_option  |   grant_time   | grantor  |
+---------+---------------+----------------+----------+
| public  | false         | 0              |          |
| role1   | false         | 1398284083000  | uadmin   |
+---------+---------------+----------------+----------+

管理对象权限

● SELECT 权限– 授予对对象的读取权限。
● INSERT 权限– 提供向对象(表)添加数据的能力。
● UPDATE 权限——提供对对象(表)运行更新查询的能力。
● DELETE 权限——提供删除对象(表)中数据的能力。
● ALL PRIVILEGES – 赋予所有权限(转换为上述所有权限)。

授予对象权限语法
GRANT
    priv_type [, priv_type ] ...
    ON table_or_view_name
    TO principal_specification [, principal_specification] ...
    [WITH GRANT OPTION];
撤销对象权限语法
REVOKE [GRANT OPTION FOR]
    priv_type [, priv_type ] ...
    ON table_or_view_name
    FROM principal_specification [, principal_specification] ... ;

principal_specification
  : USER user
  | ROLE role

priv_type
  : INSERT | SELECT | UPDATE | DELETE | ALL
  • 如果用户被授予对表或视图的“使用 GRANT 选项”的权限,则该用户还可以授予/撤消其他用户和角色对这些对象的权限。从 Hive 0.14.0 开始,可以使用 REVOKE GRANT 选项 (HIVE-7404) 删除权限的授予选项,同时仍保留权限<privilege>。
  • 请注意,对于 REVOKE 语句,当前不支持 CASCADE 的 DROP-BEHAVIOR 选项(在 SQL 标准中)。因此,revoke 语句不会删除任何从属特权。有关 CASCADE 行为的详细信息,您可以查看 Postgres 吊销文档。
库级的权限
##授予所有权限给某个用户
grant all on msta to user {userName};

##授权admin privilege权限
grant ADMIN PRIVILEGE on database {dbName} to user {userName};

##授予某个库的权限给某个用户
grant select on database {dbName} to user {userName};
grant insert on database {dbName} to user {userName};
grant update on database {dbName} to user {userName};
grant delete on database {dbName} to user {userName};

##回收某个库的权限给某个用户
revoke select on database {dbName} from user {userName};
revoke insert on database {dbName} from user {userName};
revoke update on database {dbName} from user {userName};
revoke delete on database {dbName} from user {userName};

##查看指定用户在所有库下面的权限
show grant user {userName};

##查看指定用户在某个库的权限
show grant user {userName} on database {dbName};
表级的权限
##授予表的权限给某个用户
grant create on database {dbName} to user {userName};
grant select on table {dbName}.tableName to user {userName};
grant insert on table {dbName}.tableName to user {userName};
grant update on table {dbName}.tableName to user {userName};
grant delete on table {dbName}.tableName to user {userName};

##回收某个用户的表的权限
revoke create on table {dbName}.tableName from user {userName}; 
revoke select on table {dbName}.tableName from user {userName};
revoke insert on table {dbName}.tableName from user {userName};
revoke update on table {dbName}.tableName from user {userName}; 
revoke delete on table {dbName}.tableName from user {userName};

##查看指定用户在指定表的权限
show grant user {userName} on table {dbName}.{tableName};
附录:常用的授权关键字
权限解释
ALTER更改表结构,创建分区
CREATE创建表
DROP删除表,或分区
INDEX创建和删除索引
LOCK锁定表,保证并发
SELECT查询表权限
SHOW_DATABASE查看数据库权限
UPDATE为表加载本地数据的权限