CDH > CDH4セットアップ >

note.pngDEPRECATED!: このバージョンのCDHはすでに古いです。ご利用は非推奨です。CDH4withSecurityセットアップをご参照ください。

目次

はじめに

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

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

  1. CDH3 - DEPRECATED

セットアップ

Chefレシピ

参考までに、これはここで説明しているセキュア疑似分散環境を構築するChefレシピ(ロール)です。

  • cake.pnggrid-chef-repo:/roles/hadoop-pseudo-distributed-with-security.rb: これはデフォルトでは、Apache版のセキュアHadoopクラスタを構築するロールです。
    • cake.pnggrid-chef-repo:/roles/test-cdh-on-localhost.rb: CDHでクラスタ構築する場合には、このロールのように run_list に yum-cdh および hadoop-pseudo-distributed-with-security ロールを追加した上で、node['hadoop']['install_flavor'] 属性でディストリビューションを切り替え、必要に応じて他の属性を設定します。なお、実際に構築を行う hadoop::cdh レシピは、RPMパッケージを用いてCDHのインストールを行います。
      1. name 'test-cdh-on-localhost'
      2. description 'Testing Cloudera\'s Distribution, including Apache Hadoop on local machine'
      3.  
      4. run_list(
      5.   'role[node_commons]',
      6.   'role[chef_utils]',
      7.   'role[nameservice-client]',
      8.   'role[ganglia-gmond-ucast-localhost]',
      9.   'role[ganglia-gmetad-localhost]',
      10.   'role[ganglia-web]',
      11.   'role[nagios]',
      12.   'role[yum-cdh]',
      13.   #'role[hadoop-pseudo-distributed]',
      14.   'role[hadoop-pseudo-distributed-with-security]',
      15. )
      16.  
      17. # (...)
      18.  
      19. default_attributes(
      20.   'cdh' => {
      21.     'version' => '4.2.0',
      22.     #'version' => '3u6',
      23.   },
      24.   'hadoop' => {
      25.     'install_flavor' => 'cdh',
      26.     'HADOOP_CLASSPATH' => '',
      27.     'HADOOP_USER_CLASSPATH_FIRST' => 'false',
      28.     # for 2.0.x only
      29.     'container-executor' => {
      30.       'min.user.id' => '500'
      31.     },
      32.     #'yarn.nodemanager.linux-container-executor.resources-handler.class' \
      33.     #  => 'org.apache.hadoop.yarn.server.nodemanager.util.CgroupsLCEResourcesHandler',
      34.     },
      35.   }
      36. )

Java

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

