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 ]
(略)
いよいよ実験
HTTP ERROR 401
Problem accessing /index.html. Reason:
AuthenticationToken expired
JobTrackerにアクセスできません。期待通りです。

続いてNameNode。こちらも期待通りです。いいですね。
認証を試してみる
さぁ、続いてドキュメントに書いてあったように、URLにuser.nameを付与してアクセスしてみます。まずは存在しないユーザーで試してみます。
http://localhost:50030/?user.name=hogeとしてみました。

あれ?
アレ?
アクセスできてる。。そんなユーザーいないはずなのに、なぜ?
結論:
このsimple認証は「Hadoop’s Pseudo/Simple authentication.」というのが原因でした。つまり、user.name=のあとに文字が入っていれば認証が通ってしまう、偽の認証ということですね。
PseudoAuthenticationHandler.javaのコメントには以下のように書かれていました(先に読めって感じですが)
/**
* ThePseudoAuthenticationHandlerprovides 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を使って認証環境を構築してみようと思います。

