MIT Kerberos 与 Hadoop

在本章中,我们来介绍如何在安全模式下为Hadoop配置身份验证。 当Hadoop配置为以安全模式运行时,每个Hadoop服务和每个用户都必须由Kerberos进行身份验证。

1. 用户认证

在Hadoop服务中,启用服务级别身份验证后,用户必须在与Hadoop服务交互之前进行身份验证, 最简单的方法是让用户使用Kerberos kinit命令以交互方式进行身份验证。 如使用kinit的交互式认证方式不可行时,可以使用Kerberos keytab文件来进行身份验证。

Hadoop Service的用户帐户

确保HDFS和YARN守护程序作为不同的Unix用户运行,例如 hdfs和yarn。 此外,确保MapReduce JobHistory服务器以不同的用户(如mapred)运行。这些用户可共享一个Unix组,例如Hadoop组。

1541940080538982.png

Hadoop Service的Kerberos Principal

对于每个Hadoop Service, 需使用其Kerberos Principal和 KeyTab文件来进行配置。

Service Principal的一般格式如下:

ServiceName/_HOST@REALM.TLD。

例如: dn/_HOST@EXAMPLE.COM

Hadoop允许将服务主体的主机名指定为_HOST通配符,从而简化配置文件的部署。 每个服务实例都将在运行时使用自己的主机名替换_HOST。 这样管理员可以在所有节点上方便地部署同一组配置文件, 但是,对于各个节点上的keytab文件会有所不同。

Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于Kerberos协议在每个Client和Service之间具有共享密钥,使得该协议具有相当的安全性。

HDFS

每个NameNode主机上的NameNode keytab文件应类似如下:

1541940244154400.png

在Secondary NameNode 节点主机上的Secondary NameNode keytab文件类似如下:

1541940283942670.png

每台主机上的DataNode keytab文件类似如下:

1541940327319457.png

YARN

ResourceManager主机上的ResourceManager KeyTab文件应如下所示:

1541940377290352.png

每台主机上的NodeManager KeyTab文件应如下所示:

1541940440867937.png

MapReduce JobHistory Server

该主机上的MapReduce JobHistory Server KeyTab文件应如下所示:

1541940557664820.png

Kerberos Principal到OS用户的映射

Hadoop使用hadoop.security.auth_to_local指定的规则将Kerberos主体映射到OS用户(系统)帐户。 这些规则的工作方式与Kerberos配置文件(krb5.conf)中的auth_to_local属性相同。 此外,Hadoop 的auth_to_local映射支持/ L标志,支持将返回值转变为小写。

默认情况下,如果realm与default_realm匹配(通常在/etc/krb5.conf中定义),则选择principal的第一个组件作为系统用户名。 例如 , 默认规则将主体host/full.qualified.domain.name@REALM.TLD映射到系统用户host。 默认规则并不适用于大多数群集节点。

在大多数Hadoop集群中,HDFS和YARN服务将分别作为系统hdfs和yarn用户启动。 hadoop.security.auth_to_local可以配置如下:

1541940609157680.png

 用户到组的映射

可以通过hadoop.security.group.mapping配置系统用户到组之间的映射。 详细的信息可以参照https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/GroupsMapping.html 。在这里,我们参见如下例子,此示例说明了CompositeGroupsMapping的典型用例,其中Hadoop身份验证使用信任AD Realm的MIT Kerberos。 在这种情况下,Service Principal(如hdfs,mapred,hbase,hive,oozie等)可以放在MIT Kerberos中,但是终端用户可能来自可信任的AD 域。示例如下:

image.png

2. 数据加密

RPC上的数据加密

在Hadoop服务和客户端之间传输的数据可以加密。 在core-site.xml中将hadoop.rpc.protection属性设置为privacy,就可激活数据加密。

DataNode 数据传输数据块加密

需要在hdfs-site.xml中将dfs.encrypt.data.transfer设置为true,为DataNode的数据传输协议激活数据加密。

可以将dfs.encrypt.data.transfer.algorithm设置为3des或rc4以选择特定的加密算法。 如果未指定,则使用系统上配置的JCE默认值,通常为3DES。

