13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop

作者: 疯狂小兵 | 2016-07-15 | 阅读
「编辑」 「本文源码」

介绍

该文档描述了怎样配置Hadoop安全模式的认证。

默认情况下,Hadoop运行在非安全模式,实际上不需要认证。通过配置Hadoop运行在安全模式。为了使用Hadoop服务,每个用户和服务都需要Kerberos的认证。

Hadoop的安全特性包括: 认证 服务等级认证 web控制台认证 数据保密

认证

最终用户账户

当服务等级认证开始时,使用处于安全模式的Hadoop的最终用户需要被Kerberos认证。最简单认证的方式使用Kerberos的命令kinit

Hadoop守护进程的用户账户

确保HDFS和YARN进程运行在不同的*nix用户,比如hdfsyarn。确保MapReduce JobHistory server运行不同的用户如mapred

推荐将他们放在同一个*nix组,比如,hadoop。群组管理请看从用户到组的映射

用户:组 守护进程
hdfs:hadoop NameNode,Secondary NameNode,JournalNameNode,DataNode
yarn:hadoop ResourceManager,NodeManager
mapred:hadoop MapReduce JobHistory server

Hadoop守护进程和用户的Kerberos负责人

为了在Hadoop安全模式中运行Hadoop服务守护进程,Kerberos负责人是必须的,每个服务都会根据适当的权限读取保存在keytab文件内的认证信息

HTTP的web控制台应该被另一个主要的RPC提供服务。

下面会展示Hadoop服务认证的例子

HDFS

NameNode主机上的NameNode keytab文件应该如下这样:

$ klist -e -k -t /etc/security/keytab/nn.service.keytab
Keytab name: FILE:/etc/security/keytab/nn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

Secondary NameNode主机上的Secondary NameNode keytab文件应该如下这样:

$ klist -e -k -t /etc/security/keytab/sn.service.keytab
Keytab name: FILE:/etc/security/keytab/sn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 sn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

每台DataNode主机上的DataNode keytab文件应该如下这样:

$ klist -e -k -t /etc/security/keytab/dn.service.keytab
Keytab name: FILE:/etc/security/keytab/dn.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 dn/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

YARN

ResourceManager主机上的ResourceManager keytab文件应该如下这样:

$ klist -e -k -t /etc/security/keytab/rm.service.keytab
Keytab name: FILE:/etc/security/keytab/rm.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 rm/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

NodeManager 主机上的NodeManager keytab文件应该如下这样:

$ klist -e -k -t /etc/security/keytab/nm.service.keytab
Keytab name: FILE:/etc/security/keytab/nm.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 nm/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

MapReduce JobHistory server

MapReduce JobHistory Server 主机上的MapReduce JobHistory Server keytab文件应该如下这样:

$ klist -e -k -t /etc/security/keytab/jhs.service.keytab
Keytab name: FILE:/etc/security/keytab/jhs.service.keytab
KVNO Timestamp         Principal
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 jhs/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-256 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (AES-128 CTS mode with 96-bit SHA-1 HMAC)
   4 07/18/11 21:08:09 host/full.qualified.domain.name@REALM.TLD (ArcFour with HMAC/md5)

kerberos负责人到系统用户账户的映射

Hadoop使用hadoop.security.auth_to_local(与kerberos配置文件(krb5.conf)auth_to_local一样的方式)指定的规则将kerberos负责人映射到系统用户账户。 此外,Hadoop的auth_to_local映射支持/L标志,那小写字母返回的名字。

默认情况下,如果realm匹配到default_realm(通常定义在/etc/krb5.conf),会选负责人名字的第一部分作为用户名, 例如,默认规则是host/full.qualified.domain.name@REALM.TLD被映射到host

自定义规则可以使用 hadoop kerbname命令测试。该命令允许你指定一个负责人,并支持Hadoop当前auth_to_local的规则集。

将用户映射到组

尽管HDFS上文件被关联到所有人和组,Hadoop自己没有定义组。将用户映射到组是被OS或者LDAP完成的。

可以通过指定映射程序的名字作为hadoop.security.group.mapping的值来改变映射的方式。详情请看HDFS权限指南

事实上,你需要在Hadoop安全模式中用LDAP使用kerberos管理SSO环境。

代理用户

一些产品如Apache Oozie代表最终用户访问Hadoop的服务需要可以模仿最终用户才行。详情请看代理用户文档

安全的DataNode

因为DataNode的数据传输协议没有使用Hadoop的RPC框架,DataNode会使用dfs.datanode.addressdfs.datanode.http.address指定的特有端口验证她自己。该验证基于假设攻击者不能获得root特权。’

