我们在安全数据中心中没有多个用户的环境中运行Hadoop 3.2.1。我们更喜欢为节点之间的活动进行加密数据传输。我们已经确定我们不需要设置 Kerberos,所以我正在努力对块数据传输和 Web 服务进行加密。
由于hdfs-site.xml中的以下设置,我似乎启用了DFS加密:
<!-- SECURITY -->
<property>
<name>dfs.encrypt.data.transfer</name>
<value>true</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>true</value>
</property>
我在启用了dfs.encrypt.data.transfer
的数据节点上收到握手错误,直到我也设置了dfs.block.access.token.enable
.
文件系统操作现在运行良好,但我仍然看到很多这样的事情:
2020-02-04 15:25:59,492 INFO sasl.SaslDataTransferClient: SASL encryption trust check: localHostTrusted = false, remoteHostTrusted = false
我认为 SASL 是 Kerberos 的一项功能,我不应该期望看到报告为真实。听起来对吗?
有没有办法验证DFS是否正在加密节点之间的数据?(我可以拿出一个嗅探器...
回答我自己的问题:我从未找到一条日志消息说"是的,您已启用加密"。但是,我确实运行了一个简单的基准测试,并注意到与发生的加密一致的性能差异:
运行hadoop distcp
所花费的时间:
- 无加密货币:5 分钟
- 3DES:70分钟
- RC4:12 分钟
- 3des+ AES,128 位:16 分钟
- 3des + AES,256 位:18 分钟
这里有一个用于hdfs-site.xml
的Jinja模板,它为3des,AES 256位,IFhadoop_dfs_encrypt=true
配置dfs.encrypt :
<!-- SECURITY -->
<property>
<name>dfs.encrypt.data.transfer</name>
<value>{{ hadoop_dfs_encrypt | default(false) }}</value>
</property>
<property>
<name>dfs.block.access.token.enable</name>
<value>{{ hadoop_dfs_encrypt | default(false) }}</value>
</property>
<property>
<name>dfs.encrypt.data.transfer.cipher.suites</name>
<value>AES/CTR/NoPadding</value>
</property>
<property>
<name>dfs.encrypt.data.transfer.cipher.key.bitlength</name>
<value>256</value>
</property>
根据我所读到的内容,NN 和 DN 之间的 dfs.encrypt 密钥交换不受保护,除非您设置hadoop.rpc.protection=privacy
。从各方面来看,这都需要 Kerberos,但我仍在研究我的选择。