Hadoop:加密 Shuffle

简介

加密 Shuffle 功能允许使用 HTTPS 加密 MapReduce Shuffle,并可选择客户端身份验证(也称为双向 HTTPS 或带有客户端证书的 HTTPS)。它包括

  • 用于在 HTTP 和 HTTPS 之间切换 Shuffle 的 Hadoop 配置设置。

  • 用于指定 Shuffle 服务和获取 Shuffle 数据的 Reducer 任务使用的密钥库和信任库属性(位置、类型、密码)的 Hadoop 配置设置。

  • 一种在整个集群中重新加载信任库的方法(当添加或删除节点时)。

配置

core-site.xml 属性

若要启用加密 Shuffle,请在集群中所有节点的 core-site.xml 中设置以下属性

属性 默认值 说明
hadoop.ssl.require.client.cert false 是否需要客户端证书
hadoop.ssl.hostname.verifier DEFAULT 为 HttpsURLConnections 提供的主机名验证器。有效值包括:DEFAULTSTRICTSTRICT_IE6DEFAULT_AND_LOCALHOSTALLOW_ALL
hadoop.ssl.keystores.factory.class org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory 要使用的 KeyStoresFactory 实现
hadoop.ssl.server.conf ssl-server.xml 将从中提取 SSL 服务器密钥库信息的资源文件。此文件在类路径中查找,通常应位于 Hadoop conf/ 目录中
hadoop.ssl.client.conf ssl-client.xml 将从中提取 SSL 服务器密钥库信息的资源文件。此文件在类路径中查找,通常应位于 Hadoop conf/ 目录中
hadoop.ssl.enabled.protocols TLSv1.2 受支持的 SSL 协议。此参数仅由 DatanodeHttpServer 使用。

重要提示:当前需要将客户端证书设置为 false。有关详细信息,请参阅客户端证书部分。

重要提示:所有这些属性都应在群集配置文件中标记为 final。

示例

  <property>
    <name>hadoop.ssl.require.client.cert</name>
    <value>false</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.hostname.verifier</name>
    <value>DEFAULT</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.keystores.factory.class</name>
    <value>org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.server.conf</name>
    <value>ssl-server.xml</value>
    <final>true</final>
  </property>

  <property>
    <name>hadoop.ssl.client.conf</name>
    <value>ssl-client.xml</value>
    <final>true</final>
  </property>

mapred-site.xml 属性

要启用加密的 shuffle,请在群集中所有节点的 mapred-site.xml 中设置以下属性

属性 默认值 说明
mapreduce.shuffle.ssl.enabled false 是否启用加密的 shuffle

重要提示:此属性应在群集配置文件中标记为 final。

示例

  <property>
    <name>mapreduce.shuffle.ssl.enabled</name>
    <value>true</value>
    <final>true</final>
  </property>

应设置 Linux 容器执行程序,以防止作业任务读取服务器密钥库信息并获取 shuffle 服务器证书的访问权限。

有关如何执行此操作的详细信息,请参阅 Hadoop Kerberos 配置。

密钥库和信任库设置

当前,FileBasedKeyStoresFactory 是唯一的 KeyStoresFactory 实现。FileBasedKeyStoresFactory 实现使用 ssl-server.xmlssl-client.xml 文件中的以下属性来配置密钥库和信任库。

ssl-server.xml(Shuffle 服务器)配置

mapred 用户应拥有 ssl-server.xml 文件并拥有对其的独占读取访问权限。

属性 默认值 说明
ssl.server.keystore.type jks 密钥库文件类型
ssl.server.keystore.location NONE 密钥库文件位置。mapred 用户应拥有此文件并拥有对其的独占读取访问权限。
ssl.server.keystore.password NONE 密钥库文件密码
ssl.server.truststore.type jks 信任库文件类型
ssl.server.truststore.location NONE 信任库文件位置。mapred 用户应拥有此文件并拥有对其的独占读取访问权限。
ssl.server.truststore.password NONE 信任库文件密码
ssl.server.truststore.reload.interval 10000 信任库重新加载间隔(以毫秒为单位)

示例

<configuration>

  <!-- Server Certificate Store -->
  <property>
    <name>ssl.server.keystore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.server.keystore.location</name>
    <value>${user.home}/keystores/server-keystore.jks</value>
  </property>
  <property>
    <name>ssl.server.keystore.password</name>
    <value>serverfoo</value>
  </property>

  <!-- Server Trust Store -->
  <property>
    <name>ssl.server.truststore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.server.truststore.location</name>
    <value>${user.home}/keystores/truststore.jks</value>
  </property>
  <property>
    <name>ssl.server.truststore.password</name>
    <value>clientserverbar</value>
  </property>
  <property>
    <name>ssl.server.truststore.reload.interval</name>
    <value>10000</value>
  </property>
