Hadoop1.2セットアップ >

目次

はじめに

  • このドキュメントでは、Hadoopのセキュア設定の方法を重点的に解説しています。セキュリティ以外の基本的な設定方法については、まずはHadoop1.2セットアップをご参照ください。
  • セキュアHadoopのアーキテクチャ概要については、HadoopWithSecurityをご参照ください。

他のバージョンのセットアップ

  1. Hadoop1.1withSecurityセットアップ - DEPRECATED
  2. Hadoop1.0withSecurityセットアップ - DEPRECATED
  3. Hadoop0.20.2xxWithSecurityセットアップ - DEPRECATED

セットアップ

Chefレシピ

参考までに、これらはここで説明している環境を構築するChefレシピ(ロール)です。ただし、Java、Kerberos、LDAPの一部およびビルドが必要なHadoopのバイナリについてのセットアップを除きます。

Java

  1. Oracle(旧Sun)のJDKでは、後述のKerberos認証で強度の高いAES256暗号を利用するためには、強度が無制限のJCE管轄ポリシーファイルをインストールする必要があります。インストールにあたっては、Javaにおける高強度暗号の利用をご参照ください。※OpenJDKなどでは不要です。

Kerberos認証環境

  1. 基本的なKerberos AdminサーバおよびKDCの構築については、KerberosセットアップforHadoopをご参照ください。

Kerberos設定ファイル

  • info.pngVer. 1.1以降では、HDFSのチェックポイント機構(およびfsck)のプロトコルとしてSPNEGO/Kerberosが導入されたため、KSSL(Kerberized SSL)に関係する弱強度暗号タイプサポート問題の影響を受けなくなりました。引き続きKSSLも利用可能ではありますが、積極的に選択する理由はもうないでしょう。高強度暗号タイプのみをサポートする設定ファイルを使用します。
  1. /etc/krb5.conf
    1. [libdefaults]
    2. ...
    3. # for strong crypto
    4. default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
    5. default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5
    6. permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac-md5

管理者のユーザプリンシパルの追加

  1. 管理者(hdfs、mapred)のユーザプリンシパルを追加しておきます。
    kadmin.local:  add_principal hdfs
    ...
    kadmin.local:  add_principal mapred
    ...

