hadoop集群中添加kerberos认证

来源:互联网 发布:linux oracle怎么启动 编辑:程序博客网 时间:2024/06/04 22:47

hadoop集群中添加kerberos认证

可以参照cloudera的官网方法:http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Security-Guide/CDH4-Security-Guide.html
但本人的配置与其有所不同,更简单一点
本人使用的是hadoop_cloudera_mr1_CDH4.2.1版本

一. 在kdc上添加user principal和host principal
创建user principal
kadmin: addprinc -randkey cxz/rock-hdpnn.dscc@KERBEROS.ROCK
kadmin: addprinc -randkey cxz/rock-hdp1.dscc@KERBEROS.ROCK
kadmin: addprinc -randkey cxz/rock-hdp2.dscc@KERBEROS.ROCK

创建host principal
kadmin: addprinc -randkey host/rock-hdpnn.dscc@KERBEROS.ROCK
kadmin: addprinc -randkey host/rock-hdp1.dscc@KERBEROS.ROCK
kadmin: addprinc -randkey host/rock-hdp2.dscc@KERBEROS.ROCK

个人理解:user/host_name@realm是用于服务的认证,而user@realm是用于用户的认证
创建完成后,可以用命令listprincs查看。

二、创建keytab文件
kadmin: xst -norandkey -k cxz.keytab cxz/rock-hdpnn.dscc cxz/rock-hdpnn.dscc
kadmin: xst -norandkey -k cxz.keytab cxz/rock-hdp1.dscc cxz/rock-hdp1.dscc
kadmin: xst -norandkey -k cxz.keytab cxz/rock-hdp2.dscc cxz/rock-hdp2.dscc
我是用的是ubuntu系统,貌似不支持此命令,必须通过下面的手段生成。

#cd ../var/krb5kdc
#kadmin
kadmin: xst -k cxz-unmerged.keytab cxz/rock-hdpnn.dscc@KERBEROS.ROCK
kadmin: xst -k cxz-unmerged.keytab cxz/rock-hdp1.dscc@KERBEROS.ROCK
kadmin: xst -k cxz-unmerged.keytab cxz/rock-hdp2.dscc@KERBEROS.ROCK

kadmin: xst -k host.keytab host/rock-hdpnn.dscc@KERBEROS.ROCK
kadmin: xst -k host.keytab host/rock-hdp1.dscc@KERBEROS.ROCK
kadmin: xst -k host.keytab host/rock-hdp2.dscc@KERBEROS.ROCK
可以看到在当前目录下新生成了两个keytab文件

注:CDH4的官方文档里头,不是使用host,而是HTTP,建议采用HTTP方式,这样可以使用HFTP方式访问

合并两个keytab文件
#cd ../var/krb5kdc
#ktutil
ktutil: rkt cxz-unmerged.keytab
ktutil: rkt host.keytab
ktutil: wkt cxz.keytab
ktutil: clear
可以看到在当前文件下新生成了cxz.keytab文件

可以使用如下命令查看keytab文件的内容
#klist -e -k -t cxz.keytab
利用keytab文件获取票据可以使用如下命令
# kinit -k -t cxz.keytab cxz/fully.qualified.domain.name@YOUR-REALM.COM

三、停止hadoop集群,校正文件夹权限
FileSystem      Directory        permissions
Local       dfs.namenode.name.dir     drwx------
Local       dfs.datanode.data.dir     drwx------
Local       mapred.local.dir      drwxr-xr-x
HDFS       mapreduce.jobtracker.system.dir   drwx------
HDFS       /(root dir)        drwxr-xr-x

四、如果是使用AES-256加密方式,还得安装JCE(Java Cryptography Extension)
本人未使用此加密方式,所以具体不细说了!
可以使用klist -e查看具体的加密方式。

五、进行添加kerberos5认证的配置
1. 配置core-site.xml

    <property>        <name>hadoop.security.authentication</name>        <value>kerberos</value>    </property>    <property>        <name>hadoop.security.authorization</name>        <value>true</value>    </property>


2. 配置hdfs-site.xml

