hive中有个比较严重的bug,默认情况下任何用户都可以运行grant命令来做授权操作
在Driver.compile方法中,可以增加对AST的hook(hive可以有很多hook,后面分析hive hook的类型和使用阶段),用来做一些forbidden的操作:
compile相关的内容如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get( conf, tree);
List<HiveSemanticAnalyzerHook> saHooks =
getHooks(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK,
HiveSemanticAnalyzerHook.
class
);
// 获取hive.semantic.analyzer.hook的设置,可以是多项,中间以逗号分隔
// Do semantic analysis and plan generation
if
(saHooks !=
null
) {
HiveSemanticAnalyzerHookContext hookCtx =
new
HiveSemanticAnalyzerHookContextImpl();
hookCtx.setConf( conf);
hookCtx.setUserName( userName);
for
(HiveSemanticAnalyzerHook hook : saHooks) {
tree = hook.preAnalyze(hookCtx, tree);
}
sem.analyze(tree, ctx);
hookCtx.update(sem);
for
(HiveSemanticAnalyzerHook hook : saHooks) {
hook.postAnalyze(hookCtx, sem.getRootTasks());
}
}
else
{
sem.analyze(tree, ctx);
}
|
即,compile阶段通过获取hive.semantic.analyzer.hook的设置,来获取对应的hook方法,然后逐一应用到ast中。
具体的代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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
MyAuthHook
extends
AbstractSemanticAnalyzerHook {
private
static
String admin = "hdfs;
@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.equalsIgnoreCase(userName)) {
throw
new
SemanticException(userName
+
" can't use ADMIN options, except "
+ admin +
"."
);
}
break
;
default
:
break
;
}
return
ast;
}
}
|
测试一般用户的grant命令:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
FAILED: SemanticException User:ericni isn't ADMIN, please ask
for
hdfs.
14
/
12
/
04
16
:
24
:
41
ERROR ql.Driver: FAILED: SemanticException User:ericni isn't ADMIN, please ask
for
hdfs.
org.apache.hadoop.hive.ql.parse.SemanticException: User:ericni isn't ADMIN, please ask
for
hdfs.
at com.vipshop.hive.plugin.AuthHook.preAnalyze(AuthHook.java:
44
)
at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:
433
)
at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:
329
)
at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:
1002
)
at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:
1075
)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:
934
)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:
921
)
at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:
281
)
at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:
227
)
at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:
442
)
at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:
860
)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:
733
)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:
666
)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:
39
)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:
25
)
at java.lang.reflect.Method.invoke(Method.java:
597
)
at org.apache.hadoop.util.RunJar.main(RunJar.java:
208
)
|
本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1587253,如需转载请自行联系原作者