这是我很早以前开始学习hadoop时写的一篇文章,文章内容比较粗糙,现在张贴出来。以飨读者。
1. Introduction
Kerberos Security Management Mechanism is new to hadoop 1.0 and Cloudera Distributed Hadoop. 在hadoop 1.0和CDH3中新加上了kerberos安全机制来控制hadoop集群的访问权限。在之前的版本,都没有kerberos安全论 证 之 说 , 默 认 集 群 是 可 靠 的 , 值 得 信 赖 的 。 在mr和hdfs交 互 时 都 不需要认证。
没有强有力的安全保障会使一些恶意用户恶意提交作业,篡 改jobtracker状 态 , 修 改hdfs文 件 , 甚 至 直 接 伪 装 成 合 法 用 户 去 修 改Hadoop集群的状态来控制hadoop集群。当然任何系统都没有绝对安全之说,只有安全的级别高低之分。
Kerberos可以将认证的密钥放到可靠的节点上,当集群运行时,集群内的节点使用密钥来认证。只有认证通过的节点才能加入到集群中来,流氓节点由于没有密钥信息而通不过验证,无法与集群内部的节点进行通信。防止了集群的恶意修改,保障了hadoop集群的安全运行。
2. Hadoop Kerberos Configuration
在配置之前需要在hadoop_env.sh里面配置一个java属性变量:
export HADOOP_OPTS="$HADOOP_OPTS -DKERBEROS_DOMAIN=you-kerberos-domain.com"
2.1 core-site.xml
在core-site.xml中配置如下参数。
<property> <name>hadoop.security.authorization</name> <value>true</value> <description>Is service-level authorization enabled?</description> </property> <property> <name>hadoop.rpc.protection</name> <value>privacy</value> <description>Possible values are authentication (no integrity, privacy) </description> </property> <property> <name>hadoop.security.authentication</name> <value>kerberos</value> <description>Possible values are simple (no authentication), and kerberos </description> </property>
2.2 hdfs-site.xml
在hdfs-site.xml中配置如下参数。
<property> <name>dfs.https.address</name> <value>namenodeHost:50470</value> </property> <property> <name>dfs.https.port</name> <value>50470</value> </property> <property> <name>dfs.block.access.token.enable</name> <value>true</value> </property> <property> <name>dfs.namenode.keytab.file</name> <value>/home/hadoop/hadoop/conf/hadoop.keytab</value> </property> <property> <name>dfs.namenode.kerberos.principal</name> <value>hadoop/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>dfs.namenode.kerberos.https.principal</name> <value>host/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>dfs.datanode.data.dir.perm</name> <value>755</value> <description>Permissions for the directories on on the local filesystem where the DFS data node store its blocks. The permissions can either be octal or symbolic. </description> </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> <property> <name>dfs.datanode.keytab.file</name> <value>/home/hadoop/hadoop/conf/hadoop.keytab</value> </property> <property> <name>dfs.datanode.kerberos.principal</name> <value>hadoop/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>dfs.datanode.kerberos.https.principal</name> <value>host/_HOST@${KERBEROS_DOMAIN}</value> </property>
2.3 mapred-site.xml
在mapred-site.xml中配置如下参数。
<property> <name>mapreduce.jobtracker.kerberos.principal</name> <value>hadoop/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>mapreduce.jobtracker.kerberos.https.principal</name> <value>host/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>mapreduce.jobtracker.keytab.file</name> <value>/home/hadoop/hadoop/conf/hadoop.keytab</value> </property> <property> <name>mapreduce.tasktracker.kerberos.principal</name> <value>hadoop/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>mapreduce.tasktracker.kerberos.https.principal</name> <value>host/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>mapreduce.tasktracker.keytab.file</name> <value>/home/hadoop/hadoop/conf/hadoop.keytab</value> </property> <property> <name>mapred.task.tracker.task-controller</name> <value>org.apache.hadoop.mapred.DefaultTaskController</value> </property> <property> <name>mapreduce.tasktracker.group</name> <value>hadoop</value> </property>
2.4 hadoop Startup Command
hadoop@_HOST:~\$ ~hadoop/hadoop/bin/hadoop-daemon.sh start namenode root@_HOST:~\# ~hadoop/hadoop/bin/hadoop-daemon.sh start datanode hadoop@_HOST:~\$ ~hadoop/hadoop/bin/hadoop-daemon.sh start jobtracker hadoop@_HOST:~\$ ~hadoop/hadoop/bin/hadoop-daemon.sh start tasktracker
2.5 Hadoop 1.0.3 fair-scheduler Kerberos Authentication Bug(when Job Submited)
这个bug解决得比较曲折。在官方的bug网站上已经有了相应的bug fix。找出了最终的原因是executorService的一种机制:ExecutorService可以产生若干个线程,但是不会同时生成(也就是说按需生成),因此在应该产生的时候就没有kerberos的相应的认证信息了。 请参考MAPREDUCE-4451 – fairscheduler fail to init job with kerberos authentication configured。
3. Secure HBase Kerberos Configuration
在配置之前需要在hbase_env.sh里面配置一个java属性变量:
export HBASE_OPTS="$HBASE_OPTS -DKERBEROS_DOMAIN=you-kerberos-domain.com"
3.1 hbase-site.xml
<property> <name>hbase.regionserver.kerberos.principal</name> <value>hbase/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>hbase.regionserver.keytab.file</name> <value>/home/hbase/hbase/conf/hdfs.keytab</value> </property> <property> <name>hbase.master.kerberos.principal</name> <value>hbase/_HOST@${KERBEROS_DOMAIN}</value> </property> <property> <name>hbase.master.keytab.file</name> <value>/home/hbase/hbase/conf/hdfs.keytab</value> </property> <property> <name>hbase.security.authentication</name> <value>kerberos</value> </property> <property> <name>hbase.security.authorization</name> <value>true</value> </property> <property> <name>hbase.rpc.engine</name> <value>org.apache.hadoop.hbase.ipc.SecureRpcEngine</value> </property> <property> <name>hbase.rpc.protection</name> <value>privacy</value> </property>
3.2 Secure HBase Startup Command
hbase@_HOST:~\$ ~hbase/hbase/bin/hbase-daemon.sh start master hbase@_HOST:~\$ ~hbase/hbase/bin/hbase-daemon.sh start regionserver
3.3 HBase Security Coprocessor Configuration
<property> <name>hbase.coprocessor.master.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController</value> </property> <property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hba </property>
3.4 HTable Security Command
hbase提供了三个安全控制表使用权限的命令:
- user_permission
- grant
- revoke