加密随机播放功能允许使用HTTPS和可选的客户端身份验证(也称为双向HTTPS或带有客户端证书的HTTPS)对MapReduce随机播放进行加密。它包括:
Hadoop配置设置,用于在HTTP和HTTPS之间切换。
Hadoop配置设置,用于指定混洗服务和reducers任务用于获取混洗数据的密钥库和信任库属性(位置,类型,密码)。
一种在群集上重新加载信任库的方法(添加或删除节点时)。
要启用加密的随机播放,请在集群中所有节点的core-site.xml中设置以下属性:
属性 | 默认值 | 说明 |
---|---|---|
hadoop.ssl.require.client.cert | 假 | 是否需要客户端证书 |
hadoop.ssl.hostname.verifier | 默认 | 提供HttpsURLConnections的主机名验证程序。有效值为:DEFAULT,STRICT,STRICT_IE6,DEFAULT_AND_LOCALHOST和ALLOW_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,SSLv2您好,TLSv1.1,TLSv1.2 | 支持的SSL协议 |
重要说明:当前要求客户端证书的应设置为false。有关详细信息,请参阅“ 客户证书”部分。
重要说明:所有这些属性都应在群集配置文件中标记为final。
<属性> <name> hadoop.ssl.require.client.cert </ name> <value> false </ value> <final> true </ final> </ property> <属性> <name> hadoop.ssl.hostname.verifier </ name> <value> DEFAULT </ value> <final> true </ final> </ property> <属性> <name> hadoop.ssl.keystores.factory.class </ name> <value> org.apache.hadoop.security.ssl.FileBasedKeyStoresFactory </ value> <final> true </ final> </ property> <属性> <name> hadoop.ssl.server.conf </ name> <value> ssl-server.xml </ value> <final> true </ final> </ property> <属性> <name> hadoop.ssl.client.conf </ name> <value> ssl-client.xml </ value> <final> true </ final> </ property>
当前,FileBasedKeyStoresFactory是唯一的KeyStoresFactory实现。该FileBasedKeyStoresFactory实现使用下面的属性,在SSL-server.xml中和SSL-client.xml的文件,配置密钥库和信任库。
映射的用户应拥有ssl-server.xml文件,并且对该文件具有独占读取权限。
属性 | 默认值 | 说明 |
---|---|---|
ssl.server.keystore.type | ks | 密钥库文件类型 |
ssl.server.keystore.location | 没有 | 密钥库文件位置。被映射的用户应拥有此文件,并对该文件具有独占读取权限。 |
ssl.server.keystore.password | 没有 | 密钥库文件密码 |
ssl.server.truststore.type | ks | 信任库文件类型 |
ssl.server.truststore.location | 没有 | 信任库文件位置。被映射的用户应拥有此文件,并对该文件具有独占读取权限。 |
ssl.server.truststore.password | 没有 | 信任库文件密码 |
ssl.server.truststore.reload.interval | 10000 | 信任库重新加载时间间隔(以毫秒为单位) |
<配置> <!-服务器证书存储-> <属性> <name> ssl.server.keystore.type </ name> <value> jks </ value> </ property> <属性> <name> ssl.server.keystore.location </ name> <value> $ {user.home} /keystores/server-keystore.jks </ value> </ property> <属性> <name> ssl.server.keystore.password </ name> <value> serverfoo </ value> </ property> <!-服务器信任库-> <属性> <name> ssl.server.truststore.type </ name> <value> jks </ value> </ property> <属性> <name> ssl.server.truststore.location </ name> <value> $ {user.home} /keystores/truststore.jks </ value> </ property> <属性> <name> ssl.server.truststore.password </ name> <value> clientserverbar </ value> </ property> <属性> <name> ssl.server.truststore.reload.interval </ name> <value> 10000 </ value> </ property> </ configuration>
映射的用户应拥有ssl-client.xml文件,并且应具有默认权限。
属性 | 默认值 | 说明 |
---|---|---|
ssl.client.keystore.type | ks | 密钥库文件类型 |
ssl.client.keystore.location | 没有 | 密钥库文件位置。映射的用户应拥有此文件,并且应具有默认权限。 |
ssl.client.keystore.password | 没有 | 密钥库文件密码 |
ssl.client.truststore.type | ks | 信任库文件类型 |
ssl.client.truststore.location | 没有 | 信任库文件位置。映射的用户应拥有此文件,并且应具有默认权限。 |
ssl.client.truststore.password | 没有 | 信任库文件密码 |
ssl.client.truststore.reload.interval | 10000 | 信任库重新加载时间间隔(以毫秒为单位) |
<配置> <!-客户端证书存储-> <属性> <name> ssl.client.keystore.type </ name> <value> jks </ value> </ property> <属性> <name> ssl.client.keystore.location </ name> <value> $ {user.home} /keystores/client-keystore.jks </ value> </ property> <属性> <name> ssl.client.keystore.password </ name> <value> clientfoo </ value> </ property> <!-客户信任库-> <属性> <name> ssl.client.truststore.type </ name> <value> jks </ value> </ property> <属性> <name> ssl.client.truststore.location </ name> <value> $ {user.home} /keystores/truststore.jks </ value> </ property> <属性> <name> ssl.client.truststore.password </ name> <value> clientserverbar </ value> </ property> <属性> <name> ssl.client.truststore.reload.interval </ name> <value> 10000 </ value> </ property> </ configuration>
进行了上述配置更改后,请重新启动所有NodeManager,以激活Encrypted Shuffle。
重要说明:使用加密的混洗将对性能产生重大影响。用户应对此进行概要分析,并可能保留1个或多个内核用于加密混洗。
使用客户端证书不能完全确保客户端是作业的简化任务。当前,所有向群集提交作业的用户都必须能够读取客户端证书(其私钥)密钥库文件。这意味着流氓作业可以读取这些密钥库文件并使用其中的客户端证书来建立与Shuffle服务器的安全连接。但是,除非恶意作业具有正确的JobToken,否则它将无法从Shuffle服务器检索Shuffle数据。作业使用其自己的JobToken,只能检索属于其自身的随机数据。
默认情况下,信任库将每10秒重新加载其配置。如果将新的信任库文件复制到旧的信任库文件,则将重新读取该文件,并且其证书将替换旧的证书。此机制对于从群集中添加或删除节点,或添加或删除受信任的客户端很有用。在这些情况下,会将客户端或NodeManager证书添加到系统中的所有信任库文件中(或从其中删除),并且无需重新启动NodeManager守护程序即可获取新配置。
注意:启用调试仅用于故障排除,然后仅启用运行在少量数据上的作业。它非常冗长,使工作速度降低了几个数量级。(您可能需要增加mapred.task.timeout,以防止由于任务运行缓慢而导致作业失败。)
要在减速器中启用SSL调试,请在mapreduce.reduce.child.java.opts属性中设置-Djavax.net.debug = all;例如:
<属性> <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”
此功能允许对在合并和混洗阶段生成的中间文件进行加密。可以通过将mapreduce.job.encrypted-intermediate-data job属性设置为true来启用它。
名称 | 类型 | 描述 |
---|---|---|
mapreduce.job.encrypted-intermediate数据 | 布尔值 | 启用或禁用加密中间mapreduce溢出文件。默认值为false。 |
mapreduce.job.encrypted-intermediate-data-key-size-bits | 整型 | 密钥生成器用来加密溢出到磁盘的数据的密钥长度。 |
mapreduce.job.encrypted-intermediate-data.buffer.kb | 整型 | 加密后写入磁盘的流的缓冲区大小(以kb为单位)。 |
注意:当前,启用加密的中间数据溢出会将作业尝试次数限制为1。