随着Hadoop在大数据分析和处理上应用的日益广泛,Hadoop开始开发健全的安全措施,并在随后选择Kerberos作为Hadoop的认证机制,并在Hadoop 0.20版本后采用新的安全措施:
(1)在Hadoop RPC(Hadoop 远程过程调用协议)中添加了权限认证机制。用Kerberos RPC (SASL/GSSAPI)来实现Kerberos及RPC连接上的用户、进程及Hadoop服务的相互认证。
为HTTP Web控制台提供“即插即用”的认证。网络应用和网络控制台的实现者可以为HTTP连接实现自己的认证机制,包括(但不限于)HTTP SPNEGO认证。当用户调用RPC时,用户的登录名会通过RPC头部传递给RPC,之后RPC使用简单验证安全层(Simple Authentication and Security Layer,SASL)确定一个权限协议(支持Kerberos和DIGEST-MD5两种),完成RPC授权。
(2)强制执行HDFS的文件许可。可以通过NameNode根据文件许可(用户及组的访问控制列表(ACLs))强制执行对HDFS中文件的访问控制,用于后续认证检查的委托令牌。为了降低性能开销和Kerberos KDC上的负载,可以在各种客户端和服务经过初始的用户认证后使用委托令牌。委托令牌用于跟NameNode之间的通讯,在无需Kerberos服务器参与的情况下完成后续的认证后访问。委托令牌的安全机制也一直延续到后续版本。
(3)用于数据访问控制的块访问令牌。当需要访问数据块时,NameNode会根据HDFS的文件许可做出访问控制决策,并发出一个块访问令牌,可以把这个令牌交给DataNode用于块访问请求。因为DataNode没有文件或访问许可的概念,所以必须在HDFS许可和数据块的访问之间建立对接。
(4)用作业令牌强制任务授权。作业令牌确保任务只能做交给他们去做的作业。也可以把任务配置成当用户提交作业时才运行,简化访问控制检查。
进入Hadoop2.x版本后,Hadoop安全机制显著提高。
2.2 Hadoop 2(YARN)的安全机制
2.2.1 Hadoop 2(YARN)的认证机制
在Hadoop中,客户端与NameNode和客户端与ResourceManager之间初次通信均采用了Kerberos进行身份认证,之后便换用委托令牌认证以较小开销,而DataNode与NameNode和NodeManager与ResourceManager之间的认证始终采用Kerberos机制。
接下来分别分析Hadoop中Kerberos和委托令牌的工作原理。
(1)Kerberos认证协议。在一个分布式的Client/Server 体系结构中,Kerberos采用一个或多个Kerberos 服务器提供鉴别服务。首先将需要认证的机器手动将添加Kerberos数据库,并在密钥分发中心和各个节点分别产生密钥表。随后客户端可以和服务器认证,也可以各个节点之间相互认证。当客户端想请求应用服务器上的资源时,首先由客户端向密钥分发中心请求一张身份证明,然后将身份证明交给应用服务器进行验证,在通过服务器的验证后,服务器就会为客户端分配所请求的资源,如图1所示。当节点在Namenode注册时,它必须提供自己的认证密钥并与服务器进行认证,防止存在外部节点冒充内部节点的情况。
Kerberos也有几大缺点:采用对称加密机制,加密和解密使用相同的密钥,安全性有所降低;Kerberos中身份认证服务和授权服务采用集中式管理,系统的性能和安全性也过分依赖于搭载这两个服务的服务器的性能和安全。
(2)委托令牌认证协议。
利用Kerberos获得最初认证后,客户端获得一个委托令牌,令牌赋予节点之间的某些权限。获得令牌后,客户端视情况将它传递给下一个在Namenod上的作业。任何获得令牌的用户可以模仿NameNode上的用户。Hadoop中的令牌主要由下表列出的几个字段组成[5]:
TokenID = {ownerID, renewerID, issueDate, maxDate, sequenceNumber}
TokenAuthenticator = HMAC-SHA1(masterKey, TokenID)
Delegation Token = {TokenID, TokenAuthenticator}
其中关键参数如下:
最大时间(maxData)。每个令牌与一个失效时间关联,若当前时间超过失效时间,则令牌会从内存中清楚,不能再使用。
序列号(sequenceNumber)。每个令牌的产生,都会使序列号增加。
主密钥(masterKey)。主密钥由NameNode随机选择并只有NameNode知道,随后用该密钥来生成委托令牌。
默认情况下,委托令牌有效期是1天。作业追踪器是重建者,跟踪作业的运行情况以更新或取消令牌。由于密钥与令牌之间有一一对应关系,一个密钥产生一个令牌,因此过去7天内的密钥将会被保存,以便回收已经产生的令牌。