在Hadoop中,如何验证DFS传输上是否有数据加密?

在Hadoop中,如何验证DFS传输上是否有数据加密?,hadoop,encryption,hdfs,kerberos,sasl,Hadoop,Encryption,Hdfs,Kerberos,Sasl,我们在一个安全数据中心中没有多个用户的环境中运行Hadoop 3.2.1。我们更喜欢为节点之间的活动进行加密数据传输。我们已经确定不需要设置Kerberos,所以我正在通过块数据传输和web服务进行加密 由于hdfs site.xml中的以下设置,我似乎启用了DFS加密: <!-- SECURITY --> <property> <name>dfs.encrypt.data.transfer</name> <value&g

我们在一个安全数据中心中没有多个用户的环境中运行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>
我认为SASL是一个Kerberos特性,我不应该期望看到它被报告为真的。听起来对吗


是否有方法验证DFS是否正在节点之间加密数据?(我可以找到一个嗅探器…

来回答我自己的问题:我从来没有发现一条日志消息说“是的,您启用了加密”。但是,我运行了一个简单的基准测试,并注意到与加密一致的性能差异:

运行hadoop distcp所需的时间:

  • 无密码:5分钟
  • 3des:70分钟
  • rc4:12分钟
  • 3des+AES,128位:16分钟
  • 3des+AES,256位:18分钟
下面是一个Jinja模板,用于
hdfs site.xml
,如果
hadoop\u dfs\u encrypt=true,则为3des配置dfs.encrypt,AES 256位:

<!-- 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>

dfs.encrypt.data.transfer
{{hadoop_dfs_encrypt | default(false)}
dfs.block.access.token.enable
{{hadoop_dfs_encrypt | default(false)}
dfs.encrypt.data.transfer.cipher.suites
AES/CTR/NOP
dfs.encrypt.data.transfer.cipher.key.bitlength
256

从我所读到的内容来看,NN和DNs之间的dfs.encrypt密钥交换是不受保护的,除非您设置
hadoop.rpc.protection=privacy
。所有人都认为这需要Kerberos,但我仍在研究我的选项。

你应该阅读HortonWorks关于RPC加密的文档。。。特别是关于SASL QoP的部分,使用Kerberos creds进行“协商”并设置加密密钥。
<!-- 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>