Веб-аутентификация Hadoop с использованием Kerberos - PullRequest
4 голосов
/ 15 ноября 2011

Я настроил hadoop с использованием kerberos, все работает нормально, я могу просматривать hdfs, отправлять задания и т. Д. Но не удалось выполнить http-аутентификацию http.

Я использую hadoop-0.20.2 в cdh3u2, который поддерживает HTTP SPNEGO.

HTTP-аутентификация, связанная с аутентификацией в core-site.xml, выглядит следующим образом:

  <!-- HTTP web-consoles Authentication -->
  <property>
    <name>hadoop.http.filter.initializers</name>
    <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
  </property>

  <property>
    <name>hadoop.http.authentication.type</name>
    <value>kerberos</value>
  </property>

  <property>
    <name>hadoop.http.authentication.token.validity</name>
    <value>36000</value>
  </property>

  <property>
    <name>hadoop.http.authentication.signature.secret.file</name>
    <value>/home/hadoop/hadoop/conf/http-secret-file</value>
  </property>

  <property>
    <name>hadoop.http.authentication.cookie.domain</name>
    <value></value>
  </property>

  <property>
    <name>hadoop.http.authentication.simple.anonymous.allowed</name>
    <value>false</value>
  </property>

  <property>
    <name>hadoop.http.authentication.kerberos.principal</name>
    <value>HTTP/hz169-91.i.site.com@I.NETEASE.COM</value>
  </property>

  <property>
    <name>hadoop.http.authentication.kerberos.keytab</name>
    <value>/home/hadoop/hadoop/conf/http.keytab</value>
  </property>
</configuration>

Во время запуска аутентификация http прошла успешно.

2011-11-15 15:43:59,106 INFO org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler: Initialized, principal [HTTP/hz169-91.i.site.com@I.NETEASE.COM] from keytab [/home/hadoop/hadoop/conf/http.keytab]

После просмотра кода я обнаружил, что AuthenticationFilter получает нулевой токен во время doFilter, поэтому аутентификация начинается (код ниже), но авторизация в httpservletrequest равна нулю, поэтому при каждой перезагрузке страницы появляется один журнал. 1011 *

2011-11-15 15:47:52,190 WARN org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler: SPNEGO starting

// org.apache.hadoop.security.authentication.server.KerberosAuthenticationHandler
public AuthenticationToken authenticate(HttpServletRequest request, final HttpServletResponse response)
    throws IOException, AuthenticationException {
    AuthenticationToken token = null;
    String authorization = request.getHeader(KerberosAuthenticator.AUTHORIZATION);
    if (authorization == null || !authorization.startsWith(KerberosAuthenticator.NEGOTIATE)) {
      response.setHeader(KerberosAuthenticator.WWW_AUTHENTICATE, KerberosAuthenticator.NEGOTIATE);
      response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
      if (authorization == null) {
        LOG.warn("SPNEGO starting");
      } else {
        LOG.warn("'" + KerberosAuthenticator.AUTHORIZATION + "' does not start with '" +
            KerberosAuthenticator.NEGOTIATE + "' :  {}", authorization);
      }

Есть ли ошибки конфигурации, или просто мой браузер не поддерживает SPNEGO. Я использую Chrome v16 в Ubuntu 11.04.

У кого-нибудь есть подсказки, чтобы помочь мне разобраться?

Спасибо.

1 Ответ

2 голосов
/ 15 ноября 2011

Первое: спасибо за публикацию полного и рабочего примера о том, как настроить веб-консоли Hadoop для SPNNEGO - у меня возникли проблемы с поиском хорошего примера.

Ваш пример работает для меня после изменения путей к файлам конфигурации (ясоздал hadoop.http.authentication.signature.secret.file , получив несколько случайных байтов из / dev / random, что, как я полагаю, является правильным, хотя я не могу найти никакой документации, поддерживающейэта теория).

Google Chrome поддерживает SPNNEGO с версии 6.0.472 и более поздних версий .Однако, похоже, что в Linux и OSX вы должны передать ему список серверов, для которых все в порядке, чтобы включить его , как описано здесь .Поэтому попробуйте добавить * - auth-server-whitelist = "* example.com, * foobar.com, baz" к командной строке при запуске Chrome.

Еще один способ отладки этогобыло бы использовать более простой браузер.Я бы порекомендовал curl, если ваш curl поддерживает GSS-Negotiate.Проверьте, запустив curl --version

$ curl --version
curl 7.19.7 (i486-pc-linux-gnu) libcurl/7.19.7 OpenSSL/0.9.8k zlib/1.2.3.3 libidn/1.15
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 

Если GSS-Negotiate находится в списке функций, вы можете использовать curl для доступа, например, к веб-консоли namenode:

$ curl -v -u foo --negotiate http://your.namenode.tld:50070

Просто нажмите enter, когда вас попросят ввести пароль хоста.

Это должно дать вам лучшее представление о том, что происходит между клиентом и сервером.

...