分类:hadoop| 发布时间:2018-12-03 11:18:00
本文主要描述了如何在一个 HDFS 集群中部署 Kerberos 认证,假设集群中有以下节点, 所有节点都是使用 Ubuntu 14.04 系统:
为了部署 Kerberos 认证,需要添加一台服务器用于部署 KDC(key distribution center), 部署 Kerberos 认证后整个集群有如下节点:
$ sudo apt-get install krb5-kdc krb5-admin-server
$ sudo dpkg-reconfigure krb5-config
在本文中以默认 realm 为 HADOOPKRB 为例,如果你配置了不同的默认 realm 需要作相应修改
$ sudo krb5_newrealm
$ sudo kadmin.local -q "addprinc -randkey hdfs/namenode@HADOOPKRB"
$ sudo kadmin.local -q "addprinc -randkey hdfs/datanode1@HADOOPKRB"
$ sudo kadmin.local -q "addprinc -randkey hdfs/datanode2@HADOOPKRB"
$ sudo kadmin.local -q "addprinc -randkey HTTP/namenode@HADOOPKRB"
$ sudo kadmin.local -q "addprinc -randkey HTTP/datanode1@HADOOPKRB"
$ sudo kadmin.local -q "addprinc -randkey HTTP/datanode2@HADOOPKRB"
这里一共为每个 HDFS 节点创建了两条 Principal,一个用于 HDFS 协议,一个用于 HTTP 协议。 在这里 -randkey 标志表示 kadmin 为 Principal 创建一个随机密码而不是由用户设置密码。 之所以在这里使用这个标志,是因为此 Principal 不需要用户交互。
$ sudo kadmin.local
kadmin.local addprinc hdfs/client@HADOOPKRB
这里创建的 Principal 主要用于客户端登录用。
$ kadmin.local -q "listprincs"
$ sudo kadmin.local -q "xst -norandkey -k hdfs.keytab hdfs/namenode@HADOOPKRB hdfs/datanode1@HADOOPKRB hdfs/datanode2@HADOOPKRB"
$ sudo kadmin.local -q "xst -norandkey -k http.keytab HTTP/namenode@HADOOPKRB HTTP/datanode1@HADOOPKRB HTTP/datanode2@HADOOPKRB"
$ sudo apt-get install krb5-user krb5-config
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[2:$1@$0](.*@HADOOPKRB)s/.*/hadoop/
DEFAULT
</value>
</property>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.kerberos.principal</name>
<value>hdfs/_HOST@HADOOPKRB</value>
</property>
<property>
<name>dfs.namenode.keytab.file</name>
<value>/etc/hadoop/hdfs.keytab</value>
</property>
<property>
<name>dfs.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@HADOOPKRB</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.keytab</name>
<value>/etc/hadoop/http.keytab</value>
</property>
<property>
<name>dfs.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOPKRB</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.principal</name>
<value>hdfs/_HOST@HADOOPKRB</value>
</property>
<property>
<name>dfs.secondary.namenode.keytab.file</name>
<value>/etc/hadoop/hdfs.keytab</value>
</property>
<property>
<name>dfs.secondary.namenode.kerberos.internal.spnego.principal</name>
<value>HTTP/_HOST@HADOOPKRB</value>
</property>
<property>
<name>dfs.secondary.web.authentication.kerberos.keytab</name>
<value>/etc/hadoop/http.keytab</value>
</property>
<property>
<name>dfs.secondary.web.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOPKRB</value>
</property>
在安全模式下 DataNode 有两种方式认证本身,一种是通过 SASL,另外一种是通过使用特权端口的方式。 这里使用通过特权端口的方式。
$ sudo apt-get install jsvc
<property>
<name>dfs.datanode.kerberos.principal</name>
<value>hdfs/_HOST@HADOOPKRB</value>
</property>
<property>
<name>dfs.datanode.keytab.file</name>
<value>/etc/hadoop/hdfs.keytab</value>
</property>
<property>
<name>dfs.datanode.address</name>
<value>0.0.0.0:578</value>
</property>
<property>
<name>dfs.datanode.http.address</name>
<value>0.0.0.0:579</value>
</property>
export HDFS_DATANODE_SECURE_USER=hadoop
export JSVC_HOME=/usr/bin
通过特权端口来认证 DataNode 的方式需要首先使用 root 用户启动 DataNode 的进程监听特权端口然后再切换到非 root 用户。 为了能在 NameNode 使用 start-dfs.sh 能启动各个 DataNode 的进程需要配置 NameNode 到各个 DataNode 的 root 用户的 SSH 认证。 关于 SSH 密钥认证的配置可以查看这里:How To Configure SSH Key-Based Authentication on a Linux Server
这里给出一个例子(/home/hadoop/.ssh/config):
host datanode1
user root
IdentityFile /home/hadoop/.ssh/node1_id_rsa
host datanode2
user root
IdentityFile /home/hadoop/.ssh/node2_id_rsa
$ start-dfs.sh
$ kinit hdfs/client@HADOOPKRB
$ hdfs dfs -ls /
$ kdestroy
$ hdfs dfs -ls /
$ kinit hdfs/client@HADOOPKRB
$ hdfs dfs -ls webhdfs://namenode:9000/
端口 9000 需要根据你的实际情况进行修改,可以查看 namenode 的 core-site.xml 中的 fs.default.name 配置项得到当前配置的端口号
$ export HADOOP_ROOT_LOGGER=TRACE,console
$ export HADOOP_OPTS="-Dsun.security.krb5.debug=true"
$ hdfs dfs -ls /