【精华】Linux用户Hive权限控制实践
? ?hadoop和hive通過客戶機接入到集群生產,客戶機是linux系統,那么linux用戶和hive角色之間是什么關系呢?
? ?或者說,怎么控制linux系統用戶可以細粒度訪問hive的數據庫和表。
2、新建linux用戶和用戶組
? ?1)#groupadd hphs;
? ?2)#useradd -d /home/hphs/ -m hphs -g hphs -G hadoop
? ? ?指定用戶所屬的附加組hadoop;
? ?3)#passwd hphs ?
? ?設置密碼為:123!@#
? ?4)ssh進入hphs,查看所屬群組:
? ? ? #groups
? ? ? 顯示:hphs hadoop
3、回顧下Linux的ACL控制體系
? ?1)3個權限組:owner、group和other;
? ?2)3個權限類:r(讀)、w(寫)和x(執行);
? ? ?r=4,w=2,x=1?
? ? ?若要rwx屬性則4+2+1=7;?
? ? ?若要rw-屬性則4+2=6;?
? ? ?若要r-x屬性則4+1=5。?
? ?3)在hadoop下有個文件test.txt,用hdfs用戶進入:
? ? ?目前?
? ? ?-rw-r--r-- ? 3 hdfs ?supergroup ? ? ? ? ?6 2017-04-05 16:24 /test.txt
? ? ?第一:將組賦予hadoop
? ? ?hadoop fs -chown hdfs:hadoop /test.txt
? ? ?第二:權限修改為組可讀其他用戶不可讀
? ? ?hadoop fs -chmod 740 /test.txt
? ? ?修改后:
? ? ?-rwxr----- ? 3 hdfs hadoop ? ? ? ? ?6 2017-04-05 16:24 /test.txt
4、HDFS訪問控制實踐
? ?集群沒有kerberos認證,所以客戶機的任何linux用戶進入都可以執行hadoop命令。
? ?如果加入kerberos認證,那linux用戶要認證后才能執行hadoop命令。
? ?1)目錄不允許其他用戶讀寫的情形
? ? ?—權限:
? ? drwxrwx--- ? - hbase hadoop ? ? ? ? ? ? ?0 2016-04-14 23:14 /hbase
? ? ?—執行:[hphs@appnode142 hphs]$ hadoop fs -ls /hbase
? ? ? ?提示:ls: Permission denied: user=hphs, access=READ_EXECUTE, inode="/hbase":hbase:hadoop:drwxrwx---
? ?2)目錄允許其他用戶讀的情形
? ? ?—權限:
drwxr-xr-x ? - hdfs ?hadoop ? ? ? ? ? ? ?0 2017-03-15 10:44 /flume?
? ? ?—執行:[hphs@appnode142 hphs]$ hadoop fs -ls /flume
? ? ?可以看到目錄
? ?3)目錄不允許其他用戶寫的情形
? ? ? —權限:
drwxr-xr-x ? - hdfs ?hadoop ? ? ? ? ? ? ?0 2017-03-15 10:44 /flume?
? ? ?—執行:[hphs@appnode142 hphs]$ hadoop fs -mkdir /flume/test
? ? ?提示:mkdir: Permission denied: user=hphs, access=WRITE, inode="/flume":hdfs:hadoop:drwxr-xr-x
? ?4)文件允許組讀但不允許其他用戶讀的情形
? ? ?[hphs@appnode142 hdfs]$ hadoop fs -ls /test.txt
? ? ?-rwxr----- ? 3 hdfs hadoop ? ? ? ? ?6 2017-04-05 16:24 /test.txt
? ? ?因為hphs也屬于hadoop組,所以可以讀取,但若要執行,則:
? ? [hphs@appnode142 hdfs]$ hadoop fs -text /test.txt
? ? text: Permission denied: user=hphs, access=READ, inode="/test.txt":hdfs:hadoop:-rwxr-----
? ?如此可以總結:
? ?linux用戶在hdfs上訪問權限是通過ACL控制的。
5、總結Hive權限控制體系
? ?1)Hive授權的核心就是用戶(User)、組(Group)、角色(Role);
? ? ?Hive中的角色可以理解為一部分有一些相同“屬性”的用戶或組或角色的集合。
? ? ?用戶和組使用的是Linux機器上的用戶和組,而角色是Hive本身創建。
? ?2)例子:
? ? ?用戶 ? ? 組 ? ? ? ? ? ?
? ? ?db1 ? ? ?group_db1
? ? ?db2 ? ? ?group_db2
? ? ?dball ? ?group_all
? ? 有三個用戶分別屬于group_db1、group_db2、group_all;
? ? group _db1、group _db2、group_all分別表示該組用戶可以訪問數據庫1、數據庫2和可以訪問1、2兩個數據庫;
? ? 創建role_db1和role_db2,分別并授予訪問數據庫1和數據庫2的權限,再將role_db1賦給group_db1(或者該組的所有用戶),將role_db2賦給group_db2,就可以是實現指定用戶訪問指定數據庫。
? ? 最后創建role_all指向role_db1、role_db2(role_all不需要指定訪問那個數據庫),然后role_all授予group_all,則group_all中的用戶可以訪問兩個數據庫。
? ??
6、Hive權限控制啟用需要配置hive-site.xml文件,如下:
? ?
<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> </property> <property><name>hive.security.authorization.createtable.owner.grants</name><value>ALL</value> </property>其中hive.security.authorization.createtable.owner.grants設置成ALL表示用戶對自己創建的表是有所有權限。
? 開啟了權限控制,卻發現任何用戶都可以Grant/Revoke操作,需要設置hive管理員賬戶。
7、Hive管理員權限
? ?1)自定義權限控制類
? ? ??
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; public class HiveAdmin extends AbstractSemanticAnalyzerHook {private static String admin = "hdfs";@Overridepublic 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:String userName = null;if (SessionState.get() != null && SessionState.get().getAuthenticator() != null){userName=SessionState.get().getAuthenticator().getUserName();}if (!admin.equalsIgnoreCase(userName)) {throw new SemanticException(userName + " can't use ADMIN options, except " + admin +".");}break;default:break;}return ast;} }2)打包上傳HiveAdmin.jar
? ? ?hive-env.sh配置對hive的shell終端生效
? ? ?export HIVE_AUX_JARS_PATH=file:///home/hdfs/fangjs/HiveAdmin.jar?
? ? ?hive-site.xml配置對hiveserver2生效 ?
? ? ?<property> ?
? ? ? ? <name>hive.aux.jars.path</name> ?
? ? ? ? <value>file:///home/hdfs/fangjs/HiveAdmin.jar</value> ?
? ? </property> ?
? ?3)添加控制類HiveAdmin到Hive的配置文件(hive-site.xml)中
? ? <property>?
? ? <name>hive.semantic.analyzer.hook</name>?
? ? <value>com.hive.HiveAdmin</value>?
? ? </property>
? ?4)添加了配置文件以后,重啟Hive Server生效。
? ? ?至此,只有hdfs用戶是hive管理員,可以進行Grant/Revoke操作。
8、Hive權限控制實踐
? ?1)現在有兩個linux用戶和用戶組,如下:
? ? ?hdfs:hdfs ?-具有hive管理員權限
? ? ?hphs:hphs
? ? ?hive中有一個數據庫cardb和數據表car_hosturl_m;
? ?
? ?2)為不修改hive-site.xm文件和重啟Hive Server,這里直接在hive打開的shell上啟用權限控制功能,相當于第6步作用。
? ? ?set hive.security.authorization.enabled=true;
? ? ?set hive.security.authorization.createtable.owner.grants = ALL;
? ? ?set hive.security.authorization.task.factory = org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl;
? ? ??
? ? ?第三個設置是為避免如出現FAILED: SemanticException The current builtin authorization in Hive is incomplete and disabled.這個異常。
? ?
? ?3)為不修改hive-site.xm文件和重啟Hive Server,這里直接hive打開的shell上上傳HiveAdmin.jar包并設置參數,相當于第7步作用; ?
? ? ?set hive.semantic.analyzer.hook=com.hive.HiveAdmin;
? ? ?add jar /home/hdfs/fangjs/HiveAdmin.jar;
? ? ?
? ?4)以下面兩個角色操作為例
? ? ?hive>create role role_cardb;
? ? ?hive>GRANT SELECT ON DATABASE cardb TO USER hdfs;
? ? ?hdfs和hphs都可以能使用權限操作命令;
? ? ?配置com.hive.HiveAdmin類后發現沒生效,懷疑和環境有關,或者要重啟hiveserver才有效。
? ? ?查看hive版本#hive --version ? 執行結果:Hive 1.1.0-cdh5.5.0
? ? ?hive版本Hive 1.2.1000.2.5.3.0-37上類org.apache.hadoop.hive.ql.exec.DDLTask實現管理員權限。
? ? ?Hive管理員權限待繼續研究新版本的Hive。
9、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 : 允許用戶查看可用的數據庫
10、登錄hive元數據庫,可以發現以下表:
? ? Db_privs:記錄了User/Role在DB上的權限
? ? Tbl_privs:記錄了User/Role在table上的權限
? ? Tbl_col_privs:記錄了User/Role在table column上的權限
? ? Roles:記錄了所有創建的role
? ? Role_map:記錄了User與Role的對應關系
? ? ?
11、參考資料:
? ?http://blog.csdn.net/fjssharpsword/article/details/51312153
? ?http://www.aboutyun.com/thread-12549-1-1.html
? ?http://blog.csdn.net/kwu_ganymede/article/details/52728623
? ?http://blog.csdn.net/kwu_ganymede/article/details/52733021
總結
以上是生活随笔為你收集整理的【精华】Linux用户Hive权限控制实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【正一专栏】放牛
- 下一篇: (转载)详解Hive配置Kerberos