このドキュメントでは、スーパーユーザーが他のユーザーの代わりにジョブを送信したり、HDFSにアクセスしたりする方法について説明します。
次のセクションで説明するコード例は、以下のユースケースに適用できます。
ユーザー名「super」のスーパーユーザーは、ユーザー「joe」の代わりにジョブを送信し、HDFSにアクセスしたいと考えています。スーパーユーザーはKerberosクレデンシャルを持っていますが、ユーザー「joe」は持っていません。タスクはユーザー「joe」として実行する必要があり、ネームノードへのファイルアクセスはすべてユーザー「joe」として行う必要があります。ユーザー「joe」は、「super」のKerberosクレデンシャルで認証された接続で、ネームノードまたはジョブトラッカーに接続できる必要があります。言い換えれば、「super」はユーザー「joe」になりすましています。
Apache Oozieなど、一部の製品ではこれが必要です。
この例では、「super」のクレデンシャルを使用してログインし、「joe」のプロキシユーザーUGIオブジェクトが作成されます。操作はこのプロキシユーザーUGIオブジェクトのdoAsメソッド内で実行されます。
... //Create ugi for joe. The login user is 'super'. UserGroupInformation ugi = UserGroupInformation.createProxyUser("joe", UserGroupInformation.getLoginUser()); ugi.doAs(new PrivilegedExceptionAction<Void>() { public Void run() throws Exception { //Submit a job JobClient jc = new JobClient(conf); jc.submitJob(conf); //OR access hdfs FileSystem fs = FileSystem.get(conf); fs.mkdir(someFilePath); } }
プロパティ`hadoop.proxyuser.$superuser.hosts`と、`hadoop.proxyuser.$superuser.groups`または`hadoop.proxyuser.$superuser.users`、あるいはその両方を使用して、プロキシユーザーを設定できます。
core-site.xmlで以下のように指定することにより、`super`という名前のスーパーユーザーは、`host1`と`host2`からのみ接続して、`group1`と`group2`に属するユーザーになりすますことができます。
<property> <name>hadoop.proxyuser.super.hosts</name> <value>host1,host2</value> </property> <property> <name>hadoop.proxyuser.super.groups</name> <value>group1,group2</value> </property>
これらの設定が存在しない場合、なりすましは許可されず、接続は失敗します。
より緩やかなセキュリティが望ましい場合は、ワイルドカード値 `*` を使用して、任意のホストからのなりすましや任意のユーザーのなりすましを許可できます。たとえば、core-site.xmlで以下のように指定することにより、任意のホストからアクセスする`oozie`という名前のユーザーは、任意のグループに属する任意のユーザーになりすますことができます。
<property> <name>hadoop.proxyuser.oozie.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.oozie.groups</name> <value>*</value> </property>
`hadoop.proxyuser.$superuser.hosts`は、IPアドレスのリスト、CIDR形式のIPアドレス範囲、ホスト名を受け入れます。たとえば、以下のように指定することにより、`10.222.0.0-10.222.255.255`および`10.113.221.221`の範囲内のホストからアクセスする`super`という名前のユーザーは、`user1`および`user2`になりすますことができます。
<property> <name>hadoop.proxyuser.super.hosts</name> <value>10.222.0.0/16,10.113.221.221</value> </property> <property> <name>hadoop.proxyuser.super.users</name> <value>user1,user2</value> </property>
クラスタがセキュアモードで実行されている場合、スーパーユーザーは別のユーザーになりすますためにKerberosクレデンシャルを持っている必要があります。
この機能に委任トークンを使用することはできません。スーパーユーザーが自身の委任トークンをプロキシユーザーUGIに追加すると、プロキシユーザーがスーパーユーザーの権限でサービスに接続できるようになるため、これは誤りです。
ただし、スーパーユーザーが「joe」に委任トークンを付与したい場合は、上記のコード例と同じ方法で、最初に「joe」になりすまして「joe」の委任トークンを取得し、「joe」のUGIに追加する必要があります。このようにして、委任トークンの所有者は「joe」になります。