1.7 Hadoop集群安全策略
众所周知,Hadoop的优势在于其能够将廉价的普通PC组织成能够高效稳定处理事务的大型集群,企业正是利用这一特点来构架Hadoop集群、获取海量数据的高效处理能力的。但是,Hadoop集群搭建起来后如何保证它安全稳定地运行呢?旧版本的Hadoop中没有完善的安全策略,导致Hadoop集群面临很多风险,例如,用户可以以任何身份访问HDFS或MapReduce集群,可以在Hadoop集群上运行自己的代码来冒充Hadoop集群的服务,任何未被授权的用户都可以访问DataNode节点的数据块等。经过Hadoop安全小组的努力,在Hadoop 1.0.0版本中已经加入最新的安全机制和授权机制(Simple和Kerberos),使Hadoop集群更加安全和稳定。下面从用户权限管理、HDFS安全策略和MapReduce安全策略三个方面简要介绍Hadoop的集群安全策略。有关安全方面的基础知识如Kerberos认证等读者可自行查阅相关资料。
(1)用户权限管理
Hadoop上的用户权限管理主要涉及用户分组管理,为更高层的HDFS访问、服务访问、Job提交和配置Job等操作提供认证和控制基础。
Hadoop上的用户和用户组名均由用户自己指定,如果用户没有指定,那么Hadoop会调用Linux的“whoami”命令获取当前Linux系统的用户名和用户组名作为当前用户的对应名,并将其保存在Job的user.name和group.name两个属性中。这样用户所提交Job的后续认证和授权以及集群服务的访问都将基于此用户和用户组的权限及认证信息进行。例如,在用户提交Job到JobTracker时,JobTracker会读取保存在Job路径下的用户信息并进行认证,在认证成功并获取令牌之后,JobTracker会根据用户和用户组的权限信息将Job提交到Job队列(具体细节参见本小节的HDFS安全策略和MapReduce安全策略)。
Hadoop集群的管理员是创建和配置Hadoop集群的用户,它可以配置集群,使用Kerberos机制进行认证和授权。同时管理员可以在集群的服务(集群的服务主要包括NameNode、DataNode、JobTracker和TaskTracker)授权列表中添加或更改某确定用户和用户组,系统管理员同时负责Job队列和队列的访问控制矩阵的创建。
(2)HDFS安全策略
用户和HDFS服务之间的交互主要有两种情况:用户机和NameNode之间的RPC交互获取待通信的DataNode位置,客户机和DataNode交互传输数据块。
RPC交互可以通过Kerberos或授权令牌来认证。在认证与NameNode的连接时,用户需要使用Kerberos证书来通过初试认证,获取授权令牌。授权令牌可以在后续用户Job与NameNode连接的认证中使用,而不必再次访问Kerberos Key Server。授权令牌实际上是用户机与NameNode之间共享的密钥。授权令牌在不安全的网络上传输时,应给予足够的保护,防止被其他用户恶意窃取,因为获取授权令牌的任何人都可以假扮成认证用户与NameNode进行不安全的交互。需要注意的是,每个用户只能通过Kerberos认证获取唯一一个新的授权令牌。用户从NameNode获取授权令牌之后,需要告诉NameNode:谁是指定的令牌更新者。指定的更新者在为用户更新令牌时应通过认证确定自己就是NameNode。更新令牌意味着延长令牌在NameNode上的有效期。为了使MapReduce Job使用一个授权令牌,用户应将JobTracker指定为令牌更新者。这样同一个Job的所有Task都会使用同一个令牌。JobTracker需要保证这一令牌在整个任务的执行过程中都是可用的,在任务结束之后,它可以选择取消令牌。
数据块的传输可以通过块访问令牌来认证,每一个块访问令牌都由NameNode生成,它们都是特定的。块访问令牌代表着数据访问容量,一个块访问令牌保证用户可以访问指定的数据块。块访问令牌由NameNode签发被用在DataNode上,其传输过程就是将NameNode上的认证信息传输到DataNode上。块访问令牌是基于对称加密模式生成的,NameNode和DataNode共享了密钥。对于每个令牌,NameNode基于共享密钥计算一个消息认证码(Message Authentication Code,MAC)。接下来,这个消息认证码就会作为令牌验证器成为令牌的主要组成部分。当一个DataNode接收到一个令牌时,它会使用自己的共享密钥重新计算一个消息认证码,如果这个认证码同令牌中的认证码匹配,那么认证成功。
(3)MapReduce安全策略
MapReduce安全策略主要涉及Job提交、Task和Shuffle三个方面。
对于Job提交,用户需要将Job配置、输入文件和输入文件的元数据等写入用户home文件夹下,这个文件夹只能由该用户读、写和执行。接下来用户将home文件夹位置和认证信息发送给JobTracker。在执行过程中,Job可能需要访问多个HDFS节点或其他服务,因此,Job的安全凭证将以形式保存在一个Map数据结构中,在物理存储介质上将保存在HDFS中JobTracker的系统目录下,并分发给每个TaskTracker。Job的授权令牌将NameNode的URL作为其关键信息。为了防止授权令牌过期,JobTracker会定期更新授权令牌。Job结束之后所有的令牌都会失效。为了获取保存在HDFS上的配置信息,JobTracker需要使用用户的授权令牌访问HDFS,读取必需的配置信息。
任务(Task)的用户信息沿用生成Task的Job的用户信息,因为通过这个方式能保证一个用户的Job不会向TaskTracker或其他用户Job的Task发送系统信号。这种方式还保证了本地文件有权限高效地保存私有信息。在用户提交Job后,TaskTracker会接收到JobTracker分发的Job安全凭证,并将其保存在本地仅对该用户可见的Job文件夹下。在与TaskTracker通信的时候,Task会用到这个凭证。
当一个Map任务完成时,它的输出被发送给管理此任务的TaskTracker。每一个Reduce将会与TaskTracker通信以获取自己的那部分输出,此时,就需要MapReduce框架保证其他用户不会获取这些Map的输出。Reduce任务会根据Job凭证计算请求的URL和当前时间戳的消息认证码。这个消息认证码会和请求一起发到TaskTracker,而TaskTracker只会在消息认证码正确并且在封装时间戳的N分钟之内提供服务。在TaskTracker返回数据时,为了防止数据被木马替换,应答消息的头部将会封装根据请求中的消息认证码计算而来的新消息认证码和Job凭证,从而保证Reduce能够验证应答消息是由正确的TaskTracker发送而来。
《Hadoop实战第2版》——1.7节Hadoop集群安全策略
最新推荐文章于 2024-08-25 23:50:29 发布