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

Daniel Templeton commented on YARN-4632:
----------------------------------------

Well, *that* was an entertaining rabbit hole.  [~daryn], it would appear that 
you are correct.  To save others from tilting at this particular windmill in 
the future, I will document my journey here.

When the client wants to run a YARN app against a secure HDFS cluster, it has 
to be pass that application a delegation token (DT) that tells HDFS that the 
YARN is allowed to access HDFS as the client.  That token gets serialized to 
bytes and passed over to the RM as part of the launch context.  When the RM 
launches the app, the first thing it does is try to renew all the tokens for 
the app.  The DT contains the principal of the service that is allowed to renew 
it.  If that service principal doesn't match the name of the RM, the token 
renewal will fail, causing the app launch to fail.

The token's renewer string is something the client provides to HDFS when it 
requests the DT.  To find the RM's service name, the client typically looks up 
the {{YarnConfiguration.RM_PRINCIPAL}} in the conf.  That configuration will 
typically list the service's hostname as {{_HOST}} to allow the hostname to be 
replaced in the event of HA YARN.  That {{_HOST}} placeholder has to be 
replaced by the RM's hostname by the client.  The point of this JIRA was to try 
to move that hostname replacement out of the client's hands.

The problem is that the renewer string that the client sets is stashed away 
deep inside the token, so once it's set, it's hard to unset.  It is 
theoretically possible to create a new token based on the original token, 
except fixing the {{_HOST}} string in the renewer, but the bad news is that 
creating a new HDFS token can only be done by a service that has access to 
HDFS's delegation secret manager service, which is not exposed outside HDFS.  
The net result is that the only code that can change the renewer principal is 
HDFS itself.  Since the token creation also requires the client's principal, 
the client is the only one that can do it.  Q.E.D.

I now realize that it doesn't actually make any sense to have the renewer set 
anywhere other than the client code.  The whole point of the operation is for 
the client to explicitly grant access to the renewer to keep a token alive.  
Anything other than the client being the one to name the renewer breaks the 
security chain.  The only viable approach to  solving the problem this JIRA set 
out to solve is to make the {{_HOST}} replacement as simple as possible.  See 
YARN-4629.  It's not a complete solution, but it's all we've got.

> Replacing _HOST in RM_PRINCIPAL should not be the responsibility of the 
> client code
> -----------------------------------------------------------------------------------
>
>                 Key: YARN-4632
>                 URL: https://issues.apache.org/jira/browse/YARN-4632
>             Project: Hadoop YARN
>          Issue Type: Improvement
>          Components: api, resourcemanager
>    Affects Versions: 2.7.1
>            Reporter: Daniel Templeton
>            Assignee: Daniel Templeton
>            Priority: Critical
>
> It is currently the client's responsibility to call 
> {{SecurityUtil.getServerPrincipal()}} to replace the _HOST placeholder in any 
> principal name used for a delegation token.  This is a non-optional operation 
> and should not be pushed onto the client.
> All client apps that followed the distributed shell as the canonical example 
> failed to do the replacement because distributed shell fails to do the 
> replacement.  (See YARN-4629.)  Rather than fixing the whole world, since the 
> whole world use distributed shell as a model, let's move the operation into 
> YARN where it belongs.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to