早期版本的Hadoop假定HDFS和MapReduce集群运行在安全环境中,由一组相互合作的用户所操作,因而访问控制措施的目标是防止偶然的数据丢失,而非阻止非授权的数据访问。例如,HDFS中的文件许可模块会阻止用户由于程序漏洞而毁坏整个文件系统,也会阻止运行不小心输人的hadoop fs -rmr /指令,但却无法阻止某个恶意用户假冒root身份来访问或删除集群中的某些数据。
从安全角度分析,Hadoop缺乏一个安全的认证机制,以确保正在操作集群的用户恰是所声称的安全用户。Hadoop的文件许可模块只提供一种简单的认i证机制来决定各个用户对特定文件的访问权限。例如,某个文件的读杖限仅开放给某一组用户,从而阻止其他用户组的成员读取该文件。然而,这种认证机制仍然远远不够,恶意用户只要能够通过网络访问集群,就有可能伪造合法身份来攻击系统。
包含个人身份信息的据(例如终端用户的全名或IP地址腓常敏感。一般情况下,需要严格限制组织内部的能够访问这类信息的员工数。相比之下,敏感性不强(或匿名化)的数据则可以开放给更多用户。如果把同一集群上的数据划分不同的安全级别,在管理上会方便很多,且低安全级别的数据也能够被广泛共享。然而,为了迎合数据保护的常规需求,共享集群的安全认证是不可或缺的。
雅虎公司在2009年就遇到了该难题,因此组织了一个工程师团队来实现Hadoop的安全认证。这个团队提出了一个方案:用Kerberos(一个成熟的开源网络认证胁议)实现用户认证,Hadoop不直接管理用户隐私,而Kerberos也不关心用户的授权细节。换句话说,Kerberos的职责在于鉴
Hadoop中的安全技术涉及内容较多,因此这里只介绍一些突出的内容。若想了解更多背景,可以参阅BenSpivey和JasonGarman的《Hadoop安全》(HadoopSecurity)(O,Reilly,2014)。
1、Kerberos和Hadoop
从宏观角度来看,使用Kerberos时,一个客户端要经过三个步骤才可以获得服务。在各个步骤,客户端需要和一个服务器交换报文。
- 认证。客户端向认证服务器发送一条报文,并获取一个含时间戳的票据授予票据(Ticket-GrantingTicket,TGT)。
- 授权。客户端使用TGT向票据授予服务器(Ticket-GrantingServer,TGS)请求一个服务票据。
- 服务请求。客户端向服务器出示服务票据,以证实自己的合法性。该服务器提供客户端所需服务,在Hadoop应用中,服务器可以是namenode或资源管理器。
同时,认证服务器和票据授予服务器构成了密钥分配中心(KDC)。整个过程如图10-2所示。
授权和服务请求步骤并非用户级别的行为:客户端系统会代替用户来执行这些步骤。但是认证步骤通常需要由用户调用kinit命令来执行,该过程会提示用户输人密码。需要指出的是,这并不意味着每次运行一个作业或访问HDFS的时候都会强迫用户键人密码,因为用户所申请到的TGT具备一定的有效期。TGT有效期的默认值是10个小时(可以更新至一周)0更通用的做法是采用自动认证:即在登录操作系统的时候自动执行认证操作,从而只需单次录(singlesign-on)到Hadoop。
如果用户不期望被提示输人密码(例如,运行一个无人值守的MapReduce作业),则可以使用ktutil命令创建一个Kerberos的keytab文件,该文件保存了用户密码并且可以通过-t选项应用于kinit命令。
示例
下面我们来看一个例子。首先,将core-site.xml文件中的hadoop.security.authentication属性项设置为kerberos,启用Kerberos认证。该属性项的默认是simple,表示将采用传统的向后兼容(但是不安全)方式,即利用操作系统用户名称来决定登录者的身份。
其次,还需要将同一文件中的hadoop.security.authorization属性项设置为true,以启用服务级别的授权。可以配置hadoop-policy.xml文件中的访问控制列表(ACL)以决定哪些用户和组能够访问哪些Hadoop服务。这些服务在协议级别定义,包括针对MapReduce作业提交的服务、针对namenode通信的服务等。默认情况下,各个服务的ACL都被设置为*,表示所有用户能够访问所有服务。但在现实情况下,还是有必要充分考虑ACL策略,控制访问服务的用户和组的范围。
ACL的格式很简单,前一段是以逗号隔开的用户名称列表,后一段是以逗号隔开的组名称列表,两段间以空格隔开。例如,ACL片段preston,howard,directors,inventors会将某服务的访问权限授予用户preston或用户howard,或组directors、组inventors。当Kerberos认证启用后,以下输出内容显示了从本地复制一个文件到HDFS中时系统反馈的结果。
由于用户没有Kerberos票据,所以上述操作失败。用户可以使用kinit指令向KDC认证,并获得一张票据。
现在,可以看到文件已成功写人HDFSO注意,由于Kerberos票据的有效期是10小时,所以尽管执行的是两条文件系统指令,但实际上只需调用一次kinit命令。另外,klist命令能查看票据的过期时间,kdestroy指令可销毁票据。在获取票据之后,各项工作与平常无异。
2、委托令牌
在诸如HDFS或MapReduce的分布式系统中,客户端和服务器之间频繁交互,且每次交互均需认证。例如,一个HDFS读操作不仅会与namenode多次交互、还会与一个或多个datanode交互。如果在一个高负载集群上采用三步骤Kerberos票据交换协议来认证每次交互,则会对KDC造成很大压力。因此,Hadoop使用委托令牌来支持后续认证访问,避免了多次访问KDC。委托令牌的创建和使用过程均由Hadoop代表用户透明地进行,因而用户执行kinit命令登录之后,无需再做额外的操作。当然,了解委托令牌的基本用法仍然是有必要的。
委托令牌由服务器创建(在这里是指namenode),可以视为客户端和服务器之间共享的一个密文。当客户端首次通过RPC访问namenode时,客户端并没有委托令牌,因而需要利用Kerberos进行认证。之后,客户端从namenode取得一个委托令牌。在后续RPC调用中,客户端只需出示委托令牌,namenode就能验证委托令牌的真伪咽为该令牌是由namenode使用密钥创建的),并因此向服务器认证客户端的身份。
客户端需要使用一种特殊类型的委托令牌来执行(I)FS块操作,称为“块访问令牌"(block access token)。当客户端向namenode发出元数据请求时,namenode创建相应的块访问令牌并发送回客户端。客户端使用块访问令牌向datanode认证自己的访问权限。由于namenode会和datanode分享它创建块访问令牌时用的密钥(通过心跳消息传送),datanode也能够验证这些块访问令牌。这样的话,仅当客户端已经从namenode获取了针对某一个HDFS块的块访问令牌时,才可以访问该块。相比之下,在不安全的Hadoop系统中,客户端只需知道块ID就能够访问一个块了。可以通过将dfs.block.access.token.enable的值设置为true来启用块访问令牌特性。
在MapReduce中,applicationmaster共享HDFS中的作业资源和元数据(例如JAR文件、输人分片和配置文件)。用户代码运行在节点管理器上,并可以访问HDFS上的文件(该过程在7」节中介绍过)。在作业运行过程中,这些组件使用委托令牌访问HDFSO作业结束时,委托令牌失效。
默认的HDFS实例会自动获得委托令牌。但是若一个作业试图访问其他HDFS集群,则用户必须将mapreduce.job.hdfs-servers作业属性设置为一个由逗号隔开的HDFSURI列表,才能够获取相应的委托令牌。
3、其他安全性改进
Hadoop已经全面强化了安全措施,以阻止用户在未授权的情况下访问资源。一些显著的变化如下。
- 任务可以由提交作业的用户以操作系统帐号启动运行,而不一定要由运行节点管理器的用户启动。这意味着,在这种情况下,可以借助操作系统来隔离正在运行的任务,使它们之间无法相互传送指令(例如,终止其他用户的任务),这样的话,诸如任务数据等本地信息的隐私即可通过本地文件系统的安全性而得到保护。要启用这项特性,需要将yarn.nodemanager.containerexecutor.class设为org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutoro。此外,管理员还需确保各用户在集群的每个节点上都已经分配帐号(一般用LDAP)。
- 当任务由提交作业的用户启动运行时,分布式缓存(参见9.4.2节)是安全的:把所有用户均可读的文件放到共享缓存中(默认的非安全方式),把其他文件放在私有缓存中,仅限拥有者读取。
- 用户只能查看和修改自己的作业,无法操控他人的作业。为了启动该特性,需要将mapreduce.cluster.acls.enabled属性项设为true。另外,mapreduce.job.acl-view-job和mapreduce.job.acl-modify-job属性分别对应一个逗号分隔的用户列表,描述能够查看或修改指定作业的所有用户。
- shuffle是安全的,可以阻止恶意用户请求获取其他用户的map输出。
- 正确配置之后,可以阻止恶意的辅助namenode、datanode或节点管理器加人集群,从而破坏集群中的数据。这可以通过要求master节点对试图与之连接的守护进程进行认证来实现。
- 为了启用该特性,需要使用先前由ktutil命令创建的keytab文件来配置Hadoop。以datanode为例,首先,把dfs.datanode.keytab.file属性设置为keytab文件名称;其次,把dfs.datanode.kerberos.principal属性设置为要用的datanode用户名称;最后,把hadoop-policy.xml文件中security.datanode.protocol.acl属性设置为datanode的用户名称,以设置DataNodeProtocol的ACL。DatanodeProtocoI是datanode用于和namenode通信的协议类。
- datanode最好运行在特权端口(端口号小于1024),使客户端确信它是安全启动的。
- 任务只与其父application master通信,从而阻止攻击者经由其他用户的作业获取MapReduce数据。
- Hadoop的多个不同部件都提供了配置属性以支持网络数据加密,包括RPC(hadoop.rpc.protection),HDFS块传输(dfs.encrypt.data.transfer)、MapReduce shume(mapreduce.shuffle.ssl.enabled)和UI(hadokop.ssl.enabled)。并且,在数据休息期间对数据的加密也是持续进行的,例如,通过这种方式,HDFS块能够以加密方式进行存储。
6704

被折叠的 条评论
为什么被折叠?