<!-- General HDFS security config -->    <property>        <name>dfs.block.access.token.enable</name>        <value>true</value>    </property>    <!-- NameNode security config -->    <property>        <name>dfs.namenode.keytab.file</name>        <value>/home/cxz/hadoop/conf/cxz.keytab</value>    </property>    <property>        <name>dfs.namenode.kerberos.principal</name>        <value>cxz/_HOST@KERBEROS.ROCK</value>    </property>    <property>        <name>dfs.namenode.kerberos.internal.spnego.principal</name>        <value>HTTP/_HOST@KERBEROS.ROCK</value>    </property>    <!-- DataNode security config -->    <property>        <name>dfs.datanode.data.dir.perm</name>        <value>700</value>    </property>    <property>        <name>dfs.datanode.address</name>        <value>0.0.0.0:51004</value>    </property>    <property>        <name>dfs.datanode.http.address</name>        <value>0.0.0.0:51006</value>    </property>    <property>        <name>dfs.datanode.keytab.file</name>        <value>/home/cxz/hadoop/conf/cxz.keytab</value>    </property>    <property>        <name>dfs.datanode.kerberos.principal</name>        <value>cxz/_HOST@KERBEROS.ROCK</value>    </property>    <property>        <name>ignore.secure.ports.for.testing</name>        <value>true</value>    </property>


注:上头的51004和51006两端口,在官方中是指定要配置小于1024,这个是为了安全起见,但是配置小于1024就得用root用户启动,不然需要配置好jsvc进行启动。
这样比较麻烦,本人将其设置的很大,这样就需要最后一个配置,指明是在进行test,否则会无法启动。

3. 配置mapred-site.xml

<property>        <name>mapreduce.jobtracker.staging.root.dir</name>        <value>/user</value>    </property>    <property>        <name>mapred.child.java.opts</name>        <value>-server -Dcom.sun.management.jmxremote -Djava.security.krb5.conf=/home/cxz/kerberos5-client/etc/krb5.conf</value>    </property>    <!-- JobTracker security configs -->    <property>        <name>mapreduce.jobtracker.kerberos.principal</name>        <value>cxz/_HOST@KERBEROS.ROCK</value>    </property>    <property>        <name>mapreduce.jobtracker.keytab.file</name>        <value>/home/cxz/hadoop/conf/cxz.keytab</value>    </property>    <!-- TaskTracker security configs -->    <property>        <name>mapreduce.tasktracker.kerberos.principal</name>        <value>cxz/_HOST@KERBEROS.ROCK</value>    </property>    <property>        <name>mapreduce.tasktracker.keytab.file</name>        <value>/home/cxz/hadoop/conf/cxz.keytab</value>    </property> <!-- TaskController setting -->    <!-- property>        <name>mapred.task.tracker.task-controller</name>        <value>org.apache.hadoop.mapred.LinuxTaskController</value>    </property>    <property>        <name>mapreduce.tasktracker.group</name>        <value>cxz</value>    </property -->

注:mapred.child.java.opts此配置是为了job执行时能够找到kerberos的配置文件,不然会job执行失败。
还有最后的task-controller可以不用配置。

4. 配置hadoop-env.sh
加入如下配置
export KRB5_HOME=/home/cxz/kerberos5-client
export KRB5_CONFIG=${KRB5_HOME}/etc/krb5.conf

export HADOOP_OPTS="-Djava.net.preferIPv4Stack=true -Djava.security.krb5.conf=${KRB5_CONFIG} -Dsun.security.krb5.debug=true"

六、部署keytab文件和kerberos5-client(每个节点都需要)
1. 将前面所说的生成的cxz.keytab文件copy到每个节点的hadoop_home/conf文件下,配置文件中有体现
2. 将kerberos5中的bin, etc, lib抽取出来就是kerberos5-client了,将其部署到每个节点。
可以在bin目录下写个自己的认证脚本
服务的认证脚本:kinit_cxz.sh

#! /bin/bashUSER=`whoami`HOST=`hostname`### init_kerberos_auth KRB5_HOME=/home/$USER/kerberos5-clientexport KRB5_CONFIG=${KRB5_HOME}/etc/krb5.confexport LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${KRB5_HOME}/lib${KRB5_HOME}/bin/kinit -k -t ~/hadoop/conf/cxz.keytab  cxz/rock-hdpnn.dscc@KERBEROS.ROCK${KRB5_HOME}/bin/klist


如果是hadoop-client端的普通用户认证
echo "$PASSWD" | ${KRB5_HOME}/bin/kinit -p $PRINCIPAL


注:若添加了kerberos后,想使用hftp方式访问,在创建keytab时需要使用HTTP,并且在hdfs-site.xml中必须配置dfs.https.port与dfs.http.port相同,这个是hadoop的一个bug,貌似还未解决。

原创粉丝点击