疑似分散モード(シングルノード)に必要なプリンシパルの準備

  1. 必要なサービスプリンシパルをランダム暗号鍵を用いて追加し、keytabファイルを作成します。note.png通常、KDCにおいては暗号タイプを指定しない場合には高強度(aes256-cts:normal aes128-cts:normal arcfour-hmac:normal)のキーのみを生成する設定(supported_enctypes)になっているものと想定しています。HDFSのチェックポイント機構(およびfsck)には推奨のSPNEGO/Kerberosを使用しますので、host/ サービスプリンシパルの追加は不要です。
    $ sudo mkdir -p /grid/etc/keytabs/localhost
    $ sudo kadmin.local
    ...
    kadmin.local:  add_principal -randkey hdfs/localhost
    ...
    kadmin.local:  add_principal -randkey mapred/localhost
    ...
    kadmin.local:  add_principal -randkey HTTP/localhost
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/localhost/localhost.keytab -glob */localhost
  2. keytabファイルの内容を確認し、適切なパーミッションを設定します。keytabファイルは一つで足りますが、Hadoopの設定に統一感が出るようにシンボリックリンクを張っておきます。
    $ sudo klist -e -k -t /grid/etc/keytabs/localhost/localhost.keytab 
    Keytab name: WRFILE:/grid/etc/keytabs/localhost/localhost.keytab
    KVNO Timestamp         Principal
    ---- ----------------- --------------------------------------------------------
       2 06/05/12 18:30:40 HTTP/localhost@LOCALDOMAIN (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 HTTP/localhost@LOCALDOMAIN (AES-128 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 HTTP/localhost@LOCALDOMAIN (ArcFour with HMAC/md5) 
       2 06/05/12 18:30:40 hdfs/localhost@LOCALDOMAIN (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 hdfs/localhost@LOCALDOMAIN (AES-128 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 hdfs/localhost@LOCALDOMAIN (ArcFour with HMAC/md5) 
       2 06/05/12 18:30:40 mapred/localhost@LOCALDOMAIN (AES-256 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 mapred/localhost@LOCALDOMAIN (AES-128 CTS mode with 96-bit SHA-1 HMAC) 
       2 06/05/12 18:30:40 mapred/localhost@LOCALDOMAIN (ArcFour with HMAC/md5)
    
    $ cd /grid/etc/keytabs/localhost
    $ sudo chown root:hadoop localhost.keytab
    $ sudo chmod 440         localhost.keytab
    $ sudo ln -s localhost.keytab nn.keytab
    $ sudo ln -s localhost.keytab cn.keytab
    $ sudo ln -s localhost.keytab dn.keytab
    $ sudo ln -s localhost.keytab jt.keytab
    $ sudo ln -s localhost.keytab tt.keytab
    $ sudo ln -s localhost.keytab jh.keytab
    $ sudo ln -s localhost.keytab HTTP.keytab

完全分散モードに必要なサービスプリンシパルの準備

  1. 各ノードで必要なプリンシパルをランダム暗号鍵を用いて追加し、それぞれのkeytabファイルを作成します。
    kadmin.local:  add_principal -randkey hdfs/pleiades-nn.grid.example.com
    WARNING: no policy specified for hdfs/pleiades-nn.grid.example.com@GRID.EXAMPLE.COM; defaulting to no policy
    Principal "hdfs/pleiades-nn.grid.example.com@GRID.EXAMPLE.COM" created.
    kadmin.local:  add_principal -randkey hdfs/pleiades-cn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/pleiades-jt.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/pleiades-jh.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-nn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-cn.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-jt.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/pleiades-jh.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey HTTP/dn00001.grid.example.com
    ...
    $ sudo mkdir -p /grid/etc/keytabs/pleiades
    $ sudo kadmin.local
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/nn.keytab -glob */pleiades-nn.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/cn.keytab -glob */pleiades-cn.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/jt.keytab -glob */pleiades-jt.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/jh.keytab -glob */pleiades-jh.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-dn.keytab hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-dn.keytab hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-tt.keytab mapred/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-tt.keytab mapred/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-HTTP.keytab HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-HTTP.keytab HTTP/dn00001.grid.example.com
    ...
  2. 各ノードに必要keytabファイルを配備します。DataNode/TaskTrackerのkeytabファイルについては、設定の便宜のため配備後、ホスト名部分を削除した dn.keytabtt.keytabdn-HTTP.keytab にリネームします。keytabファイルの参照権限は、(LDAP認可環境セットアップ後に)各Hadoopデーモンプロセスの起動ユーザにのみ付与します。また、各ノードのSPNEGO用に HTTP/ プリンシパルを含むkeytabファイルに対して HTTP.keytab という名前でシンボリックリンクを張ります。
     *:$ cd /grid/etc/keytabs/pleiades
    nn:$ sudo chown hdfs:hdfs {nn,cn}.keytab
    nn:$ sudo chmod 400       {nn,cn}.keytab
    jt:$ sudo chown mapred:mapred jt.keytab
    jt:$ sudo chmod 400           jt.keytab
    jh:$ sudo chown mapred:mapred jh.keytab
    jh:$ sudo chmod 400           jh.keytab
    dn:$ sudo chown hdfs:hdfs dn.keytab
    dn:$ sudo chmod 400       dn.keytab
    dn:$ sudo chown mapred:mapred tt.keytab
    dn:$ sudo chmod 400           tt.keytab
    dn:$ sudo chown hdfs:hadoop   dn-HTTP.keytab
    dn:$ sudo chmod 440           dn-HTTP.keytab    # for DataNode & TaskTracker
    
    # SPNEGO用プリンシパルのために各ノードで適当なkeytabにシンボリックリンクします
     *:$ sudo ln -s {{nn,cn,jt,jh},dn-HTTP}.keytab HTTP.keytab

LDAP認可環境

  1. 各ノードのOSレベル、Hadoopレベルでの権限認可(グループ解決)をすべてLDAPに委ねます。
  2. 構築方法の詳細については、LDAPセットアップforHadoopをご参照ください。
  3. Hadoop 2.0以降には hadoop.security.group.mapping に設定する GroupMappingServiceProvider? として LdapGroupsMapping? が追加されていますが、最終的にユーザ権限でTaskプロセスを起動させる関係上、権限解決はOSレベル(NSS)に統一して委譲するのが効果的です。そのような点で、後述の通り JniBasedUnixGroupsMapping? を使用するのが運用、パフォーマンス両面で最も効果的です。

セキュアHadoop基盤

  • テスト環境としてセットアップしやすいように、以下の例では主にKerberos認証環境の設定について疑似分散(シングルノード)の設定例を示しています。完全分散(Hadoop完全分散モデル環境)の設定は、XMLのコメントとして添えてありますのでご参照ください。
  • note.pngプリンシパルの設定に利用できる特殊変数 _HOST はコンテクストによってその置換規則が異なります。明示的な設定では柔軟に対応できない場合(例えば、dfs.web.authentication.kerberos.principal)がありますので、基本的には _HOST を使用して設定すべきです。
    • 原則的に、マスタノード(NameNodeJobTracker)の場合にはサービスするDNS名で置換され、ワーカノード(DataNodeTaskTracker)の場合にはその hostname で置換されます。またマスタノードでサービスするDNS名は該当する各プロパティ(fs.default.name、mapred.job.tracker等)の値によって判断されますので注意が必要です(デフォルト設定ではなく明示的に設定する必要があります)。さらに、プロパティによってはバージョンによって _HOST の利用が未実装の場合(例えば、1.0.x、1.1.x、1.2.xのhadoop.http.authentication.kerberos.principal)がありますので、その点も注意する必要があります。
    • ただし、疑似分散環境(localhost)の場合には、通常のサーバセットアップで hostname に localhost を設定していることはまずないと思いますので、プリンシパルには明示的に localhost を設定する必要があります。
  • すべての設定後に各デーモンを再起動し反映させる必要があります。特にセキュアDataNodeについては後述の通り起動方法が若干変更になりますので、ご注意ください。
  1. ${HADOOP_HOME}/conf/core-site.xml: this.* で始まるのプロパティは、設定を容易にするためのものです。
    1.     <property>
    2.         <name>this.cluster.name</name>
    3.         <value>localhost</value>
    4.         <!-- <value>pleiades</value> -->
    5.     </property>
    6.     <property>
    7.         <name>this.domain</name>
    8.         <value>localhost</value>
    9.         <!-- <value>grid.example.com</value> -->
    10.     </property>
    11.     <property>
    12.         <name>this.realm</name>
    13.         <value>LOCALDOMAIN</value>
    14.         <!-- <value>GRID.EXAMPLE.COM</value> -->
    15.     </property>
    16.     <property>
    17.         <name>this.keytab.dir</name>
    18.         <value>/grid/etc/keytabs/${this.cluster.name}</value>
    19.     </property>
    20.     <property>
    21.         <name>this.namenode.fqdn</name>
    22.         <value>localhost</value>
    23.         <!-- <value>${this.cluster.name}-nn.${this.domain}</value> -->
    24.     </property>
    25.  
    26.     <property>
    27.         <name>fs.default.name</name>
    28.         <value>hdfs://${this.namenode.fqdn}:9000</value>
    29.     </property>
    30.     <property>
    31.         <name>hadoop.security.authentication</name>
    32.         <value>kerberos</value>
    33.         <description>
    34.             Set the authentication for the cluster. Valid values are: simple or
    35.             kerberos.
    36.         </description>
    37.     </property>
    38.     <property>
    39.         <name>hadoop.security.authorization</name>
    40.         <value>true</value>
    41.         <description>
    42.             Enable authorization for different protocols.
    43.         </description>
    44.     </property>
    45.     <property>
    46.         <name>hadoop.security.auth_to_local</name>
    47.         <value>
    48.             RULE:[2:$1@$0](.*@${this.realm})s/@.*//
    49.             RULE:[1:$1@$0](.*@${this.realm})s/@.*//
    50.             RULE:[2:$1@$0](mapred@.*${this.realm})s/.*/mapred/
    51.             RULE:[2:$1@$0](hdfs@.*${this.realm})s/.*/hdfs/
    52.             DEFAULT
    53.         </value>
    54.     </property>
    55.     <property>
    56.         <name>hadoop.security.group.mapping</name>
    57.         <value>org.apache.hadoop.security.JniBasedUnixGroupsMapping</value>
    58.     </property>
    59.     <property>
    60.         <name>hadoop.security.groups.cache.secs</name>
    61.         <value>14400</value>
    62.     </property>
    63.     <property>
    64.         <name>hadoop.kerberos.kinit.command</name>
    65.         <value>/usr/bin/kinit</value>
    66.     </property>
  2. ${HADOOP_HOME}/conf/hdfs-site.xml: 非推奨となりましたが、あえてKSSL(Kerberized SSL、TLS/Kerberos)を利用する場合には、明示的に hadoop.security.use-weak-http-cryptotrue とし、dfs.https.(|secondary.)(port|address) の設定を行う必要があります。
    1.     <property>
    2.         <name>this.secondary.namenode.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-cn.${this.domain}</value> -->
    5.     </property>
    6.     <!-- (...) -->
    7.     <property>
    8.         <name>dfs.cluster.administrators</name>
    9.         <value> hdfs</value>
    10.     </property>
    11.     <property>
    12.         <name>dfs.http.port</name>
    13.         <value>50070</value>
    14.         <description>The http port where namenode binds</description>
    15.     </property>
    16.     <property>
    17.         <name>dfs.http.address</name>
    18.         <value>${this.namenode.fqdn}:${dfs.http.port}</value>
    19.         <description>The http address where namenode binds</description>
    20.     </property>
    21.     <!-- for KSSL (NOT RECOMMENDED)
    22.     <property>
    23.         <name>hadoop.security.use-weak-http-crypto</name>
    24.         <value>true</value>
    25.     </property>
    26.     <property>
    27.         <name>dfs.https.port</name>
    28.         <value>50470</value>
    29.         <description>The https port where namenode binds</description>
    30.     </property>
    31.     <property>
    32.         <name>dfs.https.address</name>
    33.         <value>${this.namenode.fqdn}:${dfs.https.port}</value>
    34.         <description>The https address where namenode binds</description>
    35.     </property>
    36.     -->
    37.     <property>
    38.         <name>dfs.namenode.kerberos.principal</name>
    39.         <value>hdfs/_HOST@${this.realm}</value>
    40.         <!-- _HOST is replaced with the fs.default.name's host name -->
    41.         <!-- <value>hdfs/${this.namenode.fqdn}@${this.realm}</value> -->
    42.         <description>Kerberos principal name for the NameNode</description>
    43.     </property>
    44.     <property>
    45.         <name>dfs.namenode.kerberos.https.principal</name>
    46.         <value>host/${this.namenode.fqdn}@${this.realm}</value>
    47.         <!-- <value>host/_HOST@${this.realm}</value> v1.0.4: NG! -->
    48.         <description>
    49.             The Kerberos principal for the host that the NameNode runs on.
    50.         </description>
    51.     </property>
    52.     <property>
    53.         <name>dfs.namenode.keytab.file</name>
    54.         <value>${this.keytab.dir}/nn.keytab</value>
    55.         <description>
    56.             Combined keytab file containing the namenode service and host
    57.             principals.
    58.         </description>
    59.     </property>
    60.     <property>
    61.         <name>dfs.secondary.http.port</name>
    62.         <value>50090</value>
    63.         <description>The http port where secondary namenode binds</description>
    64.     </property>
    65.     <property>
    66.         <name>dfs.secondary.http.address</name>
    67.         <value>${this.secondary.namenode.fqdn}:${dfs.secondary.http.port}</value>
    68.         <description>The http address where secondary namenode binds</description>
    69.     </property>
    70.     <!-- for KSSL (NOT RECOMMENDED)
    71.     <property>
    72.         <name>dfs.secondary.https.port</name>
    73.         <value>50495</value>
    74.         <description>The https port where secondary namenode binds</description>
    75.     </property>
    76.     <property>
    77.         <name>dfs.secondary.https.address</name>
    78.         <value>${this.secondary.namenode.fqdn}:${dfs.secondary.https.port}</value>
    79.         <description>The https address where secondary namenode binds</description>
    80.     </property>
    81.     -->
    82.     <property>
    83.         <name>dfs.secondary.namenode.kerberos.principal</name>
    84.         <value>hdfs/${this.secondary.namenode.fqdn}@${this.realm}</value>
    85.         <!-- <value>hdfs/_HOST@${this.realm}</value> v1.0.4: NG! -->
    86.         <description>
    87.             Kerberos principal name for the secondary NameNode.
    88.         </description>
    89.     </property>
    90.     <property>
    91.         <name>dfs.secondary.namenode.kerberos.https.principal</name>
    92.         <value>host/${this.secondary.namenode.fqdn}@${this.realm}</value>
    93.         <!-- <value>host/_HOST@${this.realm}</value> v1.0.4: NG! -->
    94.         <description>
    95.             The Kerberos principal for the host that the secondary NameNode
    96.             runs on.
    97.         </description>
    98.     </property>
    99.     <property>
    100.         <name>dfs.secondary.namenode.keytab.file</name>
    101.         <value>${this.keytab.dir}/cn.keytab</value>
    102.         <description>
    103.             Combined keytab file containing the namenode service and host
    104.             principals.
    105.         </description>
    106.     </property>
    107.     <property>
    108.         <name>dfs.block.access.token.enable</name>
    109.         <value>true</value>
    110.         <description>
    111.             If "true", access tokens are used as capabilities for accessing
    112.             datanodes.
    113.             If "false", no access tokens are checked on accessing datanodes.
    114.         </description>
    115.     </property>
    116.     <property>
    117.         <name>dfs.datanode.kerberos.principal</name>
    118.         <value>hdfs/localhost@${this.realm}</value>
    119.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    120.         <description>
    121.             The Kerberos principal that the DataNode runs as. "_HOST" is
    122.             replaced by the real host name.
    123.         </description>
    124.     </property>
    125.     <property>
    126.         <name>dfs.datanode.keytab.file</name>
    127.         <value>${this.keytab.dir}/dn.keytab</value>
    128.         <description>
    129.             The filename of the keytab file for the DataNode.
    130.         </description>
    131.     </property>
  3. ${HADOOP_HOME}/conf/mapred-site.xml
    1.     <property>
    2.         <name>this.jobtracker.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-jt.${this.domain}</value> -->
    5.     </property>
    6.     <property>
    7.         <name>this.jobhistory.fqdn</name>
    8.         <value>localhost</value>
    9.         <!-- <value>${this.cluster.name}-jt.${this.domain}</value> -->
    10.         <!-- <value>${this.cluster.name}-jh.${this.domain}</value> -->
    11.     </property>
    12.  
    13.     <property>
    14.         <name>mapred.job.tracker</name>
    15.         <value>${this.jobtracker.fqdn}:9001</value>
    16.     </property>
    17.     <property>
    18.         <name>mapred.acls.enabled</name>
    19.         <value>true</value>
    20.     </property>
    21.     <property>
    22.         <name>mapreduce.cluster.administrators</name>
    23.         <value> mapred</value>
    24.     </property>
    25.     <property>
    26.         <name>mapreduce.jobtracker.kerberos.principal</name>
    27.         <value>mapred/_HOST@${this.realm}</value>
    28.         <!-- _HOST is replaced with the mapred.job.tracker's host name -->
    29.         <!-- <value>mapred/${this.jobtracker.fqdn}@${this.realm}</value> -->
    30.     </property>
    31.     <property>
    32.         <name>mapreduce.jobtracker.keytab.file</name>
    33.         <value>${this.keytab.dir}/jt.keytab</value>
    34.     </property>
    35.     <property>
    36.         <name>mapreduce.tasktracker.kerberos.principal</name>
    37.         <value>mapred/localhost@${this.realm}</value>
    38.         <!-- <value>mapred/_HOST@${this.realm}</value> -->
    39.     </property>
    40.     <property>
    41.         <name>mapreduce.tasktracker.keytab.file</name>
    42.         <value>${this.keytab.dir}/tt.keytab</value>
    43.     </property>
  4. ${HADOOP_HOME}/conf/mapred-queue-acls.xml: defaultキューのジョブ実行権限と管理権限を設定します。
    1. <property>
    2.   <name>mapred.queue.default.acl-submit-job</name>
    3.   <value>*</value>
    4.   <!-- <value> </value> -->
    5.   <description> Comma separated list of user and group names that are allowed
    6.     to submit jobs to the 'default' queue. The user list and the group list
    7.     are separated by a blank. For e.g. user1,user2 group1,group2.
    8.     If set to the special value '*', it means all users are allowed to
    9.     submit jobs. If set to ' '(i.e. space), no user will be allowed to submit
    10.     jobs.
    11.  
    12.     It is only used if authorization is enabled in Map/Reduce by setting the
    13.     configuration property mapred.acls.enabled to true.
    14.  
    15.     Irrespective of this ACL configuration, the user who started the cluster and
    16.     cluster administrators configured via
    17.     mapreduce.cluster.administrators can submit jobs.
    18.   </description>
    19. </property>
    20. <property>
    21.   <name>mapred.queue.default.acl-administer-jobs</name>
    22.   <value> hadoop,gridops</value>
    23.   <!-- <value> </value> -->
    24.   <description> Comma separated list of user and group names that are allowed
    25.     to view job details, kill jobs or modify job's priority for all the jobs
    26.     in the 'default' queue. The user list and the group list
    27.     are separated by a blank. For e.g. user1,user2 group1,group2.
    28.     If set to the special value '*', it means all users are allowed to do
    29.     this operation. If set to ' '(i.e. space), no user will be allowed to do
    30.     this operation.
    31.  
    32.     It is only used if authorization is enabled in Map/Reduce by setting the
    33.     configuration property mapred.acls.enabled to true.
    34.  
    35.     Irrespective of this ACL configuration, the user who started the cluster and
    36.     cluster administrators configured via
    37.     mapreduce.cluster.administrators can do the above operations on all the jobs
    38.     in all the queues. The job owner can do all the above operations on his/her
    39.     job irrespective of this ACL configuration.
    40.   </description>
    41. </property>
  5. ${HADOOP_HOME}/conf/hadoop-policy.xml
    1.   <property>
    2.     <name>security.refresh.policy.protocol.acl</name>
    3.     <value>hdfs,mapred hadoop</value>
    4.     <!-- <value>*</value> -->
    5.     <description>ACL for RefreshAuthorizationPolicyProtocol, used by the
    6.     dfsadmin and mradmin commands to refresh the security policy in-effect.
    7.     The ACL is a comma-separated list of user and group names. The user and
    8.     group list is separated by a blank. For e.g. "alice,bob users,wheel".
    9.     A special value of "*" means all users are allowed.</description>
    10.   </property>
    11.   <property>
    12.     <name>security.admin.operations.protocol.acl</name>
    13.     <value>hdfs,mapred hadoop</value>
    14.     <!-- <value>*</value> -->
    15.     <description>ACL for AdminOperationsProtocol, used by the mradmins commands
    16.     to refresh queues and nodes at JobTracker. The ACL is a comma-separated list of
    17.     user and group names. The user and group list is separated by a blank.
    18.     For e.g. "alice,bob users,wheel". A special value of "*" means all users are
    19.     allowed.</description>
    20.   </property>

セキュアDataNode

  • DataNodeをroot権限が必要な特権ポートでサービスするための設定です。DataNodeのなりすましを防止します。
  1. Hadoopに同梱されている jsvc が不足、または環境に合致していない場合がありますので、パッケージインストールします。
    $ sudo apt-get install jsvc
    $ cd $HADOOP_HOME
    $ sudo ln -s /usr/bin/jsvc libexec/jsvc.i386
    1. debian.pngredhat.pngDebianやRPMパッケージで適切なjsvcがインストールされる場合には、この作業は必要ありません。
  2. ${HADOOP_HOME}/conf/hadoop-env.sh にセキュアDataNodeの設定を追加します。jsvc が依存する Commons Daemonライブラリについては、(同梱されているものではなく)先程パッケージインストールしたものを最初に参照するようにCLASSPATHを設定します。
    1. export HADOOP_SECURE_DN_USER=hdfs
    2. export HADOOP_SECURE_DN_PID_DIR=/grid/vol/0/var/run/${HADOOP_SECURE_DN_USER}
    3. export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/${HADOOP_SECURE_DN_USER}
    4. # Extra Java CLASSPATH elements.  Optional.
    5. if [ x"$HADOOP_CLASSPATH" = x ]; then
    6.     export HADOOP_CLASSPATH=/usr/share/java/commons-daemon.jar
    7. else
    8.     # for Hive and HCatalog
    9.     export HADOOP_CLASSPATH=${HADOOP_CLASSPATH}:/usr/share/java/commons-daemon.jar
    10. fi
    11. export HADOOP_USER_CLASSPATH_FIRST=true
    1. debian.pngredhat.pngDebianやRPMパッケージで適切なjsvcがインストールされる場合には、最後の HADOOP_CLASSPATHHADOOP_USER_CLASSPATH_FIRST の設定は必要ありません。
  3. ${HADOOP_HOME}/conf/hdfs-site.xml
    1.     <property>
    2.         <name>dfs.datanode.address</name>
    3.         <value>0.0.0.0:1004</value>
    4.     </property>
    5.     <property>
    6.         <name>dfs.datanode.http.address</name>
    7.         <value>0.0.0.0:1006</value>
    8.     </property>
  4. hdfsユーザではなく、rootDataNodeを起動させます。起動後、デーモンのオーナはhdfsにスイッチされます。
    $ sudo ./bin/hadoop-daemon.sh start datanode

ユーザ権限でのタスクプロセス起動(tux.pngLinuxTaskController?

  1. ソースパッケージをダウンロードし、環境に合わせて LinuxTaskController? をビルドし配備します(info.pngビルド環境の構築については、Hadoopのビルドをご参照ください)。同梱の LinuxTaskController? は、固定で /etc/hadoop/taskcontroller.cfg を参照しますので、ビルドし直した方が無難でしょう。実行ファイルには、TaskTrackerの起動ユーザのみが所属するグループ(mapred)についてsetgid属性を付与します。
    [for Debian] $ sudo apt-get install ant build-essential autoconf libtool
    [for CentOS] $ sudo yum install     ant gcc-c++ make autoconf automake libtool
    ...
    $ tar xvzf hadoop-1.2.1.tar.gz
    $ cd hadoop-1.2.1
    $ ant task-controller -Dhadoop.conf.dir=${HADOOP_HOME}/conf
    ...
    $ sudo mv ${HADOOP_HOME}/bin/task-controller ${HADOOP_HOME}/bin/task-controller.dist
    $ sudo cp build/hadoop-1.2.2-SNAPSHOT/bin/task-controller ${HADOOP_HOME}/bin/
    $ cd ${HADOOP_HOME}
    $ sudo chown root:mapred bin/task-controller
    $ sudo chmod 6050 bin/task-controller
    1. note.pngi386環境でのビルド】そのままではビルドに失敗しますので、configure.ac の中の AC_SYS_LARGEFILE をコメントアウトする必要があります(MAPREDUCE-2178: ac-sys-largefile.patch)。
      1. $ diff -u src/c++/task-controller/configure.ac.dist src/c++/task-controller/configure.ac
      2. --- src/c++/task-controller/configure.ac.dist 2013-09-09 18:39:26.620443363 +0900
      3. +++ src/c++/task-controller/configure.ac 2013-09-09 18:41:03.317936619 +0900
      4. @@ -20,7 +20,7 @@
      5.  AC_PREREQ(2.59)
      6.  AC_INIT(linux-task-controller, 1.0.0, mapreduce-dev@hadoop.apache.org)
      7.  AC_GNU_SOURCE
      8. -AC_SYS_LARGEFILE
      9. +#AC_SYS_LARGEFILE
      10.  
      11.  AM_INIT_AUTOMAKE([subdir-objects foreign no-dist])
  2. LinuxTaskController? の設定ファイル(${HADOOP_HOME}/conf/taskcontroller.cfg)を ${HADOOP_HOME}/conf/mapred-site.xml と同様に編集し、適切なパーミッション(rootの読取専用)を設定します。
    1. #configured value of mapred.local.dir. It can be a list of comma separated paths.
    2. mapred.local.dir=/grid/vol/0/var/lib/mapred/local,/grid/vol/1/var/lib/mapred/local
    3. #configured value of hadoop.log.dir.
    4. hadoop.log.dir=/grid/vol/0/var/log/mapred
    5. #sleep time before sig kill is to be sent to process group after sigterm is sent. Should be in seconds
    6. mapred.tasktracker.tasks.sleeptime-before-sigkill=5000
    7. mapreduce.tasktracker.group=mapred
    8. #min.user.id=1000    # default
    $ sudo chown root:root conf/taskcontroller.cfg
    $ sudo chmod 0400 conf/taskcontroller.cfg
    1. centos.pngCentOSでは一般ユーザのuidは通常500から振られるため、taskcontroller.cfgのmin.user.id の設定を500に引き下げることをお忘れなく。
      1. #min.user.id=1000    # default
      2. min.user.id=500    # for CentOS
  3. ${HADOOP_HOME}/conf/mapred-site.xml の設定で、LinuxTaskController? を有効にします。
    1.     <property>
    2.         <name>mapred.task.tracker.task-controller</name>
    3.         <value>org.apache.hadoop.mapred.LinuxTaskController</value>
    4.     </property>

JobHistoryServer?の分離

  • JobTrackerの動作が安定しますので、JobTrackerに組み込まれていたJobHistoryServer?を別デーモンに分離します。JobTrackerとは別ホストで稼働されることも可能です。
  1. ${HADOOP_HOME}/conf/mapred-site.xml
    1.     <property>
    2.         <name>mapreduce.history.server.embedded</name>
    3.         <value>false</value>
    4.     </property>
    5.     <property>
    6.         <name>mapreduce.history.server.http.address</name>
    7.         <value>${this.jobhistory.fqdn}:19888</value>
    8.     </property>
    9.     <property>
    10.         <name>mapreduce.jobhistory.kerberos.principal</name>
    11.         <value>mapred/${this.jobhistory.fqdn}@${this.realm}</value>
    12.     </property>
    13.     <property>
    14.         <name>mapreduce.jobhistory.keytab.file</name>
    15.         <value>${this.keytab.dir}/jh.keytab</value>
    16.     </property>
  2. mapredユーザでHistoryServer?を起動させます。
    $ sudo -u mapred ./bin/hadoop-daemon.sh start historyserver

ProxyUser(Secure Impersonation)の設定

  • ProxyUserの許可設定については、それを必要とするOozieHoopのセットアップドキュメントをご参照ください。

WebコンソールのSPNEGO/Kerberos設定

  • 各HadoopサービスのWebコンソールにもKerberos認証によるシングルサインオンでアクセスするため、SPNEGO/Kerberosの設定を行います。
  1. まず署名のためのシークレットファイルを用意し、パーミッションを適切に設定します。完全分散の場合には、各ノードに同じシークレットファイルを配備します。
    $ sudo chmod 640 /grid/etc/hadoop-http-auth-signature-secret 
    $ sudo chown root:hadoop /grid/etc/hadoop-http-auth-signature-secret
  2. ${HADOOP_HOME}/conf/core-site.xml で設定します。hadoop.http.filter.initializers プロパティに org.apache.hadoop.security.AuthenticationFilterInitializer? を設定し、hadoop.http.authentication.typekerberos にします。note.png今のところサービスプリンシパル設定のためのキーが1セットしかありませんので、(各デーモンでサービスするFQDNが異なるため)ノード毎に設定を変える必要があります。info.png因みに、1.0.x、1.1.xおよび1.2.xでは特殊変数_HOSTを用いて記述しても展開されませんが、2.0.0-alpha以降では正しく展開されますので、同一の設定値(HTTP/_HOST@${this.realm})で支障がないようになっています。1.xで設定セットを単一に保つ方法については後述しています。
    1.     <property>
    2.         <name>hadoop.http.filter.initializers</name>
    3.         <value>org.apache.hadoop.security.AuthenticationFilterInitializer</value>
    4.         <!-- <value>org.apache.hadoop.http.lib.StaticUserWebFilter</value> -->
    5.         <description>The name of a class that initializes an input filter for Jetty.
    6.             This filter will always return Dr.Who as the web user when the servlets
    7.             query for the authenticated user </description>
    8.     </property>
    9.     <property>
    10.         <name>hadoop.http.authentication.signature.secret.file</name>
    11.         <value>/grid/etc/hadoop-http-auth-signature-secret</value>
    12.     </property>
    13.     <property>
    14.         <name>hadoop.http.authentication.cookie.domain</name>
    15.         <value>${this.domain}</value>
    16.     </property>
    17.     <property>
    18.         <name>hadoop.http.authentication.type</name>
    19.         <value>kerberos</value>
    20.         <description>Defines authentication used for the HTTP web-consoles.
    21.             The supported values are: simple | kerberos | #AUTHENTICATION_HANDLER_CLASSNAME#.
    22.             The dfeault value is simple.</description>
    23.     </property>
    24.     <property>
    25.         <name>hadoop.http.authentication.kerberos.principal</name>
    26.         <value>HTTP/localhost@${this.realm}</value>
    27.         <!-- <value>HTTP/_HOST@${this.realm}</value>
    28.             _HOST N/A!: v1.0, v1.1, v1.2, HDP1.2; OK: v2.0, CDH3, CDH4 -->
    29.         <!-- in _HOST N/A environments.
    30.         <value>HTTP/${this.fqdn}@${this.realm}</value>
    31.         "this".fqdn must be set in the conf/hadoop-env.sh
    32.         or each setting
    33.         <value>HTTP/${this.cluster.name}-nn.${this.domain}@${this.realm}</value>
    34.         <value>HTTP/${this.cluster.name}-cn.${this.domain}@${this.realm}</value>
    35.         <value>HTTP/${this.cluster.name}-jt.${this.domain}@${this.realm}</value>
    36.         <value>HTTP/${this.cluster.name}-jh.${this.domain}@${this.realm}</value>
    37.         <value>HTTP/dn00000.${this.domain}@${this.realm}</value>
    38.         <value>HTTP/dn00001.${this.domain}@${this.realm}</value>
    39.         -->
    40.     </property>
    41.     <property>
    42.         <name>hadoop.http.authentication.kerberos.keytab</name>
    43.         <value>${this.keytab.dir}/HTTP.keytab</value>
    44.     </property>
    1. lightbulb.png【完全分散環境での hadoop.http.authentication.kerberos.principal 設定】Hadoopの運用管理では、どのデーモンにおいても同一の設定セットを使用し、各デーモン毎に設定ファイルセットを発散させないというのが鉄則です。以下の方法で、1.xにおいても hadoop.http.authentication.kerberos.principal について同一の設定セットを保つことができます。
      1. ${HADOOP_HOME}/conf/hadoop-env.sh: 残念ながら、hadoop.http.authentication.kerberos.principal は起動パラメータで直接上書きすることができませんので、独自のシステムプロパティ this.fqdn を用意し、各デーモン毎の設定を動的に行えるようにします。
        1. FQDN=`hostname --fqdn`
        2. CLUSTER_NAME='pleiades'
        3. DOMAIN='grid.example.com'
        4. export HADOOP_NAMENODE_OPTS="-Dthis.fqdn=${CLUSTER_NAME}-nn.${DOMAIN} ${HADOOP_NAMENODE_OPTS}"
        5. export HADOOP_SECONDARYNAMENODE_OPTS="-Dthis.fqdn=${CLUSTER_NAME}-cn.${DOMAIN} ${HADOOP_SECONDARYNAMENODE_OPTS}"
        6. export HADOOP_DATANODE_OPTS="-Dthis.fqdn=${FQDN} ${HADOOP_DATANODE_OPTS}"
        7. export HADOOP_JOBTRACKER_OPTS="-Dthis.fqdn=${CLUSTER_NAME}-jt.${DOMAIN} ${HADOOP_JOBTRACKER_OPTS}"
        8. export HADOOP_TASKTRACKER_OPTS="-Dthis.fqdn=${FQDN} ${HADOOP_TASKTRACKER_OPTS}"
      2. ${HADOOP_HOME}/conf/core-site.xml: 設定したシステムプロパティ this.fqdn を参照するようにします。
        1.     <property>
        2.         <name>hadoop.http.authentication.kerberos.principal</name>
        3.         <value>HTTP/${this.fqdn}@${this.realm}</value>
        4.     </property>
  3. ${HADOOP_PREFIX}/etc/hadoop/hdfs-site.xml: 1.1.x以降で設定プロパティが分離、導入された、HDFSのWebコンソールで使用するプリンシパルの設定を行います。なお、dfs.web.authentication.kerberos.principal の値中の特殊変数_HOSTは正しく展開されます。
    1.     <property>
    2.         <name>dfs.namenode.http-address</name>
    3.         <value>${this.namenode.fqdn}:50070</value>
    4.     </property>
    5.     <property>
    6.         <name>dfs.namenode.secondary.http-address</name>
    7.         <value>${this.secondary.namenode.fqdn}:50090</value>
    8.     </property>
    9.     <property>
    10.         <name>dfs.web.authentication.kerberos.principal</name>
    11.         <value>HTTP/_HOST@${this.realm}</value>
    12.     </property>
    13.     <property>
    14.         <name>dfs.web.authentication.kerberos.keytab</name>
    15.         <value>${this.keytab.dir}/HTTP.keytab</value>
    16.     </property>
  4. 編集後に、各デーモンプロセスを再起動し反映させます。
  5. ブラウザからのアクセス方法については、SPNEGOonBrowserをご参照ください。

その他のサービス

  1. HttpFS - ※1.2 では提供されていません。
  2. WebHDFS?

テスト

  1. ACL設定を追加して実行します。
    $ sudo -u alice kinit
    Password for alice@LOCALDOMAIN: 
    $ sudo -u alice bin/hadoop jar hadoop-examples-1.2.1.jar pi \
    > -D mapreduce.job.acl-view-job=* -D mapreduce.job.acl-modify-job=alice 5 10

参考リソース

  1. 設定ファイル一式
  2. (KSSL Deployments Only) Problem 12: Due to a bug in JDK 6, Kerberos-enabled SSL (KSSL) does not work.

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-09-09 (月) 19:25:12 (3058d)