Hadoop 的初始设计是运行在信任的环境下,它假设所有的集群用户都是可信任的,他们能够正确地表明自己的身份并且不会尝试获取更多的权限。由此实现了简单的安全模式,它是 Hadoop 中默认的验证系统。在简单安全模式下,Hadoop 信任操作系统所提供的用户身份。和大部分关系数据库不同,Hadoop 并没有任何集中用户和权限存储机制。在 Hadoop 中,不存在通过用户名和密码来对用户进行验证的概念。Hadoop 接受并信任操作系统所提供的用户名并且对此不会采取过多的检查。
随着 Hadoop 的发展,越来越多的公司开始使用 Hadoop 作为大数据平台的框架进行实际应用,潜在的安全隐患逐渐暴露出来。尤其是 Hadoop 集群被越来越多地应用于生产环境的数据分析工作中,使用者的数量越来越多,身份也越来越复杂,因此越来越多地需要考虑权限控制和数据保护等安全问题。目前,Hadoop 技术体系面临的安全问题主要有以下三个方面。
(1)缺乏安全认证机制
除基本的 Linux 用户名和密码措施外,Hadoop 缺乏对用户的认证的管理方式。恶意的用户可以轻易地伪装成其他用户来窜改权限。例如,任何有用户名和密码的用户都可以提交作业,修改 JobTracker 状态,修改 HDFS 上的数据,甚至伪装成 DataNode 或者 TaskTracker 接收 NameNode 的数据和 JobTracker 的任务等。
服务器与用户之间也缺乏认证机制,因此任何用户都可以伪装成其他用户并对HDFS或MapReduce集群进行非法访问,甚至进行一些非法活动。例如,对其他用户的作业进行修改,窜改其他用户在HDFS上的数据,或者恶意提交作业,占用集群资源等。
(2)缺乏适合的访问控制机制
具有 Hadoop 使用权限的用户可以不受限制地浏览 DataNode 上存储的数据,甚至可以轻易地修改和删除这些数据。同时,用户还可以随意修改或者终止其他用户的作业。当 Hadoop 集群被应用到数据和作业运行状态敏感的环境中时,这种状况可能随时会导致出现重大的安全事故
在 Hadoop 1.0 版本中对 HDFS 上资源的访问控制模型采用的是与Linux/UNIX相似的9位权限判定,权限类型有读(r)、写(w)、执行(x)三种。HDFS上的用户与Linux/UNIX系统用户一致,分为 user、group、other。用户在向 Hadoop 集群提交文件时,可以通过集群命令tmdoop fs-cbanod 来设定该文件的访问权限。
Hadoop 最初的授权管理存在的缺陷可以通过一个案例来描述。例如,在系统中某个用户时属于 other,对于某个文件没有写入的权限,当这个用户请求得到该文件的写权限时,系统就必须开放 other 权限。但是一旦放开了 other 权限,所有的用户就拥有了该文件的写入权限,这在授权管理中显然是不合理、不安全的。
(3)数据传输缺乏加密机制
Hadoop 集群各节点之间,客户端与服务器之间的数据传输采用TCP/IP 协议,以 Socket 方式实现。数据在传输过程中缺乏加密处理,使得用户隐私数据、系统敏感信息极易在传输的过程中被窃取、窜改,从而使数据失去了完整性、保密性。HDFS上数据的存储没有任何加解密处理,各服务器对其内存和外部存储器中的数据没有存储保护措施,极易造成用户数据和系统信息的泄露。
为了解上述安全问题,Hadoop 引入了对 Kerberos 协议的支持。Kerberos 是一个安全的网络认证协议,它实现了机器级别的安全认证,支持客户端和服务器之间不需要在网络上传输密码认证,而是由一个可信赖的第三方密钥分发中心提供身份认证。KDC 主要由认证服务器和票据授权服务器组成。Kerberos 持有一个密钥数据库,用来记载每个 Kerberos 用户的密钥。这个密钥只有 Kerberos 用户和 KDC 知道,该密钥可以对网络实体与 KDC 的通信进行加密。KDC 会为它们产生一个临时会话密钥,用来加密它们之间的交互信息。认证服务器负责对用户进行身份认证。用户通过认证之后,会产生会话密钥和票据授权票据,然后将其发送给认证用户。会话密钥用来加密用户之间的通信消息,而且是认证用户访问的凭证。票据授权服务器为通过认证的合法用户产生会话密钥和票据,然后将密钥和票据发送给用户。认证用户与服务器之间的通信可由会话密钥加密,认证用户通过票据作为凭证来访问应用服务器。
Kerberos 具有密码不在网络中传输,只在网络中传输时间敏感的票据。密码或密钥只有KDC和标识可以识别。
Kerberos 支持将密码或密钥存储于 LDAP 兼容的统一的凭据存储系统中,服务器不需要存储任何票据和客户端相关的详细信息来认证客户端,客户端通过 KDC 认证并获得 TGT 可以用于之后的认证,保证大数据平台 Hadoop 的安全。