如何实现自定义委托令牌

时间:2020-11-08 14:06:49

标签: hadoop token yarn kerberos-delegation

我有以下情况:

  • 我有一个HTTP服务,其中有一个具有密钥表和kerberos主体的登录用户-为示例service_user
  • 然后我有一个客户端,该客户端调用该服务并通过kerberos(spnego)对其进行身份验证-将调用服务的用户命名为client_user
  • 从我的服务中,我想启动一个Yarn Java应用程序(运行良好),最后从Yarn容器中调用需要身份验证的服务的回调端点。
  • 在Yarn容器中,我不是处于kerberized环境中,我只有委派令牌
  • 因此理想情况下,我的服务也应接受spnego和委托令牌身份验证

我看过DelegationTokenAuthenticationFilter,但无法弄清楚应该如何使用它。我将其添加到服务中,发现DelegationTokenAuthenticationHandler#managementOperation可以处理查询部分中有op=GETDELEGATIONTOKEN的请求。如果我从命令行执行类似curl --negotiate -u : http://host:port/callback?op= GETDELEGATIONTOKEN的操作,我会得到一个不错的委托令牌。

但这不是我想要的,对吧?我想做的是:client_user调用我的服务,通过spnego对其进行身份验证,该服务为client_user创建一个自定义委托令牌,将该委托令牌传递给Yarn容器HADOOP_TOKEN_FILE_LOCATION env变量),然后使用创建的委托令牌从Yarn容器中调用服务。

我还尝试以自己的方式创建委托令牌:

DelegationTokenManager tokenManager = new DelegationTokenManager(conf, new Text("..."));
tokenManager.init();
Token<? extends AbstractDelegationTokenIdentifier> token = tokenManager.createToken(ugi, renewer);
Credentials credentials = ...
credentials.addToken(new Text("..."), token);

然后可以在我做过的Yarn容器中找到它

import static org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticator.DELEGATION_TOKEN_HEADER;

UserGroupInformation currentUser = UserGroupInformation.getCurrentUser();
Credentials credentials = currentUser.getCredentials();
Token<? extends TokenIdentifier> delegationToken = credentials.getToken(new Text("..."));
HttpURLConnection connection = ...
connection.setRequestProperty(DELEGATION_TOKEN_HEADER, delegationToken.encodeToUrlString());

我看到DelegationTokenAuthenticationFilter拿起了我的令牌,但这是无效的。关于未签名的一些信息。

我甚至在正确的道路上吗?我是否应该忘掉DelegationTokenAuthenticationFilter并仅仅扩展AuthenticationFilter到可以接受HTTP请求中的自定义委托令牌标头的地方?还是应该使用DelegationTokenAuthenticationFilter并尝试以某种方式覆盖DelegationTokenManager#verifyToken

我看到要在Yarn容器中创建HttpURLConnection,我可以使用DelegationTokenAuthenticatedURL.openConnection,但这需要一个经过kerberized的环境。

0 个答案:

没有答案