HDP1.3セットアップ >

目次

はじめに

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

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

  1. HDP2.1withSecurity?
  2. HDP2.0withSecurity - DEPRECATED
  3. HDP1.2withSecurity - DEPRECATED

セットアップ

Chefレシピ

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

  • cake.pnggrid-chef-repo:/roles/hadoop-pseudo-distributed-with-security.rb: これはデフォルトでは、Apache版のセキュアHadoopクラスタを構築するロールです。
    • cake.pnggrid-chef-repo:/roles/test-hdp-on-localhost.rb: HDPでクラスタ構築する場合には、このロールのように run_list に yum-hdp および hadoop-pseudo-distributed-with-security ロールを追加した上で、node['hadoop']['install_flavor'] 属性でディストリビューションを切り替え、必要に応じて他の属性を設定します。なお、実際に構築を行う hadoop::hdp レシピは、RPMパッケージを用いてHDPのインストールを行います。
      1. name 'test-hdp-on-localhost'
      2. description 'Testing Hortonworks Data Platform 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-hdp]',
      13.   #'role[hadoop-pseudo-distributed]',
      14.   'role[hadoop-pseudo-distributed-with-security]',
      15. )
      16.  
      17. # (...)
      18.  
      19. default_attributes(
      20.   'hdp' => {
      21.     'version' => '1.3.2',
      22.   },
      23.   'hadoop' => {
      24.     'install_flavor' => 'hdp',
      25.     'HADOOP_CLASSPATH' => '',
      26.     'HADOOP_USER_CLASSPATH_FIRST' => 'false',
      27.     # for 1.x only
      28.     'taskcontroller' => {
      29.       'min.user.id' => '500'
      30.     },
      31.   }
      32. )

Java

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

Kerberos認証環境

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

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

  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ファイルの内容を確認し、適切なパーミッションを設定します。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 -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-tt.keytab -p mapred/dn00000.grid.example.com
    ...
    kadmin.local:  ktadd -k /grid/etc/keytabs/pleiades/dn00001-tt.keytab -p mapred/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/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
    
    # SPNEGO用プリンシパルのために各ノードで適当なkeytabにシンボリックリンクします
     *:$ sudo ln -s {{nn,cn,jt,jh},dn-HTTP}.keytab HTTP.keytab

