在没有SPnego的情况下访问kerberos可以保护WebHDFS

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

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

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

编辑:是否有类似优雅的解决方案,如@SamsonScharfrichter描述的HTTPfs? (据我所知,它不支持委托令牌)

EDIT2:大家好,我还是完全迷失了。 我试图弄清楚Hadoop-auth客户端没有任何运气。 你能再帮我一次吗? 我已经花了几个小时阅读它而没有运气。 这些例子说这样做:

* // 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://: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库 。 准系统版本就像

 URL urlGetToken = new URL("http://:/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://:/webhdfs/v1%AbsPath%?delegation=" +regexToken.group(1) +"&op=...") ; } } httpMessage.close() ; 

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

您可以查看hadoop-auth客户端并创建一个执行第一次连接的服务,然后您可以从中获取“授权”和“X-Hadoop-Delegation-Token”标头和cookie并添加它根据您的基本客户要求。

首先,您需要在运行之前使用kinit对应用程序进行身份validation。 否则,您将不得不为您的用户执行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);