Kerberos認証環境

  1. 基本的なKerberos AdminサーバおよびKDCの構築については、KerberosセットアップforHadoopをご参照ください。
  2. 検証目的の場合には、レルムは任意のもの(例えば、LOCALHOST、LOCALDOMAIN等)で構いません。

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

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

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

  1. 必要なサービスプリンシパルをランダム暗号鍵を用いて追加し、keytabファイルを作成します。info.pngCDH4ではKSSLの実装は削除されていますので、NameNodeSecondaryNameNodeのための host/ プリンシパルは不要になりました。
    $ sudo mkdir -p /grid/etc/keytabs/localhost
    $ sudo kadmin.local
    ...
    kadmin.local:  add_principal -randkey hdfs/localhost
    ...
    kadmin.local:  add_principal -randkey yarn/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: FILE:/grid/etc/keytabs/localhost/localhost.keytab
    KVNO Timestamp        Principal
    ---- ---------------- ---------------------------------------------------------
       2 22/08/2012 21:33 yarn/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:33 yarn/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:22 yarn/localhost@LOCALDOMAIN (arcfour-hmac) 
       2 22/08/2012 21:35 hdfs/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:35 hdfs/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:35 hdfs/localhost@LOCALDOMAIN (arcfour-hmac) 
       2 22/08/2012 21:36 mapred/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 mapred/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:36 mapred/localhost@LOCALDOMAIN (arcfour-hmac) 
       2 22/08/2012 21:38 HTTP/localhost@LOCALDOMAIN (aes256-cts-hmac-sha1-96) 
       2 22/08/2012 21:38 HTTP/localhost@LOCALDOMAIN (aes128-cts-hmac-sha1-96) 
       2 22/08/2012 21:38 HTTP/localhost@LOCALDOMAIN (arcfour-hmac) 
    
    $ 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 rm.keytab
    $ sudo ln -s localhost.keytab nm.keytab
    $ sudo ln -s localhost.keytab jh.keytab
    $ sudo ln -s localhost.keytab HTTP.keytab

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

  1. 各ノードで必要なプリンシパルをランダム暗号鍵を用いて追加し、それぞれのkeytabファイルを作成します。info.pngCDH4ではKSSLの実装は削除されていますので、NameNodeSecondaryNameNodeのための host/ プリンシパルは不要になりました。
    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 yarn/pleiades-rm.grid.example.com
    ...
    kadmin.local:  add_principal -randkey yarn/dn00000.grid.example.com
    ...
    kadmin.local:  add_principal -randkey yarn/dn00001.grid.example.com
    ...
    kadmin.local:  add_principal -randkey mapred/pleiades-jh.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-rm.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/rm.keytab -glob */pleiades-rm.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 -p hdfs/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-dn.keytab -p hdfs/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-nm.keytab -p yarn/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-nm.keytab -p yarn/dn00001.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00000-HTTP.keytab -p HTTP/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-HTTP.keytab -p HTTP/dn00001.grid.example.com
    ...
  2. 各ノードに必要keytabファイルを配備します。DataNode/NodeManager?のkeytabファイルについては、設定の便宜のため配備後、ホスト名部分を削除した dn.keytabnm.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
    rm:$ sudo chown yarn:yarn rm.keytab
    rm:$ sudo chmod 400       rm.keytab
    dn:$ sudo chown hdfs:hdfs dn.keytab
    dn:$ sudo chmod 400       dn.keytab
    dn:$ sudo chown yarn:yarn nm.keytab
    dn:$ sudo chmod 400       nm.keytab
    dn:$ sudo chown yarn:hadoop dn-HTTP.keytab
    dn:$ sudo chmod 440         dn-HTTP.keytab    # for DataNode & NodeManager
    jh:$ sudo chown mapred:mapred jh.keytab
    jh:$ sudo chmod 400           jh.keytab
    
    # SPNEGO用プリンシパルのために各ノードで適当なkeytabにシンボリックリンクします
    *:$ sudo ln -s {{nn,cn,rm,jh},dn-HTTP}.keytab HTTP.keytab

LDAP認可環境

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

