HIVE的权限控制和超级管理员的实现

Hive用户权限管理

从remote部署hive和mysql元数据表字典看,已经明确hive是通过存储在元数据中的信息来管理用户权限。现在重点是Hive怎么管理用户权限。首先要回答的是用户是怎么来的,发现hive有创建角色的命令,但没有创建用户的命令,显然Hive的用户不是在mysql中创建的。在回答这个问题之前,先初步了解下Hive的权限管理机制。

Hive用户组和用户即Linux用户组和用户,和hadoop一样,本身不提供用户组和用户管理,只做权限控制。

一、hive-site.xml 中配置

<property>
<name>hive.users.in.admin.role</name>
<value>root</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>
<property>
<name>hive.metastore.authorization.storage.checks</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.execute.setugi</name>
<value>false</value>
</property>
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
<description>开启权限 enable or disable thehive client authorization</description>
</property>
<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>ALL</value>
<description>表的创建者对表拥有所有权限the privileges automaticallygranted to the owner whenever a table gets created. An example like"select,drop" will grant select and drop privilege to the owner ofthe table</description>
</property>
<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl</value>
<description>进行权限控制的配置。</description>
</property>
<property>
<name>hive.semantic.analyzer.hook</name>
<value>com.hive.HiveAdmin</value>
<description>使用钩子程序,识别超级管理员,进行授权控制。</description>
</property>
<property>
<name>hive.users.in.admin.role</name>
<value>root</value>
<description>指定的用户为admin角色,多个用户以逗号分隔
Comma separated list of users who are in admin role for bootstrapping.
More users can be added in ADMIN role later.</description>
</property>
复制代码
1、自定义Hive权限管理

在代码中指定了Hive的管理员必须为:root、admin、hive 三者(可做成配置文件或者数据库)

package com.hive;

import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.session.SessionState;
import org.apache.hadoop.hive.ql.security;

/**
 *  * Created by Ganymede on 2016/10/4.
 *  * 限制了超级管理员权限,普通用户不能授权、建库、建表等操作
 *   */
public class HiveAdmin extends AbstractSemanticAnalyzerHook {
    private static String[] admin = {"root", "hadoop", "hive"};  //配置Hive管理员

    @Override
    public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
                              ASTNode ast) throws SemanticException {
        switch (ast.getToken().getType()) {
            case HiveParser.TOK_CREATEDATABASE:
            case HiveParser.TOK_DROPDATABASE:
            case HiveParser.TOK_CREATEROLE:
            case HiveParser.TOK_DROPROLE:
            case HiveParser.TOK_GRANT:
            case HiveParser.TOK_REVOKE:
            case HiveParser.TOK_GRANT_ROLE:
            case HiveParser.TOK_REVOKE_ROLE:
            case HiveParser.TOK_CREATETABLE:
                String userName = null;
                if (SessionState.get() != null
                        && SessionState.get().getAuthenticator() != null) {
                    userName = SessionState.get().getAuthenticator().getUserName();
                }
                if (!admin[0].equalsIgnoreCase(userName)
                        && !admin[1].equalsIgnoreCase(userName) && !admin[2].equalsIgnoreCase(userName)) {
                    throw new SemanticException(userName
                            + " can't use ADMIN options, except " + admin[0] + "," + admin[1] + ","
                            + admin[2] + ".");
                }
                break;
            default:
                break;
        }
        return ast;
    }


    public static void main(String[] args) throws SemanticException {
        String[] admin = {"admin", "root"};
        String userName = "root1";
        for (String tmp : admin) {
            System.out.println(tmp);
            if (!admin[0].equalsIgnoreCase(userName) && !admin[1].equalsIgnoreCase(userName)) {
                throw new SemanticException(userName
                        + " can't use ADMIN options, except " + admin[0] + ","
                        + admin[1] + ".");
            }
        }
    }
}
复制代码
2、打包上传jar配置相关hive文件

打包前需将环境配好,我是直接在服务器打包

先将上述代码中依赖的jar包放到$HADOOP_HOME/lib文件夹下