当你作为root用户执行hdfs datanode命令,服务进程首先会绑定特权端口。然后带着特权,运行HADOOP_SECURE_DN_USER指定的用户账户。启动进程会使用JSVC_HOME处的jsvc。在启动时必须指定HADOOP_SECURE_DN_USERJSVC_HOME作为环境变量(在hadoop-env.sh)。

跟2.6.0版本一样,SASL(Simple Authentication and Security Layer)用来验证数据传输协议。在该配置中,对于安全集群不再需要作为root用户使用ysvc和绑定特权端口来启动DataNode。为了在数据传输协议上启用SASL,设置hdfs-site.xml中的dfs.data.transfer.protection,为dfs.datanode.address设置非特权端口,将dfs.http.policy设置到HTTPS_ONLY。 并确保HADOOP_SECURE_DN_USER环境变量没有定义。

注意:如果dfs.datanode.address设置到特权端口,就不能讲SASL使用在数据传输协议上。这就是要向后兼容的原因。

为了将一个现有的集群从使用root认证迁移到开始使用SASL。首先确保集群的所有节点都是部署的2.6.0版本及以上,同时没有任何外部应用连接到集群。只有2.6.0及以后版本的HDFS客户端可以使用SASL作为数据传输协议的验证连接到DataNode。因此在迁移之前所有的调用者使用正确的版本是至关重要的。在部署了2.6.0或更新版本后,更新所有的外部应用配置来启用SASL。 如果HDFS客户端启用了SASL,那么就可以成功连接到不管是运行root验证还是SASL验证的DataNode上了。 保证所有客户端的配置更改,随后DataNode上的配置更改将不会使应用程序混乱。 最后,每个单独的DataNode可以通过更改配置并重启来迁移。在迁移期间,暂时允许一部分DataNode运行root验证,一部分DataNode运行SASL验证的混合状态,因为HDFS客户端启用了SASL,两种方式都能连接。

数据保密性

RPC数据加密

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

块数据传输上的数据加密

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

作为可选项,你可以设置dfs.encrypt.data.transfer.algorithm3desrc4来选择指定的加密算法。如果没有指定,那么JCE默认配置系统上使用的,通常为3DES

设置dfs.encrypt.data.transfer.cipher.suitesAES/CTR/NoPadding来激活AES加密。默认情况下,是没有指定的,因此AES没有被使用。当AES使用时,在dfs.encrypt.data.transfer.algorithm中指定的算法仍然在初始化key交换期间使用。AES 的key位长可以通过设置dfs.encrypt.data.transfer.cipher.key.bitlength为128,192或256进行配置。默认为128位。

AES提供最大的加密强度和最佳的性能。此时,3DES和RC4在Hadoop集群中更常用。

HTTP上的数据加密

web控制台和客户端之间的数据传输受SSL保护。

配置

允许HDFS和本地文件系统路径

下表中列举了HDFS和本地文件系统中多种路径和推荐的权限:

文件系统 路径 用户:组 权限
local dfs.namenode.name.dir hdfs:hadoop drwx------
local dfs.datanode.data.dir hdfs:hadoop drwx------
local $HADOOP_LOG_DIR hdfs:hadoop drwxrwxr-x
local $YARN_LOG_DIR yarn:hadoop drwxrwxr-x
local yarn.nodemanager.local-dirs yarn:hadoop drwxr-xr-x
local yarn.nodemanager.log-dirs yarn:hadoop drwxr-xr-x
local container-executor root:hadoop --Sr-s--*
local conf/container-executor.cfg root:hadoop r-------*
hdfs / hdfs:hadoop drwxr-xr-x
hdfs /tmp hdfs:hadoop drwxrwxrwxt
hdfs /user hdfs:hadoop drwxr-xr-x
hdfs yarn.nodemanager.remote-app-log-dir yarn:hadoop drwxrwxrwxt
hdfs mapreduce.jobhistory.intermediate-done-dir mapred:hadoop drwxrwxrwxt
hdfs mapreduce.jobhistory.done-dir mapred:hadoop drwxr-x---

通用配置

为了启用Hadoop上的RPC验证,将hadoop.security.authentication属性值设置为kerberos,并设置适当的下面列出的安全相关设置

下面的属性应该设置在集群所有节点的core-site.xml中。

参数 备注
hadoop.security.authentication kerberos 默认没有验证,kerberos启用kerberos验证
hadoop.security.authorization true 启用RPC服务等级验证
hadoop.rpc.protection authentication authentication:只验证(默认);integrity:除了authentication的完整性检查;privacy:除了integrity的数据加密
hadoop.security.auth_to_local RULE:exp1 RULE:exp2 … DEFAULT 该值是包含新行字符的字符串,正则的格式请看kerberos文档
hadoop.proxyuser.superuser.hosts host1,host2 逗号分隔的主机,允许超级用户扮演用户的来源主机;*意味着通配所有主机。
hadoop.proxyuser.superuser.groups group1,group2 被超级用户扮演的用户所属的群组,群组列表由逗号分隔。*意味着通配所有群组。