LDAP認可環境

  1. 各ノードのOSレベル、Hadoopレベルでの権限認可(グループ解決)をすべてLDAPに委ねます。
  2. 構築方法の詳細については、LDAPセットアップforHadoopをご参照ください。
  3. hadoop.security.group.mapping に設定する GroupMappingServiceProvider? のデフォルト設定は、ShellBasedUnixGroupsMapping? ですが、後述の通り 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のhadoop.http.authentication.kerberos.principal)がありますので、その点も注意する必要があります。
    • ただし、疑似分散環境(localhost)の場合には、通常のサーバセットアップで hostname に localhost を設定していることはまずないと思いますので、プリンシパルには明示的に localhost を設定する必要があります。
  • すべての設定後に各デーモンを再起動し反映させる必要があります。特にセキュアDataNodeについては後述の通り起動方法が若干変更になりますので、ご注意ください。
  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>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. /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.cluster.administrators</name>
    9.         <value> hdfs</value>
    10.     </property>
    11.     <property>
    12.         <name>dfs.namenode.kerberos.principal</name>
    13.         <value>hdfs/_HOST@${this.realm}</value>
    14.         <!-- <value>hdfs/${this.namenode.fqdn}@${this.realm}</value> -->
    15.         <description>Kerberos principal name for the NameNode</description>
    16.     </property>
    17.     <property>
    18.         <name>dfs.namenode.keytab.file</name>
    19.         <value>${this.keytab.dir}/nn.keytab</value>
    20.         <description>
    21.             Combined keytab file containing the namenode service and host
    22.             principals.
    23.         </description>
    24.     </property>
    25.     <property>
    26.         <name>dfs.secondary.namenode.kerberos.principal</name>
    27.         <value>hdfs/${this.secondary.namenode.fqdn}@${this.realm}</value>
    28.         <!-- <value>hdfs/_HOST@${this.realm}</value> v1.0.4: NG! -->
    29.         <description>
    30.             Kerberos principal name for the secondary NameNode.
    31.         </description>
    32.     </property>
    33.     <property>
    34.         <name>dfs.secondary.namenode.keytab.file</name>
    35.         <value>${this.keytab.dir}/cn.keytab</value>
    36.         <description>
    37.             Combined keytab file containing the namenode service and host
    38.             principals.
    39.         </description>
    40.     </property>
    41.     <property>
    42.         <name>dfs.block.access.token.enable</name>
    43.         <value>true</value>
    44.         <description>
    45.             If "true", access tokens are used as capabilities for accessing
    46.             datanodes.
    47.             If "false", no access tokens are checked on accessing datanodes.
    48.         </description>
    49.     </property>
    50.     <property>
    51.         <name>dfs.datanode.kerberos.principal</name>
    52.         <value>hdfs/localhost@${this.realm}</value>
    53.         <!-- <value>hdfs/_HOST@${this.realm}</value> -->
    54.         <description>
    55.             The Kerberos principal that the DataNode runs as. "_HOST" is
    56.             replaced by the real host name.
    57.         </description>
    58.     </property>
    59.     <property>
    60.         <name>dfs.datanode.keytab.file</name>
    61.         <value>${this.keytab.dir}/dn.keytab</value>
    62.         <description>
    63.             The filename of the keytab file for the DataNode.
    64.         </description>
    65.     </property>
    66.     <!-- (...) -->
    67.     <property>
    68.         <name>dfs.namenode.kerberos.internal.spnego.principal</name>
    69.         <value>${dfs.web.authentication.kerberos.principal}</value>
    70.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    71.         <!-- _HOST is replaced with dfs.namenode.http-address's host name. -->
    72.     </property>
    73.     <property>
    74.         <name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
    75.         <value>HTTP/${this.secondary.namenode.fqdn}@${this.realm}</value>
    76.         <!-- <value>${dfs.web.authentication.kerberos.principal}</value> -->
    77.         <!-- <value>HTTP/_HOST@${this.realm}</value> -->
    78.         <!-- _HOST is NOT replaced with dfs.namenode.secondary.http-address's host name?! -->
    79.     </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. HDP1.3は、Apache Hadoop 1.2ベースのため、SPNEGO/Kerberos の利用が可能です。この説明では、推奨の SPNEGO/Kerberos にてセットアップを行なっています。
  3. /etc/hadoop/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.         <!-- <value>mapred/${this.jobtracker.fqdn}@${this.realm}</value> -->
    29.     </property>
    30.     <property>
    31.         <name>mapreduce.jobtracker.keytab.file</name>
    32.         <value>${this.keytab.dir}/jt.keytab</value>
    33.     </property>
    34.     <property>
    35.         <name>mapreduce.tasktracker.kerberos.principal</name>
    36.         <value>mapred/localhost@${this.realm}</value>
    37.         <!-- <value>mapred/_HOST@${this.realm}</value> -->
    38.     </property>
    39.     <property>
    40.         <name>mapreduce.tasktracker.keytab.file</name>
    41.         <value>${this.keytab.dir}/tt.keytab</value>
    42.     </property>
  4. /etc/hadoop/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. /etc/hadoop/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. DataNodeの起動に使われる jsvc が含まれている hadoop-sbin パッケージをインストールします。
    $ sudo yum install hadoop-sbin
    $ rpm -ql hadoop-sbin
    /usr/lib/hadoop/bin/task-controller
    /usr/lib/hadoop/libexec/jsvc.amd64
    /usr/lib/hadoop/sbin
    /usr/lib/hadoop/sbin/Linux-amd64-64
    /usr/lib/hadoop/sbin/Linux-amd64-64/jsvc
    /usr/lib/hadoop/sbin/Linux-amd64-64/task-controller
  2. /etc/hadoop/hadoop-env.sh にセキュアDataNodeの設定を追加します。
    1. export HADOOP_SECURE_DN_USER=hdfs
    2. export HADOOP_SECURE_DN_PID_DIR=/var/run/hadoop
    3. 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を起動させます。note.png1.3でも依然以下のように停止している旨がエコーされますが、問題なく起動します。ただし、statusおよびstopコマンドは正常に動作しませんので、後述の回避策を施す必要があります。
    $ sudo service hadoop-datanode start
    Starting Hadoop datanode daemon (hadoop-datanode): starting datanode,
     logging to /grid/vol/0/var/log/hdfs/hadoop-hdfs-datanode-localhost.out
    datanode は停止しています
    1. note.pngこの起動スクリプトの不具合は、セキュアDataNodeの場合に限ってプロセスIDファイルのパス(${HADOOP_PID_DIR}/hadoop-${HADOOP_IDENT_STRING}-datanode.pid)構築と(停止時の)hadoop-daemon.sh実行ユーザ($TARGET_USER)の設定に失敗していることに起因しています。いささか謎めいたものになってしまいますが、以下の設定を追加することによりこの不具合を回避することができます。
      • /etc/hadoop/conf/hadoop-env.sh
        1. if [ x"$TARGET_USER_NAME" = x'HADOOP_DATANODE_USER' -a -n "$HADOOP_SECURE_DN_USER" ]; then
        2.     TARGET_USER=root
        3.     HADOOP_IDENT_STRING=$HADOOP_SECURE_DN_USER
        4. fi

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

  1. task-controller は、hadoop-sbin パッケージに含まれていますので、もし未インストールの場合にはインストールします。task-controller のパーミッションを確認しておきます。
    $ ls -l /usr/lib/hadoop/bin/task-controller 
    -rwsr-x--- 1 root mapred 32760 Aug 20 19:10 /usr/lib/hadoop/bin/task-controller
  2. LinuxTaskController? の設定ファイル(/etc/hadoop/conf/taskcontroller.cfg)を /etc/hadoop/conf/hadoop-env.sh(HADOOP_LOG_DIR)および /etc/hadoop/conf/mapred-site.xml(mapred.local.dir) と同様の内容に編集し、パーミッションを確認します。centos.pngCentOSでは一般ユーザのuidは通常500から振られるため、taskcontroller.cfgのmin.user.id の設定を500に引き下げることをお忘れなく。
    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
    3. #mapred.local.dir=/grid/vol/0/var/lib/mapred/local,/grid/vol/1/var/lib/mapred/local
    4. #configured value of hadoop.log.dir.
    5. hadoop.log.dir=/grid/vol/0/var/log/mapred
    6. #sleep time before sig kill is to be sent to process group after sigterm is sent. Should be in seconds
    7. mapred.tasktracker.tasks.sleeptime-before-sigkill=5000
    8. mapreduce.tasktracker.group=mapred
    9. #min.user.id=1000    # default
    10. min.user.id=500
    $ ls -l /etc/hadoop/conf/taskcontroller.cfg 
    -r-------- 1 root root 535 Sep 10 19:22 /etc/hadoop/conf/taskcontroller.cfg
  3. /etc/hadoop/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. /etc/hadoop/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. HistoryServer?を起動させます。info.pngHDP1.3では、hadoop-historyserverパッケージが追加されており、これをインストールすることによりserviceコマンドでHistoryServer?を起動できるようになりました。
    $ sudo service hadoop-historyserver start

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, v1.1, v1.2, HDP1.2, 1.3; OK: v2.0, CDH3, CDH4 -->
    29.         <!-- in the _HOST N/A environments.
    30.         <value>HTTP/${this.cluster.name}-nn.${this.domain}@${this.realm}</value>
    31.         <value>HTTP/${this.cluster.name}-cn.${this.domain}@${this.realm}</value>
    32.         <value>HTTP/${this.cluster.name}-jt.${this.domain}@${this.realm}</value>
    33.         <value>HTTP/${this.cluster.name}-jh.${this.domain}@${this.realm}</value>
    34.         <value>HTTP/dn00000.${this.domain}@${this.realm}</value>
    35.         <value>HTTP/dn00001.${this.domain}@${this.realm}</value>
    36.         -->
    37.     </property>
    38.     <property>
    39.         <name>hadoop.http.authentication.kerberos.keytab</name>
    40.         <value>${this.keytab.dir}/HTTP.keytab</value>
    41.     </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/_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 - ※HDP1.3では提供されていません。
  2. WebHDFS?

テスト

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

参考リソース

  1. 設定ファイル一式
  2. http://docs.hortonworks.com/

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

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