cp /home/hadoop/hadoop3.1/share/hadoop/common/hadoop-common-3.0.2.jar /home/hive/hive3.1/lib
复制代码

开始打包

javac -Djava.ext.dirs="/home/hive/hive3.1/lib" HiveAdmin.java -d .
jar cf hive-admin.jar com
# 打包完成后,将hive-admin.jar包拷贝到lib下
cp hive-admin.jar /home/hive/hive3.1/lib
复制代码
3、配置完后重启hive相关的服务
hive --service metastore > metastore.log 2>&1 &
hive --service hiveserver2 > hiveserver2.log 2>&1 &
复制代码

二、下面是赋值权限的一些命令操作:

--设置用户组,一个用户可以有多个用户组,SET ROLE命令会把当前用户切换到指定的角色组。
set role ADMIN;
--创建和删除角色  
create role role_name;  
drop role role_name;  
--展示所有roles  
show roles  
--赋予角色权限  
grant select on database zfs_test to role zfs_role;    
grant select on [table] employee to role user1_1;    
--查看角色权限  
show grant role role_name on database db_name;   
show grant role role_name on [table] t_name;   
--角色赋予用户  
grant role role_name to user user_name  
--回收角色权限  
revoke select on database db_name from role role_name;  
revoke select on [table] t_name from role role_name;  
--查看某个用户所有角色  
show role grant user user_name; 
--查看用户被赋予的角色 
show role grant user user1_1;
--查看所有权限的分配情况
show grant
--查看单个角色的权限分配情况
show grant role zfs_role;

创建和删除角色 CREATE ROLE ROLE_NAME
删除角色: DROP ROLE ROLE_NAME
把role_test1角色授权给jayliu用户,命令如下 grant role role_test1 to user jayliu;
查看jayliu用户被授权的角色,命令如下: SHOW ROLE GRANT user jayliu;
取消jayliu用户的role_test1角色,操作命令如下: revoke role role_test1 from user jayliu;
把某个库的所有权限给一个角色,角色给用户!
grant all on database user_lisi to role role_lisi;
grant role role_lisi to user lisi;
把某个库的权限直接给用户!grant ALL ON DATABASE USER_LISI TO USER lisi;
收回 revoke ALLondatabase default from user lisi;
查看用户对数据看的权限 show grant user lisi on database user_lisi;

复制代码
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允许用户查看可用的数据库
查看权限:

SHOW GRANT principal_specification [ON object_type priv_level [(column_list)]]

HIVE操作和权限之间的关系

As of the release of Hive 0.7, only these operations require permissions, according to org.apache.hadoop.hive.ql.plan.HiveOperation:

OperationALTERUPDATECREATEDROPINDEXLOCKSELECTSHOW_DATABASE
LOAD
EXPORT
IMPORT
CREATE TABLE
CREATE TABLE AS SELECT
DROP TABLE
SELECT
ALTER TABLE ADD COLUMN
ALTER TABLE REPLACE COLUMN
ALTER TABLE RENAME
ALTER TABLE ADD PARTITION
ALTER TABLE DROP PARTITION
ALTER TABLE ARCHIVE
ALTER TABLE UNARCHIVE
ALTER TABLE SET PROPERTIES
ALTER TABLE SET SERDE
ALTER TABLE SET SERDEPROPERTIES
ALTER TABLE CLUSTER BY
ALTER TABLE PROTECT MODE
ALTER PARTITION PROTECT MODE
ALTER TABLE SET FILEFORMAT
ALTER TABLE SET LOCATION
ALTER PARTITION SET LOCATION
ALTER TABLE CONCATENATE
ALTER PARTITION CONCATENATE
SHOW DATABASE
LOCK TABLE
UNLOCK TABLE
自动授权

属性hive.security.authorization.createtable.owner.grants决定了

建表者对表拥有的权限,一版情况下,有select和drop

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

类似的,特定的用户可以被在表创建的时候自动授予其权限。

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

当表建立的时候,管理员admin1和用户edward授予读所有表的权限。

而user1只能创建表。

同样的配置也可以作用于组授权和角色授权

hive.security.authorization.createtable.group.grants
hive.security.authorization.createtable.role.grants
复制代码
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值