プロキシユーザー - 他のユーザーの代わりに動作するスーパーユーザー

はじめに

このドキュメントでは、スーパーユーザーが他のユーザーの代わりにジョブを送信したり、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」になります。