将dfs.encrypt.data.transfer.cipher.suites设置为AES / CTR / NoPadding可激活AES加密。 默认情况下,不使用AES。 使用AES时,在初始密钥交换期间仍会使用dfs.encrypt.data.transfer.algorithm中指定的算法。 可以通过将dfs.encrypt.data.transfer.cipher.key.bitlength设置为128,192或256来配置AES密钥长度。默认值为128。AES提供最优的加密强度和最佳性能。 目前,3DES和RC4算法在Hadoop集群中的使用频率更高。

HTTP数据加密

Web控制台和客户端之间的数据传输受SSL(HTTPS)的保护, 建议使用SSL配置。

要为HDFS的Web控制台启用SSL,将dfs.http.policy设置为hdfs-site.xml中的HTTPS_ONLY或HTTP_AND_HTTPS。

要为YARN守护程序的Web控制台启用SSL,在yarn-site.xml中将yarn.http.policy设置为HTTPS_ONLY。

要为MapReduce JobHistory服务器的Web控制台启用SSL,在mapred-site.xml中将mapreduce.jobhistory.http.policy设置为HTTPS_ONLY。

3. 安全配置

HDFS和本地文件系统路径的权限

下表列出了HDFS和本地文件系统(所有节点上)上建议的权限:

1541941146385638.png

常见配置

要在hadoop中启用RPC身份验证,将hadoop.security.authentication属性的值设置为“kerberos”,并相应地设置下面列出的安全相关设置,以下属性位于群集中所有节点的core-site.xml中:

1541941204413282.png

 NameNode

1541941253904691.png

以下设置允许配置对NameNode Web UI的SSL访问(可选项):

1541941368287697.png

Secondary NameNode

1541941397606931.png

JournalNode

1541941434729139.png

DataNode

1541941474397875.png

WebHDFS

1541941521279086.png

ResourceManager

1541941559541268.png

NodeManager

1541941594653265.png

MapReduce JobHistory Server

1541941632929523.png

4. 故障排除

Kerberos比较难于设置 , 并且难以调试。 常见的问题是:

  • 网络和DNS配置;
  • 主机上的Kerberos配置(/etc/krb5.conf);
  • Keytab创建和维护;
  • 环境设置:JVM,用户登录,系统时钟等;

有时候,来自JVM的错误消息基本上无助于诊断和解决相关的问题。这时,可以为客户端和Hadoop服务启用额外的调试信息:

将环境变量HADOOP_JAAS_DEBUG设置为true, 如下所示:

export HADOOP_JAAS_DEBUG = true

编辑log4j.properties文件以在DEBUG级别记录Hadoop的安全包:

log4j.logger.org.apache.hadoop.security= DEBUG

通过设置某些系统属性来启用JVM级别的调试:

export HADOOP_OPTS =“ - Djava.net.preferIPv4Stack = true -Dsun.security.krb5.debug = true -Dsun.security.spnego.debug”

使用KDiag进行故障排除

Hadoop提供KDiag工具来帮助验证Kerberos设置,它包含一系列用于JVM配置和环境的探测器,可以输出一些系统文件(/etc/krb5.conf,/etc/ntp.conf),打印出一些系统状态,然后尝试登录到Kerberos或使用特定 Keytab中的Principal。该命令的输出可用于本地诊断。

如果要调用该工具,只需将其完整的类名传递给bin / hadoop,bin / hdfs或bin / yarn命令,它将显示用于调用它的命令的kerberos客户端状态。

hadoop org.apache.hadoop.security.KDiag
hdfs org.apache.hadoop.security.Kdiag
yarnorg.apache.hadoop.security.Kdiag

该命令返回状态代码0,表示诊断运行成功,并不意味着Kerberos能够工作 – 仅仅是KDiag命令没有从其有限的输入中发现任何问题。特别是,由于它不会尝试连接到任何远程服务,因此它不会验证客户端是否受任何服务的信任。

如果该命令不成功,退出代码的意义是:

-1:命令因未知原因而失败

41:未经授权(== HTTP的401), KDiag检测到导致Kerberos无法工作的情况。检查输出以确定问题。

使用方法

1541941783863445.png

示例如下:

1541941808315347.png

上述示例执行诊断,加载HDFS和YARN XML资源,要求最小密钥长度为1024字节,并以主要zookeeper/devix.example.org@REALM身份登录,其密钥必须位于 keytab zk.service.keytab中。

MIT Kerberos 与 Hadoop

发表评论

电子邮件地址不会被公开。 必填项已用*标注

× 五 = 50