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

Allen Wittenauer commented on YARN-4006:
----------------------------------------

bq. Manual testing is acceptable if it is deemed that this is not testable via 
unit-tests. I don't see any comments from anyone saying that.

Then I'll say it.  It's pretty clear just looking at 
TestTimelineAuthenticationFilterInitializer.java that it doesn't test nearly 
enough because of the difficulty involved.  There are *zero* Kerberos tests, 
for example. Whoever committed clearly understood the difficulty invovled, 
otherwise it wouldn't have made it in right? ;)

bq.  we still don't completely understand the patch 

The yarn client expects to be able to ask the auth handler to get a delegation 
token over REST if security is enabled.  The problem, however, is that if 
AltKerberos is enabled, there's no way for the AltKerberos implementation to 
call the DelegationToken manager because the security check is built around the 
idea that there are only two auth handlers (none or Kerberos).  So yarn job 
submission fails because the token fetch fails on the server side because the 
handler in use isn't either of those.  

It's pretty obviously broken if one sets up an AltKerb handler and actually 
tries to use it.

The patch here *does* require a change to AltKerberos implementations (they'll 
likely need to super() up to call the token management routines), but there's 
really no other choice. It could be easily argued that the AltKerberos 
interface/design specs were incomplete and this forces that hole closed.  
There's also the whole side-thing around timeline server not really being 
deployed at a lot of sites (for various reasons) due to being optional.  Hadoop 
2.x has introduced significantly worse incompatibilities throughout it's 
lifecycle, but at least this one is realistic and understandable.

It's worth pointing out that this is probably the first time that I'm aware of 
that REST is being used instead of RPC inside Java code in Hadoop. It's not, 
however, the first time that AltKerberos was completely broken because authors 
of code didn't realize that there were was more than one handler.  The HDFS 
browser fiasco effectively killed 2.5 and 2.6 upgrades for the exact same 
reason.  (although, with 2.6, nothing of value was lost.) Now that both HDFS 
and YARN have broken something in this space, let's hope there isn't a 
threepeat.



> YARN ATS Alternate Kerberos HTTP Authentication Changes
> -------------------------------------------------------
>
>                 Key: YARN-4006
>                 URL: https://issues.apache.org/jira/browse/YARN-4006
>             Project: Hadoop YARN
>          Issue Type: Improvement
>          Components: security, timelineserver
>    Affects Versions: 2.5.0, 2.6.0, 2.7.0, 2.5.1, 2.6.1, 2.8.0, 2.7.1, 2.7.2
>            Reporter: Greg Senia
>            Assignee: Greg Senia
>            Priority: Blocker
>         Attachments: YARN-4006-branch-trunk.patch, 
> YARN-4006-branch2.6.0.patch, sample-ats-alt-auth.patch
>
>
> When attempting to use The Hadoop Alternate Authentication Classes. They do 
> not exactly work with what was built with YARN-1935.
> I went ahead and made the following changes to support using a Custom 
> AltKerberos DelegationToken custom class.
> Changes to: TimelineAuthenticationFilterInitializer.class
> {code}
>    String authType = filterConfig.get(AuthenticationFilter.AUTH_TYPE);
>     LOG.info("AuthType Configured: "+authType);
>     if (authType.equals(PseudoAuthenticationHandler.TYPE)) {
>       filterConfig.put(AuthenticationFilter.AUTH_TYPE,
>           PseudoDelegationTokenAuthenticationHandler.class.getName());
>         LOG.info("AuthType: PseudoDelegationTokenAuthenticationHandler");
>     } else if (authType.equals(KerberosAuthenticationHandler.TYPE) || 
> (UserGroupInformation.isSecurityEnabled() && 
> conf.get("hadoop.security.authentication").equals(KerberosAuthenticationHandler.TYPE)))
>  {
>       if (!(authType.equals(KerberosAuthenticationHandler.TYPE))) {
>         filterConfig.put(AuthenticationFilter.AUTH_TYPE,
>           authType);
>         LOG.info("AuthType: "+authType);
>       } else {
>         filterConfig.put(AuthenticationFilter.AUTH_TYPE,
>           KerberosDelegationTokenAuthenticationHandler.class.getName());
>         LOG.info("AuthType: KerberosDelegationTokenAuthenticationHandler");
>       } 
>       // Resolve _HOST into bind address
>       String bindAddress = conf.get(HttpServer2.BIND_ADDRESS);
>       String principal =
>           filterConfig.get(KerberosAuthenticationHandler.PRINCIPAL);
>       if (principal != null) {
>         try {
>           principal = SecurityUtil.getServerPrincipal(principal, bindAddress);
>         } catch (IOException ex) {
>           throw new RuntimeException(
>               "Could not resolve Kerberos principal name: " + ex.toString(), 
> ex);
>         }
>         filterConfig.put(KerberosAuthenticationHandler.PRINCIPAL,
>             principal);
>       }
>     }
>  {code}



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to