セキュアHadoop基盤

  • テスト環境としてセットアップしやすいように、以下の例では主にKerberos認証環境の設定について疑似分散(シングルノード)の設定例を示しています。完全分散(Hadoop完全分散モデル環境)の設定は、XMLのコメントとして添えてありますのでご参照ください。
  • note.pngプリンシパルの設定に利用できる特殊変数 _HOST はコンテクストによってその置換規則が異なります。明示的な設定では柔軟に対応できない場合(例えば、dfs.web.authentication.kerberos.principal)がありますので、基本的には _HOST を使用して設定すべきです。
    • 原則的に、マスタノード(NameNodeResourceManager?)の場合にはサービスするDNS名で置換され、ワーカノード(DataNodeNodeManager?)の場合にはその hostname で置換されます。またマスタノードでサービスするDNS名は該当する各プロパティ(fs.defaultFS等)の値によって判断されますので注意が必要です(デフォルト設定ではなく明示的に設定する必要があります)。さらに、プロパティによってはバージョンによって _HOST の利用が未実装の場合(例えば、1.0.xのhadoop.http.authentication.kerberos.principal)がありますので、その点も注意する必要があります。
    • ただし、疑似分散環境(localhost)の場合には、通常のサーバセットアップで hostname に localhost を設定していることはまずないと思いますので、プリンシパルには明示的に localhost を設定する必要があります。
  • すべての設定後に各デーモンを再起動し反映させる必要があります。
  1. /etc/hadoop/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>LOCALHOST</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.defaultFS</name>
    28.         <value>hdfs://${this.namenode.fqdn}:9000/</value>
    29.     </property>
    30.     <property>
    31.         <name>hadoop.tmp.dir</name>
    32.         <value>/tmp/hadoop-${user.name}</value>
    33.     </property>
    34.  
    35.     <property>
    36.         <name>hadoop.security.authentication</name>
    37.         <value>kerberos</value>
    38.         <description>
    39.             Set the authentication for the cluster. Valid values are: simple or
    40.             kerberos.
    41.         </description>
    42.     </property>
    43.     <property>
    44.         <name>hadoop.security.authorization</name>
    45.         <value>true</value>
    46.         <description>
    47.             Enable authorization for different protocols.
    48.         </description>
    49.     </property>
    50. <!--
    51.     <property>
    52.         <name>hadoop.security.auth_to_local</name>
    53.         <value>
    54.             RULE:[2:$1@$0](.*@${this.realm})s/@.*//
    55.             RULE:[1:$1@$0](.*@${this.realm})s/@.*//
    56.             RULE:[2:$1@$0](hdfs@.*${this.realm})s/.*/hdfs/
    57.             RULE:[2:$1@$0](yarn@.*${this.realm})s/.*/yarn/
    58.             RULE:[2:$1@$0](mapred@.*${this.realm})s/.*/mapred/
    59.             DEFAULT
    60.         </value>
    61.     </property>
    62. -->
    63.     <property>
    64.         <name>hadoop.security.group.mapping</name>
    65.         <value>org.apache.hadoop.security.JniBasedUnixGroupsMapping</value>
    66.     </property>
    67. <!--
    68.     <property>
    69.         <name>hadoop.security.groups.cache.secs</name>
    70.         <value>14400</value>
    71.     </property>
    72.     <property>
    73.         <name>hadoop.kerberos.kinit.command</name>
    74.         <value>/usr/bin/kinit</value>
    75.     </property>
    76. -->
  2. /etc/hadoop/conf/hdfs-site.xml
    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.namenode.kerberos.principal</name>
    9.         <value>hdfs/${this.namenode.fqdn}@${this.realm}</value>
    10.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    11.         <description>Kerberos principal name for the NameNode</description>
    12.     </property>
    13.     <property>
    14.         <name>dfs.namenode.keytab.file</name>
    15.         <value>${this.keytab.dir}/nn.keytab</value>
    16.         <description>
    17.             Combined keytab file containing the namenode service and host
    18.             principals.
    19.         </description>
    20.     </property>
    21.     <property>
    22.         <name>dfs.secondary.namenode.kerberos.principal</name>
    23.         <value>hdfs/${this.secondary.namenode.fqdn}@${this.realm}</value>
    24.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    25.         <description>
    26.             Kerberos principal name for the secondary NameNode.
    27.         </description>
    28.     </property>
    29.     <property>
    30.         <name>dfs.secondary.namenode.keytab.file</name>
    31.         <value>${this.keytab.dir}/cn.keytab</value>
    32.         <description>
    33.             Combined keytab file containing the namenode service and host
    34.             principals.
    35.         </description>
    36.     </property>
    37.     <property>
    38.         <name>dfs.block.access.token.enable</name>
    39.         <value>true</value>
    40.         <description>
    41.             If "true", access tokens are used as capabilities for accessing
    42.             datanodes.
    43.             If "false", no access tokens are checked on accessing datanodes.
    44.         </description>
    45.     </property>
    46.     <property>
    47.         <name>dfs.datanode.kerberos.principal</name>
    48.         <value>hdfs/localhost@${this.realm}</value>
    49.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    50.         <description>
    51.             The Kerberos principal that the DataNode runs as. "_HOST" is
    52.             replaced by the real host name.
    53.         </description>
    54.     </property>
    55.     <property>
    56.         <name>dfs.datanode.keytab.file</name>
    57.         <value>${this.keytab.dir}/dn.keytab</value>
    58.         <description>
    59.             The filename of the keytab file for the DataNode.
    60.         </description>
    61.     </property>
    62.     <!-- (...) -->
    63.     <property>
    64.         <name>dfs.namenode.kerberos.internal.spnego.principal</name>
    65.         <value>${dfs.web.authentication.kerberos.principal}</value>
    66.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    67.     </property>
    68.     <property>
    69.         <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
    70.         <value>${dfs.web.authentication.kerberos.principal}</value>
    71.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    72.     </property>
    1. info.pngSPNEGO/Kerberos の追加と KSSL(Kerberized SSL、TLS/Kerberos)の非推奨化
      1. これまでHDFSのファイルシステムイメージの転送やfsckには通信プロトコルとしてKSSLが使用されてきましたが、JDK 6のバグ(6946669)によりKerberosチケットの暗号タイプに高強度のものを利用できないため、セキュリティの観点から代替プロトコルとしてSPNEGO/Kerberosが追加され、KSSLの利用は非推奨となりました(HDFS-2617)。
      2. Apache Hadoop では、実際に 1.1.02.0.2-alpha 以降で SPNEGO/Kerberos 対応が追加されており、それでも KSSL を利用したい場合には明示的にプロパティ hadoop.security.use-weak-http-crypto に true を設定する必要があります。
      3. リリースノートによると、CDH4では一歩進んで従来の KSSL による実装を削除していますので、この説明では SPNEGO/Kerberos にてセットアップを行なっています。
  3. /etc/hadoop/conf/yarn-site.xml
    1.     <property>
    2.         <name>this.resourcemanager.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-rm.${this.domain}</value> -->
    5.     </property>
    6.     <!-- (...) -->
    7.     <property>
    8.         <name>yarn.acl.enable</name>
    9.         <value>true</value>
    10.     </property>
    11.     <property>
    12.         <name>yarn.admin.acl</name>
    13.         <value> yarn,gridops</value>
    14.     </property>
    15.     <property>
    16.         <name>yarn.resourcemanager.principal</name>
    17.         <value>yarn/${this.resourcemanager.fqdn}@${this.realm}</value>
    18.         <!-- <value>yarn/_HOST@${this.realm}</value> -->
    19.     </property>
    20.     <property>
    21.         <name>yarn.resourcemanager.keytab</name>
    22.         <value>${this.keytab.dir}/rm.keytab</value>
    23.     </property>
    24.     <property>
    25.         <name>yarn.nodemanager.principal</name>
    26.         <value>yarn/localhost@${this.realm}</value>
    27.         <!-- <value>yarn/_HOST@${this.realm}</value> -->
    28.     </property>
    29.     <property>
    30.         <name>yarn.nodemanager.keytab</name>
    31.         <value>${this.keytab.dir}/nm.keytab</value>
    32.     </property>
    33.     <property>
    34.         <name>yarn.nodemanager.admin-env</name>
    35.         <value>MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX,LD_LIBRARY_PATH=${HADOOP_COMMON_HOME}/lib/native</value>
    36.     </property>
    1. note.pngデフォルト設定では、ネイティブライブラリのロードに失敗し MRAppMaster? が起動できない場合がありますので、yarn.nodemanager.admin-env に環境変数 LD_LIBRARY_PATH の設定を追加しています(MAPREDUCE-4072も参照のこと)。
  4. /etc/hadoop/conf/mapred-site.xml
    1.     <property>
    2.         <name>this.jobhistory.fqdn</name>
    3.         <value>localhost</value>
    4.         <!-- <value>${this.cluster.name}-jh.${this.domain}</value> -->
    5.     </property>
    6.     <!-- (...) -->
    7.     <property>
    8.         <name>mapreduce.jobhistory.principal</name>
    9.         <value>mapred/${this.jobhistory.fqdn}@${this.realm}</value>
    10.         <!-- <value>mapred/_HOST@${this.realm}</value> -->
    11.     </property>
    12.     <property>
    13.         <name>mapreduce.jobhistory.keytab</name>
    14.         <value>${this.keytab.dir}/jh.keytab</value>
    15.     </property>

