복붙노트

[HADOOP] Kerberos에 액세스하는 것은 SPnego없이 WebHDFS를 보호했습니다.

HADOOP

Kerberos에 액세스하는 것은 SPnego없이 WebHDFS를 보호했습니다.

WebHDFS를 사용하여 HDFS를 관리하기위한 작업 응용 프로그램이 있습니다. Kerberos 보안 클러스터에서이 작업을 수행 할 수 있어야합니다.

문제는 앱이나 티켓을 협상 할 라이브러리 나 확장 프로그램이 없다는 것입니다. 기본 HTTP 클라이언트 만 있습니다.

티켓 교환을 처리 할 Java 서비스를 만들 수 있고 일단 HTTP 요청에 사용하기 위해 앱 티켓을 전달하면 서비스 티켓을 가져올 수 있습니까? 즉, 내 응용 프로그램은 Java 서비스에 티켓 협상을 요청하고 문자열이나 원시 문자열로 서비스 티켓을 다시 내 응용 프로그램에 반환하므로 응용 프로그램이 HTTP 요청에이를 첨부합니다.

편집 : @SamsonScharfrichter HTTPfs에 대해 설명한 비슷한 우아한 솔루션이 있습니까? (내 지식으로는 위임 토큰을 지원하지 않습니다.)

EDIT2 : 안녕 얘들 아, 나는 completly 길을 잃었 어. 행운없이 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://<host>:14000/webhdfs/v1/?op=liststatus");
    AuthenticatedURL.Token token = new AuthenticatedURL.Token();

    HttpURLConnection conn = new AuthenticatedURL(url, token).openConnection(url, token);

해결법

  1. ==============================

    1.Java 코드와 Hadoop Java API를 사용하여 Kerberos 세션을 열고 세션의 위임 토큰을 얻은 다음 @tellisnz에서 제안한대로 다른 응용 프로그램에 해당 토큰을 전달하면 단점이 있습니다. Java API에 많은 양이 필요합니다. (예 : 많은 JAR과 Hadoop 기본 라이브러리). Windows에서 앱을 실행하면 특히 어려울 것입니다.

    Java 코드와 Hadoop Java API를 사용하여 Kerberos 세션을 열고 세션의 위임 토큰을 얻은 다음 @tellisnz에서 제안한대로 다른 응용 프로그램에 해당 토큰을 전달하면 단점이 있습니다. Java API에 많은 양이 필요합니다. (예 : 많은 JAR과 Hadoop 기본 라이브러리). Windows에서 앱을 실행하면 특히 어려울 것입니다.

    또 다른 옵션은 Java 코드와 WebHDFS를 사용하여 단일 SPNEGOed 쿼리를 실행하고 위임 토큰을 얻은 다음 다른 응용 프로그램에 전달하는 것입니다.이 옵션에는 서버에 Hadoop 라이브러리가 전혀 필요하지 않습니다. barebones 버전은 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에서는 적절한 keytab 파일을 가리키는 JAAS 구성을 JVM에 전달하여 Kerberos TGT를 즉석에서 만들어야합니다. 그러나이 경고는 Java API에도 적용됩니다.

  2. ==============================

    2.hadoop-auth 클라이언트를 살펴보고 첫 번째 연결을 수행하는 서비스를 만든 다음 'Authorization'및 'X-Hadoop-Delegation-Token'헤더와 쿠키를 가져 와서 추가 할 수 있습니다 기본 고객의 요청에 따라

    hadoop-auth 클라이언트를 살펴보고 첫 번째 연결을 수행하는 서비스를 만든 다음 'Authorization'및 'X-Hadoop-Delegation-Token'헤더와 쿠키를 가져 와서 추가 할 수 있습니다 기본 고객의 요청에 따라

    먼저 실행하기 전에 응용 프로그램에 대해 사용자를 인증하기 위해 kinit을 사용해야합니다. 그렇지 않으면, 사용자를 위해 JAAS 로그인을해야 할 것이므로,이 튜토리얼은 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);
    
  3. from https://stackoverflow.com/questions/37459073/accessing-kerberos-secured-webhdfs-without-spnego by cc-by-sa and MIT license