分类:hadoop| 发布时间:2018-12-03 20:19:00
在上一篇文章 HDFS 部署 Kerberos 认证 中, 我们描述了在安全模式下 DataNode 在安全模式下有两种认证方式,一种是通过 SASL,另外一种是通过特权端口的方式。 上一篇文章描述了特权端口的配置方式,而本文主要描述 SASL 认证方式的配置方法。
整个集群有如下节点:
在 CA 服务器(没有专门的 CA 服务器的话可以在 NameNode 所在节点进行操作)进行以下操作
$ keytool -genkey -alias namenodekey -keyalg RSA -keypass {password} -storepass {password} -keystore namenode.jks
$ keytool -genkey -alias datanode1key -keyalg RSA -keypass {password} -storepass {password} -keystore datanode1.jks
$ keytool -genkey -alias datanode2key -keyalg RSA -keypass {password} -storepass {password} -keystore datanode2.jks
这一步主要为每个节点生成各自的密钥对
$ keytool -export -alias namenodekey -storepass {password} -file namenode.cert -keystore {keystore}
$ keytool -export -alias datanode1key -storepass {password} -file datanode1.cert -keystore {keystore}
$ keytool -export -alias datanode2-storepass {password} -file datanode2.cert -keystore {keystore}
$ keytool -import -v -trustcacerts -alias namenodekey -file namenode.cert -keystore truststore.jks -keypass {password}
$ keytool -import -v -trustcacerts -alias datanode1key -file datanode1.cert -keystore truststore.jks -keypass {password}
$ keytool -import -v -trustcacerts -alias datanode2key -file datanode2.cert -keystore truststore.jks -keypass {password}
这一步主要就是对每个节点的密钥对进行认证,大体的原理可以看 数字签名是什么?
所有节点进行以下修改
<property>
<name>ssl.server.keystore.type</name>
<value>jks</value>
</property>
<property>
<name>ssl.server.keystore.keypassword</name>
<value><password of keystore></value>
</property>
<property>
<name>ssl.server.keystore.password</name>
<value><password of keystore></value>
<description>Must be specified.</description>
</property>
<property>
<name>ssl.server.keystore.location</name>
<value><location of keystore.jks></value>
</property>
<property>
<name>ssl.server.truststore.type</name>
<value>jks</value>
</property>
<property>
<name>ssl.server.truststore.location</name>
<value><location of truststore.jks></value>
</property>
<property>
<name>ssl.server.truststore.password</name>
<value><password of truststore></value>
</property>
<property>
<name>ssl.client.truststore.password</name>
<value><password of truststore></value>
</property>
<property>
<name>ssl.client.truststore.type</name>
<value>jks</value>
</property>
<property>
<name>ssl.client.truststore.location</name>
<value><location of truststore.jks></value>
</property>
配置 SSH 无密码登录方式到 DataNode 的 hadoop 用户
<property>
<name>dfs.http.policy</name>
<value>HTTPS_ONLY</value>
</property>
<property>
<name>dfs.data.transfer.protection</name>
<value>authentication</value>
</property>
除了以上的配置项,还需要确保 dfs.datanode.address 和 dfs.datanode.http.address 的端口号不是特权端口。
# export HDFS_DATANODE_SECURE_USER=hadoop
# export JSVC_HOME=/usr/bin
$ 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 -Djavax.net.debug=ssl"
$ hdfs dfs -ls /