4

kerberos を使用して Hadoop を構成しました。すべて正常に動作し、hdfs を参照したり、ジョブを送信したりできます。ただし、http Web 認証に失敗しました。

HTTP SPNEGO をサポートする cdh3u2 で hadoop-0.20.2 を使用します。

core-site.xml の HTTP 認証関連の構成は次のとおりです。

  <!-- 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 中に null トークンを取得するため、認証が開始されますが (以下のコード)、httpservletrequest での承認は null であるため、ページをリロードするたびに 1 つのログが表示されます。

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 をサポートしていないだけですか? Ubuntu 11.04 で Chrome v16 を使用しています。

誰かが私がそれを理解するのを助ける手がかりを持っていますか?

ありがとう。

4

1 に答える 1

2

最初に: SPNNEGO 用に Hadoop Web コンソールを構成する方法について、完全で実用的な例を投稿していただきありがとうございます。良い例を見つけるのに苦労しました。

あなたの例は、構成ファイルへのパスを変更した後に機能します( / dev/randomからランダムなバイトを取得してhadoop.http.authentication.signature.secret.fileを作成しましたが、これは正しいことだと思いますが、その理論を裏付ける文書は見つかりません)。

Google Chrome は、バージョン 6.0.472 以降の SPNNEGO をサポートしています。ただし、Linux および OSX では、ここに記載されているように有効化してもよいサーバーのリストを渡す必要があるようです。そこで、Chrome 起動時のコマンドラインに *--auth-server-whitelist="*example.com,*foobar.com, baz"を追加してみてください。

これをデバッグする別の方法は、より単純なブラウザを使用することです。curl が GSS-Negotiate をサポートしている場合は、curl をお勧めします。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が Features リストにある場合、curl を使用して namenode Web コンソールなどへのアクセスを試みることができます。

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

ホストのパスワードを求められたら、Enter キーを押します。

これにより、クライアントとサーバーの間で何が起こっているかをよりよく理解できるはずです。

于 2011-11-15T19:56:14.250 に答える