</configuration>

ssl-client.xml(Reducer/Fetcher)配置

mapred 用户应拥有 ssl-client.xml 文件,并且它应具有默认权限。

属性 默认值 说明
ssl.client.keystore.type jks 密钥库文件类型
ssl.client.keystore.location NONE 密钥库文件位置。mapred 用户应拥有此文件,并且它应具有默认权限。
ssl.client.keystore.password NONE 密钥库文件密码
ssl.client.truststore.type jks 信任库文件类型
ssl.client.truststore.location NONE 信任库文件位置。mapred 用户应拥有此文件,并且它应具有默认权限。
ssl.client.truststore.password NONE 信任库文件密码
ssl.client.truststore.reload.interval 10000 信任库重新加载间隔(以毫秒为单位)

示例

<configuration>

  <!-- Client certificate Store -->
  <property>
    <name>ssl.client.keystore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.client.keystore.location</name>
    <value>${user.home}/keystores/client-keystore.jks</value>
  </property>
  <property>
    <name>ssl.client.keystore.password</name>
    <value>clientfoo</value>
  </property>

  <!-- Client Trust Store -->
  <property>
    <name>ssl.client.truststore.type</name>
    <value>jks</value>
  </property>
  <property>
    <name>ssl.client.truststore.location</name>
    <value>${user.home}/keystores/truststore.jks</value>
  </property>
  <property>
    <name>ssl.client.truststore.password</name>
    <value>clientserverbar</value>
  </property>
  <property>
    <name>ssl.client.truststore.reload.interval</name>
    <value>10000</value>
  </property>
</configuration>

激活加密 Shuffle

进行上述配置更改后,通过重新启动所有 NodeManager 来激活加密 Shuffle。

重要信息:使用加密 Shuffle 会产生显著的性能影响。用户应对此进行分析,并可能为加密 Shuffle 预留 1 个或更多内核。

客户端证书

使用客户端证书并不能完全确保客户端是作业的 Reducer 任务。目前,所有向集群提交作业的用户都必须能够读取客户端证书(其私钥)密钥库文件。这意味着恶意作业可以读取此类密钥库文件,并使用其中的客户端证书与 Shuffle 服务器建立安全连接。但是,除非恶意作业拥有正确的 JobToken,否则它将无法从 Shuffle 服务器检索 Shuffle 数据。作业使用其自己的 JobToken,只能检索属于它自己的 Shuffle 数据。

重新加载信任库

默认情况下,信任库每 10 秒重新加载其配置。如果将新的信任库文件复制到旧文件上,则将重新读取该文件,并且其证书将替换旧证书。此机制对于向集群添加或移除节点,或添加或移除受信任的客户端非常有用。在这些情况下,客户端或 NodeManager 证书将被添加到(或从)系统中的所有信任库文件中移除,并且无需重新启动 NodeManager 守护进程即可选取新配置。

调试

注意:仅在进行故障排除时启用调试,并且仅对运行在少量数据上的作业启用调试。它非常详细,并且会将作业速度降低几个数量级。(你可能需要增加 mapred.task.timeout 以防止作业因任务运行得太慢而失败。)

要在 Reducer 中启用 SSL 调试,请在 mapreduce.reduce.child.java.opts 属性中设置 -Djavax.net.debug=all;例如

  <property>
    <name>mapred.reduce.child.java.opts</name>
    <value>-Xmx-200m -Djavax.net.debug=all</value>
  </property>

你可以按作业逐个进行此操作,或通过 mapred-site.xml 文件中的集群范围设置进行此操作。

要在 NodeManager 中设置此属性,请在 yarn-env.sh 文件中设置它

  YARN_NODEMANAGER_OPTS="-Djavax.net.debug=all"

加密的中间数据溢出文件

此功能允许在合并和 Shuffle 阶段生成中间文件时进行加密。可以通过将 mapreduce.job.encrypted-intermediate-data 作业属性设置为 true 来启用它。

名称 类型 说明
mapreduce.job.encrypted-intermediate-data 布尔值 启用或禁用加密中间 mapreduce 溢出文件。默认值为 false。
mapreduce.job.encrypted-intermediate-data-key-size-bits 整数 keygenerator 用于加密溢出到磁盘的数据时使用的密钥长度。
mapreduce.job.encrypted-intermediate-data.buffer.kb 整数 加密后写入磁盘的流的缓冲区大小(以 KB 为单位)。

注意:目前,启用加密中间数据溢出将把作业的尝试次数限制为 1。