凌云的博客

行胜于言

HDFS 配置 SSL

分类:hadoop| 发布时间:2018-12-03 20:19:00


概述

在上一篇文章 HDFS 部署 Kerberos 认证 中, 我们描述了在安全模式下 DataNode 在安全模式下有两种认证方式,一种是通过 SASL,另外一种是通过特权端口的方式。 上一篇文章描述了特权端口的配置方式,而本文主要描述 SASL 认证方式的配置方法。

整个集群有如下节点:

  • namenode: 作为 namenode
  • datanode1:数据节点
  • datanode2:数据节点
  • KDC:作为 KDC 以及 admin-server

生成 keystore 和 truststore

在 CA 服务器(没有专门的 CA 服务器的话可以在 NameNode 所在节点进行操作)进行以下操作

  • 生成 keystore
$ 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

这一步主要为每个节点生成各自的密钥对

  • 生成 truststore
$ 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}

这一步主要就是对每个节点的密钥对进行认证,大体的原理可以看 数字签名是什么?

  • 接下来就是将各个密钥对复制到各自的节点,同时将 truststore.jks 复制到集群的每个节点。

配置 HDFS

公共配置

所有节点进行以下修改

  • 配置 ssl-server.xml,可从 ssl-server.xml.example 复制过来修改
<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>
  • 配置 ssl-client.xml,可从 ssl-client.xml.example 复制过来修改
<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>

配置 NameNode

配置 SSH 无密码登录方式到 DataNode 的 hadoop 用户

配置 DataNode

  • hdfs-site.xml
<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 的端口号不是特权端口。

  • 删除 hadoop-env.sh 中的
# export HDFS_DATANODE_SECURE_USER=hadoop
# export JSVC_HOME=/usr/bin

测试

  • 启动 HDFS 集群 在 NameNode 节点调用:
$ start-dfs.sh
  • 测试验证配置是否有效
    • 验证 RPC port
    $ kinit hdfs/client@HADOOPKRB
    $ hdfs dfs -ls /
    $ kdestroy
    $ hdfs dfs -ls /
    
    • 验证 REST port
    $ kinit hdfs/client@HADOOPKRB
    $ hdfs dfs -ls webhdfs://namenode:9000/
    

    端口 9000 需要根据你的实际情况进行修改,可以查看 namenode 的 core-site.xml 中的 fs.default.name 配置项得到当前配置的端口号

    • 遇到问题时,可以开启 debug 模式,如下:
    $ export HADOOP_ROOT_LOGGER=TRACE,console
    $ export HADOOP_OPTS="-Dsun.security.krb5.debug=true -Djavax.net.debug=ssl"
    $ hdfs dfs -ls /
    

参考