[ 
https://issues.apache.org/jira/browse/HIVE-5542?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13794807#comment-13794807
 ] 

Sushanth Sowmyan commented on HIVE-5542:
----------------------------------------


The issue here is this:
a) templeton runs as user hcat
b) templeton runs hcat command line as user hcat
c) It sets appropriate delegation tokens so that hdfs and hive metastore 
recognize the command as being run as user hrt_qa, but the current unix user 
for the hcat commandline is user hcat.
d) SBAP uses the hive default authentication provider, which recognizes that 
the user is hcat.
e) The old HdfsAuthorizationProvider did not use the provided authentication 
provider, and instead special-cased how it did authentication by instantiating 
its own ugi. In addition, it would create a proxy user ugi if a setting 
proxy.user.name was set, and that's how it used to authorize whether or not 
"hrt_qa" would perform an action, as opposed to authorizing if "hcat" was 
allowed to do so.

So, we need to create a new ProxyUserAuthenticator which can mock authenticate 
as a particular user that it's asked to authenticate as, and fall back to 
default authentication if not. This can be used as an authenticator for servers 
such as webhcat which have alternate means of figuring out who the user is, and 
telling the hcat command line who they are running as.

A further issue props up if we make the aforesaid change, and that is that 
HCatCli instantiates a SessionState, and therefore a AuthorizationProvider and 
an AuthenticationProvider before it processes its -D parameters, which is what 
is used to provide overrides such as the proxy.user.name that webhcat provides. 
The reason this worked with HdfsAuthorizationProvider before was that it 
instantiated a ugi depending on whether or not that conf parameter was set at 
runtime, for every single authorization call.

So, we need to change the initialization order in the hcat commandline, to make 
sure the -D parameters are processed before we instantiate SessionState as well.

> Webhcat is failing to run ddl command on a secure cluster
> ---------------------------------------------------------
>
>                 Key: HIVE-5542
>                 URL: https://issues.apache.org/jira/browse/HIVE-5542
>             Project: Hive
>          Issue Type: Bug
>          Components: Authentication, WebHCat
>    Affects Versions: 0.12.0
>            Reporter: Sushanth Sowmyan
>            Assignee: Sushanth Sowmyan
>
> When switching client-side authorization from the now deprecated 
> HdfsAuthorizationProvider to SBAP, we noticed an issue while testing. 
> Basically, if, say webhcat were running as user "hcat" on a secure cluster, 
> and we run the following:
> {noformat}
> $ kinit -kt /homes/hrt_qa/hadoopqa/keytabs/hrt_qa.headless.keytab hrt_qa
> $ curl -u : --negotiate -X PUT -H "Content-Type: application/json" -d 
> "{\"comment\":\"Hello there\", \"properties\":{\"a\":\"b\"}}" 
> http://webhcat.abc.blahblah.net:50111/templeton/v1/ddl/database/hcatperms_a
> {noformat}
> {noformat}
> {"errorDetail":"org.apache.hadoop.hive.ql.metadata.AuthorizationException: 
> java.security.AccessControlException: action WRITE not permitted on path 
> hdfs://webhcat.abc.blahblah.net:8020/apps/hive/warehouse for user hcat
>       at 
> org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider.authorizationException(StorageBasedAuthorizationProvider.java:375)
>       at 
> org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider.authorize(StorageBasedAuthorizationProvider.java:273)
>       at 
> org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider.authorize(StorageBasedAuthorizationProvider.java:135)
>       at 
> org.apache.hive.hcatalog.cli.SemanticAnalysis.HCatSemanticAnalyzerBase.authorize(HCatSemanticAnalyzerBase.java:139)
>       at 
> org.apache.hive.hcatalog.cli.SemanticAnalysis.CreateDatabaseHook.authorizeDDLWork(CreateDatabaseHook.java:93)
>       at 
> org.apache.hive.hcatalog.cli.SemanticAnalysis.HCatSemanticAnalyzerBase.authorizeDDL(HCatSemanticAnalyzerBase.java:105)
>       at 
> org.apache.hive.hcatalog.cli.SemanticAnalysis.HCatSemanticAnalyzerBase.postAnalyze(HCatSemanticAnalyzerBase.java:63)
>       at 
> org.apache.hive.hcatalog.cli.SemanticAnalysis.CreateDatabaseHook.postAnalyze(CreateDatabaseHook.java:83)
>       at 
> org.apache.hive.hcatalog.cli.SemanticAnalysis.HCatSemanticAnalyzer.postAnalyze(HCatSemanticAnalyzer.java:243)
>       at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:444)
>       at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:342)
>       at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:977)
>       at org.apache.hadoop.hive.ql.Driver.run(Driver.java:888)
>       at org.apache.hive.hcatalog.cli.HCatDriver.run(HCatDriver.java:43)
>       at org.apache.hive.hcatalog.cli.HCatCli.processCmd(HCatCli.java:251)
>       at org.apache.hive.hcatalog.cli.HCatCli.processLine(HCatCli.java:205)
>       at org.apache.hive.hcatalog.cli.HCatCli.main(HCatCli.java:164)
>       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:212)
> Caused by: java.security.AccessControlException: action WRITE not permitted 
> on path hdfs://webhcat.abc.blahblah.net:8020/apps/hive/warehouse for user hcat
>       at 
> org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider.checkPermissions(StorageBasedAuthorizationProvider.java:351)
>       at 
> org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider.checkPermissions(StorageBasedAuthorizationProvider.java:308)
>       at 
> org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider.authorize(StorageBasedAuthorizationProvider.java:270)
>       ... 20 more
> ","error":"FAILED: AuthorizationException 
> java.security.AccessControlException: action WRITE not permitted on path 
> hdfs://webhcat.abc.blahblah.net:8020/apps/hive/warehouse for user 
> hcat","sqlState":"42000","errorCode":40000,"database":"hcatperms_a"}
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to