Hadoop web UIの認証機能を試す

HadoopでNameNodeやJobTrackerのWebUIを利用するというのは一般的ですが、一般ユーザーには公開したくない場合もあります。設定方法についての質問があったので、CDH3の検証環境を作って試してみました。
まずその前に:
HadoopのHDFS、MapReduceにはそれぞれWebUIの機能が備わっており、下記のポート番号にアクセスすることで、それぞれ情報の収集等が可能です。

  • NameNode: http://<NameNode address>:50070
  • JobTracker: http://<JobTracker address>:50030
  • ※DataNode, TaskTrackerは割愛

WebUIの認証を試す

ClouderaのサイトからCDH3のドキュメントを見ていたところ、「Authentication for Hadoop HTTP web-consoles」という記事を発見。
http://archive.cloudera.com/cdh/3/hadoop/HttpAuthentication.html

この機能はHADOOP-7119をCDH3u2にバックポートしているので、まずはトレーニングVM(CDH3u1)の環境をyumでアップデートします。CDH3u3になりました。

[root@localhost ~]# rpm -qa |grep hadoop
hadoop-0.20-namenode-0.20.2+923.197-1
hadoop-0.20-datanode-0.20.2+923.197-1
(略)

ドキュメントに従い、/etc/hadoop/conf/core-site.xmlに下記設定を追加します。今回は”simple”設定でいきます(Kerberosの環境を作るのが面倒だったので)。

hadoop.http.filter.initializers
org.apache.hadoop.security.AuthenticationFilterInitializer
hadoop.security.authentication
simple
simple認証に設定
hadoop.http.authentication.type
simple
Oozieで使用するためのパラメータ。simple認証に設定
hadoop.http.authentication.simple.anonymous.allowed
false
simple認証の時にanonymousでのログインを許さない

続いてsignature secretファイルを作成します。このファイルがないとエラーとなりデーモンが起動しないようです。また、パーミッションを読み取り専用にする必要があります。
[root@localhost ~]# touch /usr/lib/hadoop/hadoop-http-auth-signature-secret
[root@localhost ~]# ls -l /usr/lib/hadoop/hadoop-http-auth-signature-secret
-r–r–r– 1 root root 0 Apr 12 09:04 /usr/lib/hadoop/hadoop-http-auth-signature-secret
これで準備は終わりました。各デーモンを再起動します。

[root@localhost ~]# for i in /etc/init.d/hadoop-0.20-*; do
> $i restart
> done
Stopping Hadoop datanode daemon (hadoop-datanode): stopping datanode
datanode is stopped                                        [  OK  ]
(略)

いよいよ実験

webui_1

HTTP ERROR 401

Problem accessing /index.html. Reason:
AuthenticationToken expired

JobTrackerにアクセスできません。期待通りです。
webui_2
続いてNameNode。こちらも期待通りです。いいですね。

認証を試してみる

さぁ、続いてドキュメントに書いてあったように、URLにuser.nameを付与してアクセスしてみます。まずは存在しないユーザーで試してみます。
http://localhost:50030/?user.name=hogeとしてみました。
webui_3

あれ?

アレ?

アクセスできてる。。そんなユーザーいないはずなのに、なぜ?


結論:

このsimple認証は「Hadoop’s Pseudo/Simple authentication.」というのが原因でした。つまり、user.name=のあとに文字が入っていれば認証が通ってしまう、偽の認証ということですね。
PseudoAuthenticationHandler.javaのコメントには以下のように書かれていました(先に読めって感じですが)

/**
* The PseudoAuthenticationHandler provides a pseudo authentication mechanism that accepts
* the user name specified as a query string parameter.
*
* This mimics the model of Hadoop Simple authentication which trust the ‘user.name’ property provided in
* the configuration object.
* This handler can be configured to support anonymous users.
* The only supported configuration property is:
*

まぁ、デフォルトの認証がないよりマシかもしれませんが、、、。ということで、次回はKerberosを使って認証環境を構築してみようと思います。