セキュアDataNode

  • DataNodeをroot権限が必要な特権ポートでサービスするための設定です。DataNodeのなりすましを防止します。
  1. セキュアDataNodeの起動に必要な jsvc は依存関係にある bigtop-jsvc パッケージでインストールされます。
  2. /etc/default/hadoop-hdfs-datanode にセキュアDataNodeの設定を追加します。note.png残念ながら、/etc/hadoop/conf/hadoop-env.sh では設定がうまく有効になりません。ただし、ログ出力先(SecurityAuth?-hdfs.audit と hadoop-hdfs-datanode-*.log のみ)については、hadoop-env.sh の HADOOP_LOG_DIR が優先されますので注意が必要です。
    1. export HADOOP_SECURE_DN_USER=hdfs
    2. export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop-hdfs
    3. export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/hdfs
    4. # NG: $HADOOP_SECURE_DN_USER is N/A!
    5. #export HADOOP_SECURE_DN_LOG_DIR=/grid/vol/0/var/log/${HADOOP_SECURE_DN_USER}
  3. /etc/hadoop/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. 通常どおりDataNodeを起動させます。
    $ sudo sbin/hadoop-daemon.sh start datanode

ユーザ権限でのリソースコンテナ起動(tux.pngLinuxContainerExecutor?

  1. container-executor バイナリは hadoop-yarn パッケージでインストールされますので、特別な作業は必要ありません。パーミッションを確認しておきます。
    $ ls -l /usr/lib/hadoop-yarn/bin/container-executor 
    ---Sr-s---. 1 root yarn 31864 Feb 16 04:24 /usr/lib/hadoop-yarn/bin/container-executor
  2. LinuxContainerExecutor? の設定ファイル(/etc/hadoop/conf/container-executor.cfg)を作成し、 /etc/hadoop/conf/mapred-site.xml と同様に編集し、適切なパーミッション(rootの読取専用)を設定します。
    1. yarn.nodemanager.local-dirs=/grid/vol/0/var/lib/yarn/nm/local
    2. yarn.nodemanager.log-dirs=/grid/vol/0/var/log/yarn/nm
    3. yarn.nodemanager.linux-container-executor.group=yarn
    4. #comma separated list of users who can not run applications
    5. banned.users=hfds,yarn,mapred,bin
    6. #Prevent other super-users
    7. #min.user.id=1000    # default
    $ sudo chown root:root /etc/hadoop/conf/container-executor.cfg 
    $ sudo chmod 0400      /etc/hadoop/conf/container-executor.cfg
    1. centos.pngCentOSでは一般ユーザのuidは通常500から振られるため、container-executor.cfgのmin.user.id の設定を500に引き下げることをお忘れなく。
      1. #min.user.id=1000    # default
      2. min.user.id=500    # for CentOS
  3. /etc/hadoop/conf/yarn-site.xml の設定で、DefaultContainerExecutor? に替えて、LinuxContainerExecutor? を有効にします。Apache Hadoop 2.0.3aから追加されたリソース管理に cgroup(Control Group) を利用する機能は、CDH4ではまだ導入されていません。
    1.     <property>
    2.         <name>yarn.nodemanager.container-executor.class</name>
    3.         <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>
    4.     </property>
    5.     <property>
    6.         <name>yarn.nodemanager.linux-container-executor.group</name>
    7.         <value>yarn</value>
    8.     </property>
    • note.pngはじめに DefaultContainerExecutor? を利用していた場合には、切り替え後に以下のようなパーミッションエラーが発生します。一度ユーザキャッシュディレクトリを削除する必要があります。
      1. 13/03/08 20:05:06 INFO mapreduce.Job: Job job_1362721746251_0001 failed with state FAILED due to: Application
      2.  application_1362721746251_0001 failed 1 times due to AM Container for appattempt_1362721746251_0001_000001 exited
      3.  with  exitCode: -1000 due to: java.io.IOException: App initialization failed (255) with output: main : command
      4.  provided 0
      5. main : user is alice
      6. Can't open appcache in /grid/vol/0/var/lib/yarn/nm/local/usercache/alice/appcache/application_1362721746251_0001 -
      7.  Permission denied
      8. Did not create any app directories
      9.  
      10. at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(
      11. LinuxContainerExecutor.java:175)
      12. at org.apache.hadoop.yarn.server.nodemanager.containermanager.localizer
      13. .ResourceLocalizationService$LocalizerRunner.run(ResourceLocalizationService.java:864)
      14. Caused by: org.apache.hadoop.util.Shell$ExitCodeException:
      15. at org.apache.hadoop.util.Shell.runCommand(Shell.java:261)
      16. at org.apache.hadoop.util.Shell.run(Shell.java:188)
      17. at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:381)
      18. at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.startLocalizer(
      19. LinuxContainerExecutor.java:167)
      20. ... 1 more
      21.  
      22. .Failing this attempt.. Failing the application.
      $ sudo rm -R /grid/vol/0/var/lib/yarn/nm/local/usercache
      # YARN を再起動します。