NameNode

参数 备注
dfs.block.access.token.enable true 启用HDFS块访问token来保证安全操作
dfs.https.enable true 已经过期,使用dfs.http.policy
dfs.http.policy HTTP_ONLY or HTTPS_ONLY or HTTP_AND_HTTPS HTTPS_ONLY:关闭http访问;该操作优先于dfs.https.enablehadoop.ssl.enabled。如果使用SASL来验证数据传输协议替换DataNode上的root,并使用特权端口,那么该属性必须设置为HTTPS_ONLY来保证HTTP 服务器的验证。请看dfs.data.transfer.protection
dfs.namenode.https-address nn_host_fqdn:50470  
dfs.https.port 50470  
dfs.namenode.keytab.file /etc/security/keytab/nn.service.keytab NameNode的kerberos的keytab文件
dfs.namenode.kerberos.principal nn/_HOST@REALM.TLD NameNode的kerberos的负责人名称
dfs.namenode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD NameNode的HTTP kerberos的负责人名称

Secondary NameNode

参数 备注
dfs.namenode.secondary.http-address c_nn_host_fqdn:50090  
dfs.namenode.secondary.https-port 50470  
dfs.secondary.namenode.keytab.file /etc/security/keytab/sn.service.keytab Secondary NameNode的kerberos的keytab文件
dfs.secondary.namenode.kerberos.principal sn/_HOST@REALM.TLD Secondary NameNode的kerberos的负责人名称
dfs.secondary.namenode.kerberos.internal.spnego.principal HTTP/_HOST@REALM.TLD Secondary NameNode的HTTP kerberos的负责人名称

DataNode

参数 备注
dfs.datanode.data.dir.perm 700  
dfs.datanode.address 0.0.0.0:1004 为了确保已经启动服务器的安全,安全DataNode必须使用特权端口。这意味着服务器必须通过JSVC启动。或者,如果使用了SASL验证数据传输协议,必须设置为非特权端口。请看dfs.data.transfer.protection
dfs.datanode.http.address 0.0.0.0:1006 为了确保启动的服务器的安全,安全DataNode必须使用特权端口。这意味着服务器必须通过JSVC启动。
dfs.datanode.https.address 0.0.0.0:50470  
dfs.datanode.keytab.file /etc/security/keytab/dn.service.keytab DataNode上的kerberos 的keytab文件
dfs.datanode.kerberos.principal dn/_HOST@REALM.TLD DataNode上的kerberos的负责人名称
dfs.encrypt.data.transfer false 如果使用数据加密设置为’true’
dfs.encrypt.data.transfer.algorithm   如果使用数据加密的算法可选3desrc4
dfs.encrypt.data.transfer.cipher.suites   如果使用AES加密可选AES/CTR/NoPadding
dfs.encrypt.data.transfer.cipher.key.bitlength   使用AES加密数据的key位长度,可选128, 192或 256
dfs.data.transfer.protection   authentication:只验证;integrity:除了验证外的完成性检查;privacy:除了完整性检查外的数据加密,该属性为默认;设置该值启用SASL。如果启动了,dfs.datanode.addres 必须设置为非特权端口,dfs.http.policy必须设置为HTTPS_ONLY,HADOOP_SECURE_DN_USER环境变量不能设置

WebHDFS

参数 备注
dfs.web.authentication.kerberos.principal http/_HOST@REALM.TLD WebHDFS上的kerberos负责人名称
dfs.web.authentication.kerberos.keytab /etc/security/keytab/http.service.keytab WebHDFS上的kerberos 的keytab文件

ResourceManager

参数 备注
dfs.resourcemanager.keytab /etc/security/keytab/rm.service.keytab ResourceManager上的kerberos 的keytab文件
dfs.resourcemanager.principal rm/_HOST@REALM.TLD ResourceManager上的kerberos负责人名称

NodeManager

参数 备注
yarn.nodemanager.keytab /etc/security/keytab/nm.service.keytab NodeManager上的kerberos 的keytab文件
yarn.nodemanager.principal nm/_HOST@REALM.TLD NodeManager上的kerberos负责人名称
yarn.nodemanager.container-executor.class org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor 使用LinuxContainerExecutor
yarn.nodemanager.linux-container-executor.group hadoop NodeManager的Unix组
yarn.nodemanager.linux-container-executor.path /path/to/bin/container-executor Linux Container Executor的执行路径

Configuration for WebAppProxy

WebAppProxy提供了应用程序暴露的web应用和最终用户间的代理。如果启用了安全模式,在用户进入潜在的不安全的web应用时会有提醒。使用代理的认证和授权被其他的特定web应用管理。

参数 备注
yarn.web-proxy.address WebAppProxy host:port for proxy to AM web apps. host:port;如果与yarn.resourcemanager.webapp.address一样,或者没有定义,ResourceManager会运行代理。否则需要启动单独的代理服务器。
yarn.web-proxy.keytab /etc/security/keytab/web-app.service.keytab WebAppProxy的kerberos的keytab的文件
yarn.web-proxy.principal wap/_HOST@REALM.TLD WebAppProxy的kerberos的负责人名称

LinuxContainerExecutor

ContainerExecutor被YARN框架使用来定义任何容器的启动和控制。

下面是YARN可获得Executor:

ContainerExecutor 描述
DefaultContainerExecutor Yarn用来管理容器执行的默认执行器。容器进行与NodeManager拥有同样的unix用户
LinuxContainerExecutor 仅支持Linux,该执行器运行容器作为yarn用户提交程序(完全安全模式)或者作为一个专用的用户(默认无)没有启用安全性。当全安全启动,该执行器需要所有用户账户在容器启动的集群节点上创建。它使用setuid执行,包括在Hadoop发布版本中。NodeManager使用这个可以启动和杀死容器。setuid执行切换到提交到应用的用户并启动或杀死容器。为了获得最大的安全性,该执行器设置了严格的权限、容器使用的本地文件和目录的用户/组关系,如共享对象,jars,中间文件,日志文件等。需要注意的是,除了应用所有者和NodeManager,因为这,没有其他用户可以访问任何本地文件和目录,包括哪些作为分布式缓存的部分。

为了构建LinuxContainerExecutor可执行,运行:

 $ mvn package -Dcontainer-executor.conf.dir=/etc/hadoop/

-Dcontainer-executor.conf.dir内的路径应该是setuid执行配置文件所在的集群节点的路径,该执行文件应该安装在 $HADOOP_YARN_HOME/bin

该执行文件必须有指定权限6050 或者--Sr-s---,用户为root用户,组为NodeManager的unix用户所在的没有普通应用用户的指定的组,比如hadoop。如果任何应用用户属于该指定组,安全将会被损坏。该指定组的名字应该在conf/yarn-site.xmlconf/container-executor.cfg的配置属性yarn.nodemanager.linux-container-executor.group中指定。

比如,NodeManager以用户yarn的身份运行,该用户是hadoop组的用户,并属于主组。用户yarn和其他用户alice(应用提交这)都是它的成员,alice不属于hadoop组。如上描述setuid/getuid执行应该被设置为6050或--Sr-s---,用户为yarn,组为hadoop,而且yarn为hadoop的组成员(alice不是hadoop成员)

LinuxTaskController需要路径包含和引导到yarn.nodemanager.local-dirsyarn.nodemanager.log-dirs指定的目录在目录的权限表conf/container-executor.cfg中设置755权限。

该执行文件需要名为container-executor.cfg的配置文件通过mvn在配置目录提取。

配置文件需要被运行NodeManager的用户所拥有(用户yarn),组属于任何人,而且权限位0400或r--------

执行文件需要从conf/container-executor.cfg文件提取出来的如下配置条目。如下条目应该以简单的k-v形式存在,每行一个。

参数 备注
yarn.nodemanager.linux-container-executor.group hadoop NodeManager的unix用户组。container-executorbin的拥有者应该属于该组。应该与NodeManager被配置的值形同。该配置需要确认 container-executor的bin的安全访问。
banned.users hdfs,yarn,mapred,bin 被禁止的用户
allowed.system.users foo.bar 允许的系统用户
min.user.id 1000 被禁止的其他用户(小于该值的超级用户)

这是本地文件系统权限的linuxcontainerexecutor相关的各种路径的要求:

文件系统 路径 用户:组 权限
local container-executor root:hadoop --Sr-s--*
local conf/container-executor.cfg root:hadoop r-------*
local yarn.nodemanager.local-dirs yarn:hadoop drwxr-xr-x
local yarn.nodemanager.log-dirs yarn:hadoop drwxr-xr-x

MapReduce JobHistory Server

参数 备注
mapreduce.jobhistory.addres MapReduce JobHistory Server host:port 默认端口时10020
mapreduce.jobhistory.keytab /etc/security/keytab/jhs.service.keytab MapReduce JobHistory Server的kerberos的keytab文件
mapreduce.jobhistory.principal jhs/_HOST@REALM.TLD MapReduce JobHistory Server的kerberos的负责人名称

版权声明:本文由 在 2016年07月15日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《13.hadoop-2.7.2官网文档翻译-安全模式中的Hadoop》




  相关文章:

「游客及非Github用户留言」:

「Github登录用户留言」:

TOP