- Authors
- Name
Overview
Hadoopをインストールすると、デフォルトではセキュリティが適用されていません。Hadoopにセキュリティを適用するには、Kerberosという認証システムを使用する必要があり、その構築はかなり難しい作業であるため、ドキュメントとしてまとめることにしました。
Secured Hadoop 構築方法 公式ドキュメントを参考に作成しました。
- Hadoopクラスターの構築
- Linuxユーザーの作成
- Linux上でのディレクトリ作成
- Kerberos Principalの作成
- jsvcのインストール
- Configurationの修正
- JournalNode、NameNode、DataNodeの起動
Hadoopクラスターの構築
Kerberosセキュリティを適用する前に、Hadoopクラスターが既に構築されていることを前提とします。また、H/A(高可用性)のために2台のNameNodeと3台のJournalNodeがあることを前提とします。これにはZooKeeperが必要です。
Linuxユーザーの作成
Linuxにhadoopグループとhdfsアカウントが存在する必要があります。Kerberosを適用するには、そのアカウントでNameNodeやDataNodeを起動する必要があるためです。
Linux上でのディレクトリ作成
NameNodeデータ保存先の/dfs/nn、JournalNode保存先の/dfs/jn、そしてDataNode保存先の/dfs/dnフォルダを事前に作成し、適切な権限を付与しておく必要があります。
Kerberos Principalの作成
Kerberos Serverにhdfs/{fqdn}@{realm}とHTTP/{fqdn}@{realm}のprincipalを作成し、そのprincipalでログインできるkeytabをダウンロードしておきます。このkeytabでログインするには、/etc/krb5.confファイルが正しく定義されている必要があります。
jsvcのインストール
secured環境では、DataNodeの実行が最も難しい部分です。jsvcを使用して実行する必要があるためです。
yum install jsvcwhich jsvc
which jsvc
Configurationの修正
以下のconfigurationは、すべてのサーバーで同一である必要があります。
<configuration>
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1.mysite.com:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2.mysite.com:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1.mysite.com:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2.mysite.com:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop1.mysite.com:8485;hadoop2.mysite.com:8485;hadoop3.mysite.com:8485/mycluster</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1.mysite.com:2181,hadoop2.mysite.com:2181,hadoop3.mysite.com:2181</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/dfs/nn</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/dfs/dn</value>
</property>
<property>
<name>dfs.blocksize</name>
<value>134217728</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/dfs/jn</value>
</property>
<!-- JournalNode -->
<property>
<name>dfs.journalnode.keytab.file</name>
<value>/etc/hdfs.keytab</value>
</property>
<property>
<name>dfs.journalnode.kerberos.principal</name>
<value>hdfs/_HOST@{CHAOS.ORDER.COM}</value>
</property>
<property>
<name>dfs.journalnode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@CHAOS.ORDER.COM</value>
</property>
<!-- NameNode -->
<property>
<name>dfs.namenode.keytab.file</name>
<value>/etc/hdfs.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/_HOST@CHAOS.ORDER.COM</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>${dfs.web.authentication.kerberos.principal}</value>
</property>
<!-- DataNode -->
<property>
<name>dfs.datanode.keytab.file</name>
<value>/etc/hdfs.keytab</value>
</property>
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hdfs/_HOST@CHAOS.ORDER.COM</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:1004</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:1006</value>
</property>
<!-- Web -->
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/etc/hdfs.keytab</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@CHAOS.ORDER.COM</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>0.0.0.0:50090</value>
</property>
<property>
<name>dfs.namenode.secondary.https-address</name>
<value>0.0.0.0:50091</value>
</property>
</configuration>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop1.mysite.com:2181,hadoop2.mysite.com:2181,hadoop3.mysite.com:2181</value>
</property>
<property>
<name>hadoop.rpc.protection</name>
<value>authentication</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
</configuration>
以下のファイルにあるコメントアウトされたJSVC_HOMEとHADOOP_SECURE_DN_USERの部分をコメント解除します。
which jsvcで得られる値をJSVC_HOMEに、HADOOP_SECURE_DN_USERにはhdfsを設定します。
# The jsvc implementation to use. Jsvc is required to run secure datanodes
# that bind to privileged ports to provide authentication of data transfer
# protocol. Jsvc is not required if SASL is configured for authentication of
# data transfer protocol using non-privileged ports.
export JSVC_HOME=/usr/bin
# On secure datanodes, user to run the datanode as after dropping privileges.
# This **MUST** be uncommented to enable secure HDFS if using privileged ports
# to provide authentication of data transfer protocol. This **MUST NOT** be
# defined if SASL is configured for authentication of data transfer protocol
# using non-privileged ports.
export HADOOP_SECURE_DN_USER=hdfs
JournalNode、NameNode、DataNodeの起動
クラスターの初期構築の場合、以下の手順が必要です。
- ZooKeeperの起動:
zookeeper/bin/zkServer.sh start(3台すべて) - ZKFCのフォーマット:
hdfs zkfc -formatZK(1回のみ実行) - JournalNodeの起動:
hdfs journalnode(3台すべて) - Active NameNodeのフォーマット:
hdfs namenode -format(Active NameNodeで1回のみ実行) - Active NameNodeの起動:
hdfs namenode(Active NameNodeで実行) - Standby NameNodeのフォーマット:
hdfs namenode -bootstrapStandby(Standby NameNodeで1回のみ実行) - Standby NameNodeの起動:
hdfs namenode(Standby NameNodeで実行) - ZKFCの起動:
hdfs zkfc(Active、Standby NameNodeがあるノードで実行) - DataNodeの起動:
hdfs datanode(データノードで実行)
注意点として、JournalNode、NameNode、ZKFCはhdfsアカウントで実行し、DataNodeとZooKeeperはrootアカウントで実行する必要があります。
インストールが正常に完了すると、
http://namenode_ip_address:9870 でNameNode Web UIにアクセスできます。 そして、以下のようにsecurityの部分がonと表示されている必要があります。
