Доступ к защищенной WebHDFS Kerberos без SPnego

1

У меня есть рабочее приложение для управления HDFS с использованием WebHDFS. Мне нужно сделать это на защищенном Kerberos кластере.

Проблема в том, что нет библиотеки или расширения для согласования билета для моего приложения, у меня есть только базовый HTTP-клиент.

Возможно ли создать Java-сервис, который будет обрабатывать обмен билета, и как только он получит билет службы, чтобы просто передать его в приложение для использования в HTTP-запросе? Другими словами, мое приложение попросит службу Java договориться о билетах, и оно вернет билет службы обратно в мое приложение в строке или необработанной строке, и приложение просто привяжет его к HTTP-запросу?

EDIT: Есть ли подобное подобное решение, такое как @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://<host>:14000/webhdfs/v1/?op=liststatus");
    AuthenticatedURL.Token token = new AuthenticatedURL.Token();

    HttpURLConnection conn = new AuthenticatedURL(url, token).openConnection(url, token);
  • 0
    Я полагаю, что это возможно сделать, однако, это просто открывает дыру в безопасности, которую закрыл Kerberos. Я считаю, что Knox / Sentry позволяют вам получать доступ к данным через некоторые точки API, нет?
  • 0
    Спасибо за подсказку, но я не могу использовать Knox, если он открывает дыру в безопасности для обсуждения, когда он работает.
Показать ещё 5 комментариев
Теги:
hadoop
kerberos
webhdfs

2 ответа

4
Лучший ответ

Используя Java-код плюс API-интерфейс Hadoop для открытия сеанса Kerberized, получите токен делегирования для сеанса и передайте этот токен другому приложению - как было предложено @tellisnz - имеет недостаток: Java API требует довольно много зависимостей (т.е. много JAR, а также родные библиотеки Hadoop). Если вы запустите приложение в Windows, в частности, это будет непростая поездка.

Другим вариантом является использование Java-кода плюс WebHDFS для запуска одного запроса SPNEGOed и получения идентификатора делегирования, а затем передачи его другому приложению - для этого параметра требуется абсолютно не библиотека Hadoop на вашем сервере, Версия barebones будет выглядеть как

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() ;

Это то, что я использую для доступа к HDFS из Windows Powershell script (или даже макроса Excel). Предостережение: с Windows вы должны создать свой Kerberos TGT на лету, передав JVM конфигурацию JAAS, указывающую на соответствующий файл keytab. Но это оговорку также применимо к API Java.

  • 1
    Большое спасибо, я попробую это так и дам вам знать, чем все закончилось.
  • 1
    Нам удалось решить эту проблему с помощью токена делегирования для WebHDFS и подписанного файла cookie для HTTPfs. Спасибо большое за вашу помощь.
0

Вы можете взглянуть на клиент 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);
  • 0
    Спасибо за подсказку, я имел в виду использование webhdfs-java-client . Я вероятно изменил бы это, чтобы возвратить Сервисный билет, как только он получен. Мне было интересно, сработает ли это.
  • 0
    Да, это выглядит немного старым. С hadoop-auth это может быть так же просто, как редактировать выше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню