說明
- 認(rèn)證(authentication):驗證用戶所用的身份是否是對的
- 授權(quán)(authorization):驗證用戶所用身份操作是否有權(quán)限
目前hive(版本0.12.0)支持簡單的權(quán)限管理,默認(rèn)情況下是不開啟,這樣所有的用戶都具有相同的權(quán)限负蚊,同時也是超級管理員,也就對hive中的所有表都有查看和改動的權(quán)利鞋仍,這樣是不符合一般數(shù)據(jù)倉庫的安全原則的。Hive可以是基于元數(shù)據(jù)的權(quán)限管理搅吁,也可以基于文件存儲級別的權(quán)限管理威创,此次以介紹MetaData權(quán)限管理為主。通過以下配置開啟Hive身份認(rèn)證功能進(jìn)行權(quán)限檢查:
配置
1.開啟啟身份認(rèn)證后似芝,任何用戶必須被grant privilege才能對實體進(jìn)行操作那婉。
hive.security.authorization.enabled = true
2.表示創(chuàng)建表時自動賦予一些用戶或角色相應(yīng)的權(quán)限
hive.security.authorization.createtable.owner.grants = ALL
hive.security.authorization.createtable.role.grants = admin_role:ALL
hive.security.authorization.createtable.user.grants = user1,user2:select;user3:create
3.<!-- 假如出現(xiàn)以下錯誤: Error while compiling statement: FAILED: SemanticException The current builtin authorization in Hive is incomplete and disabled. 需要配置下面的屬性 -->
hive.security.authorization.task.factory = org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl
角色管理
--創(chuàng)建和刪除角色
create role role_name;
drop role role_name;
--展示所有roles
show roles
--賦予角色權(quán)限
grant select on database db_name to role role_name;
grant select on [table] t_name to role role_name;
--查看角色權(quán)限
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
--回收角色權(quán)限
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;
超級權(quán)限
Hive的權(quán)限功能還有一個需要完善的地方,那就是“超級管理員”党瓮。
Hive中沒有超級管理員详炬,任何用戶都可以進(jìn)行Grant/Revoke操作,為了完善“超級管理員”,必須添加hive.semantic.analyzer.hook配置呛谜,并實現(xiàn)自己的權(quán)限控制類在跳。
hive.semantic.analyzer.hook = com.mycompany.AuthHook
- 編譯下面代碼(需要導(dǎo)入依賴antlr-runtime-3.4.jar,hive-exec-0.12.0-cdh5.1.2.jar)
- 打包成jar放置在hive的classpath下(客戶端hive shell所在主機(jī)的hive-env.sh 中的環(huán)境變量:HIVE_AUX_JARS_PATH指向的路徑,此配置僅對hive shell生效)
- hive-site.xml中添加參數(shù)hive.aux.jars.path(目前僅支持本地路徑) = file:///usr/lib/hive/lib/HiveAuthHook.jar(此配置僅對hive server有效)隐岛,最后重啟hiveserver猫妙。
package com.newland;
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 AuthHook extends AbstractSemanticAnalyzerHook {
private static String[] admin = { "root", "hadoop" };
@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:
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)) {
throw new SemanticException(userName
+ " can't use ADMIN options, except " + admin[0] + ","
+ admin[1] + ".");
}
break;
default:
break;
}
return ast;
}
// public static void main(String[] args) throws SemanticException {
// String[] admin = { "admin", "root" };
// String userName = "root";
// for (String tmp : admin) {
// System.out.println(tmp);
// if (!tmp.equalsIgnoreCase(userName)) {
// throw new SemanticException(userName
// + " can't use ADMIN options, except " + admin[0] + ","
// + admin[1] + ".");
// }
// }
// }
}
權(quán)限管理
--賦予用戶權(quán)限
grant [SELECT|...] on [database|table] [db_name|tbl_name ] to user [username];
grant select(tab_col) on table [tbl_name] to user [username];
--回收用戶權(quán)限
revoke [ALL|...] on [database|table] [db_name|tbl_name ] from user [username];
--查看用戶權(quán)限
show grant user [username] on [database|table] [db_name|tbl_name];
HIVE支持以下權(quán)限:
權(quán)限名稱 | 含義 |
---|---|
ALL | 所有權(quán)限 |
ALTER | 允許修改元數(shù)據(jù)(modify metadata data of object)---表信息數(shù)據(jù) |
UPDATE | 允許修改物理數(shù)據(jù)(modify physical data of object)---實際數(shù)據(jù) |
CREATE | 允許進(jìn)行Create操作 |
DROP | 允許進(jìn)行DROP操作 |
INDEX | 允許建索引(目前還沒有實現(xiàn)) |
LOCK | 當(dāng)出現(xiàn)并發(fā)的使用允許用戶進(jìn)行LOCK和UNLOCK操作 |
SELECT | 允許用戶進(jìn)行SELECT操作 |
SHOW_DATABASE | 允許用戶查看可用的數(shù)據(jù)庫 |
附:
登錄hive元數(shù)據(jù)庫,可以發(fā)現(xiàn)以下表:
Db_privs:記錄了User/Role在DB上的權(quán)限
Tbl_privs:記錄了User/Role在table上的權(quán)限
Tbl_col_privs:記錄了User/Role在table column上的權(quán)限
Roles:記錄了所有創(chuàng)建的role
Role_map:記錄了User與Role的對應(yīng)關(guān)系