CapacityScheduler?のアクセス制御

  1. /etc/hadoop/conf/capacity-scheduler.xml: この設定ファイルは用意されていませんので、新規作成の上、編集します。CapacityScheduler?には、新たにキューの階層化機能が追加されました。アクセス制御に関して言えば、親キューの権限が子のキューに継承される仕様の上、rootキューのデフォルト設定は全権付与(*)となっていますので、権限設定には十分注意する必要があります(上位階層で緩和した権限を下位のキューで制限することはできません)。通常、rootキューの権限設定を最小限に絞った上で、子のキューの権限を適切に緩和する必要があります。設定値のフォーマットは、カンマ区切りの許可ユーザリストと許可グループリストをさらに半角スペースで区切ります。半角スペース一つのみは、ユーザリスト、グループリスト何れも設定しないという意味で、どのユーザにもその権限を許可しないことを表します。
    1.   <property>
    2.     <name>yarn.scheduler.capacity.root.acl_submit_applications</name>
    3.     <value> </value>
    4.     <description>
    5.       The ACL of who can submit jobs to the root queue.
    6.     </description>
    7.   </property>
    8.   <property>
    9.     <name>yarn.scheduler.capacity.root.acl_administer_queue</name>
    10.     <value> hadoop,gridops</value>
    11.     <description>
    12.       The ACL of who can administer jobs on the root queue.
    13.     </description>
    14.   </property>
    15.   <!-- (...) -->
    16.   <property>
    17.     <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
    18.     <value>*</value>
    19.     <description>
    20.       The ACL of who can submit jobs to the default queue.
    21.     </description>
    22.   </property>
    23.   <property>
    24.     <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
    25.     <value> hadoop,gridops</value>
    26.     <description>
    27.       The ACL of who can administer jobs on the default queue.
    28.     </description>
    29.   </property>
  2. デーモンがすでに起動済であれば、以下のコマンドで設定内容を反映させることができます。
    $ sudo -u yarn yarn rmadmin -refreshQueues
  3. 各ユーザは、以下のコマンドで自分に付与されている権限を確認することができます。
    $ sudo -u yarn mapred queue -showacls
    ...
    Queue acls for user :  yarn
    
    Queue  Operations
    =====================
    root  ADMINISTER_QUEUE
    default  ADMINISTER_QUEUE,SUBMIT_APPLICATIONS
    $ sudo -u alice mapred queue -showacls
    ...
    Queue acls for user :  alice
    
    Queue  Operations
    =====================
    root  
    default  SUBMIT_APPLICATIONS

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. /etc/hadoop/conf/core-site.xml を編集します。hadoop.http.filter.initializers プロパティに org.apache.hadoop.security.AuthenticationFilterInitializer? を設定し、hadoop.http.authentication.typekerberos にします。note.pngただし、同一ノードで複数のデーモンを起動させる疑似分散環境では、dfs.web.authentication.kerberos.principal 等の値が同一となるため、Web UI等へのリクエストがリプレイ攻撃*1と判断されてしまいます。そのような場合には、やむを得ませんので hadoop.http.authentication.type を simple に設定して動作確認するとよいでしょう。
    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, HDP1.2; OK: v2.0, CDH3, CDH4 -->
    29.     </property>
    30.     <property>
    31.         <name>hadoop.http.authentication.kerberos.keytab</name>
    32.         <value>${this.keytab.dir}/HTTP.keytab</value>
    33.     </property>
  3. /etc/hadoop/conf/hdfs-site.xml: HDFSのWebコンソールで使用するプリンシパルを設定します。
    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/localhost@${this.realm}</value>
    12.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    13.     </property>
    14.     <property>
    15.         <name>dfs.web.authentication.kerberos.keytab</name>
    16.         <value>${this.keytab.dir}/HTTP.keytab</value>
    17.     </property>
  4. 編集後、各デーモンプロセスを再起動し反映させます。
  5. ブラウザからのアクセス方法については、SPNEGOonBrowserをご参照ください。

その他のサービス

  1. HttpFS?
  2. WebHDFS?

テスト

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

参考リソース

  1. 設定ファイル一式
  2. Hadoop MapReduce Next Generation - Cluster Setup
  3. CDH4 Security Guide

*1 Step 4: Create and Deploy the Kerberos Principals and Keytab Files

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-18 (日) 10:21:21 (2991d)