不使用spnego访问kerberos安全的webhdfs

nmpmafwu  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(433)

我有一个使用webhdfs管理hdfs的工作应用程序。我需要能够在kerberos安全的集群上执行此操作。
问题是,没有库或扩展来协商我的应用程序的票证,我只有一个基本的http客户端。
有没有可能创建一个java服务来处理票证交换,一旦获得服务票证,就将其传递给应用程序,以便在http请求中使用?换句话说,我的应用程序会要求java服务协商票证,它会以字符串或原始字符串的形式将服务票证返回给我的应用程序,而应用程序只会将其附加到http请求?
编辑:有没有类似的优雅的解决方案,比如为httpfs描述的@samsonscharfrichter(据我所知,它不支持委托令牌)
嗨,伙计们,我还是完全迷路了。我想弄清楚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);
xxe27gdn

xxe27gdn1#

使用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,您必须动态地创建kerberos tgt,方法是向jvm传递指向相应keytab文件的jaas配置。但无论如何,这个警告也适用于javaapi。

ghhaqwfi

ghhaqwfi2#

您可以查看hadoop auth客户机并创建一个执行第一个连接的服务,然后您可以从中获取“authorization”和“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);

相关问题