在没有SPnego的情况下访问kerberos安全的WebHDFS



我有一个使用WebHDFS管理HDFS的工作应用程序。我需要能够在Kerberos安全的集群上执行此操作。

问题是,没有库或扩展来协商我的应用程序的票证,我只有一个基本的HTTP客户端。

是否可以创建一个Java服务来处理票证交换,一旦获得服务票证,就可以将其传递给应用程序以用于HTTP请求?换句话说,我的应用程序会要求Java服务协商票证,它会以字符串或原始字符串的形式将服务票证返回给我的应用,而应用程序只会将其附加到HTTP请求?

编辑:有没有类似于@SamsonScharfrichter为HTTPF描述的优雅解决方案?(据我所知,它不支持委派令牌)

编辑2:嗨,伙计们,我仍然完全迷路了。我试图弄清楚Hadoop身份验证客户端,但没有任何运气。你能再帮我一次吗?我已经花了好几个小时读了,运气不好。例子表明:

* // establishing an initial connection
*
* URL url = new URL("http://foo:8080/bar");
* AuthenticatedURL.Token token = new AuthenticatedURL.Token();
* AuthenticatedURL aUrl = new AuthenticatedURL();
* HttpURLConnection conn = new AuthenticatedURL(url, token).openConnection();
* ....
* // use the 'conn' instance
* ....

我已经迷路了。我需要什么初始连接?如何

new AuthenticatedURL(url, token).openConnection();

取两个参数?这种情况没有构造函数。(我因此而出错)。校长不应该指定在某个地方吗?这可能不会这么容易。

URL url = new URL("http://<host>:14000/webhdfs/v1/?op=liststatus");
AuthenticatedURL.Token token = new AuthenticatedURL.Token();
HttpURLConnection conn = new AuthenticatedURL(url, token).openConnection(url, token);

使用Java代码加上Hadoop Java API来打开Kerberized会话,获取会话的委派令牌,并将该令牌传递给另一个应用程序——正如@tellisnz所建议的那样——有一个缺点:Java API需要相当多的依赖项(即大量JAR和Hadoop本地库)。如果你在Windows上运行你的应用程序,这将是一段艰难的旅程。

另一种选择是使用Java代码加上WebHDFS来运行单个SPNEGOed查询和获取委派令牌,然后将其传递给另一个应用程序——该选项需要服务器上绝对没有Hadoop库。裸机版本将是类似的sthg

URL urlGetToken = new URL("http://<host>:<port>/webhdfs/v1/?op=GETDELEGATIONTOKEN") ;
HttpURLConnection cnxGetToken =(HttpURLConnection) urlGetToken.openConnection() ;
BufferedReader httpMessage = new BufferedReader( new InputStreamReader(cnxGetToken.getInputStream()), 1024) ;
Pattern regexHasToken =Pattern.compile("urlString[": ]+(.[^" ]+)") ;
String httpMessageLine ;
while ( (httpMessageLine =httpMessage.readLine()) != null)
{ Matcher regexToken =regexHasToken.matcher(httpMessageLine) ;
if (regexToken.find())
{ System.out.println("Use that template: http://<Host>:<Port>/webhdfs/v1%AbsPath%?delegation=" +regexToken.group(1) +"&op=...") ; }
}
httpMessage.close() ;

这就是我用来从Windows Powershell脚本(甚至Excel宏)访问HDFS的方法。注意:在Windows中,您必须通过向JVM传递一个指向适当keytab文件的JAAS配置来动态创建Kerberos TGT。但无论如何,这个警告也适用于Java API。

您可以查看hadoop-auth客户端并创建一个进行第一次连接的服务,然后您可以从中获取"Authorization"one_answers"X-hadoop-Delegation-Token"标头和cookie,并将其添加到基本客户端的请求中。

首先,在运行之前,您需要使用kinit对用户的应用程序进行身份验证。否则,您将不得不为您的用户进行JAAS登录,本教程提供了一个非常好的概述。

然后,要登录到WebHDFS/HttpFS,我们需要执行以下操作:

URL url = new URL("http://youhost:8080/your-kerberised-resource");
AuthenticatedURL.Token token = new AuthenticatedURL.Token();
HttpURLConnection conn = new AuthenticatedURL().openConnection(url, token);
String authorizationTokenString = conn.getRequestProperty("Authorization");
String delegationToken = conn.getRequestProperty("X-Hadoop-Delegation-Token");
...
// do what you have to to get your basic client connection
...
myBasicClientConnection.setRequestProperty("Authorization", authorizationTokenString);
myBasicClientConnection.setRequestProperty("Cookie", "hadoop.auth=" + token.toString());
myBasicClientConnection.setRequestProperty("X-Hadoop-Delegation-Token", delegationToken);

最新更新