作者简介: 王志华(1977—), 男(汉), 河南, 副教授。E-mail:zhwang@zzu.edu.cn
分析了Hadoop云计算平台的安全需求,设计了一种基于身份的Capability (ID-CAP), 并提出了一种基于ID-CAP的Hadoop访问控制方案。方案设计采用了最小授权原则,实现了基于Capability的访问控制,使用户在Hadoop平台上提交的作业能以最小权限运行。实验结果表明: 基于Capability的访问控制机制能有效实现在Hadoop平台上实施最小授权原则,支持平台内部相互依赖的各模块之间的身份认证,有效提高Hadoop平台的系统安全性和稳定性。
An identity-based capability (ID-CAP) method is given to provide secure access control to Hadoop cloud computing platforms. The capability-based access control design follows the least privilege principle with the platform running tenant jobs using a least privilege set. Tests show that the capability-based access control can be efficiently implemented to support mutual authentication between different servers in a Hadoop platform while satisfying the least privilege requirement to improve platform security and stability.
在超大规模数据处理的云计算领域, Hadoop已经成为工业界和学术界进行云计算应用和研究的标准平台。Hadoop实现了包括分布式文件系统HDFS (Hadoop distributed file system)和MapReduce框架在内的云计算软件平台的基础架构,并且在其上整合了包括数据库、云计算管理、数据仓库等一系列应用平台。使用Hadoop, 用户可以在大规模集群平台上开发MapReduce程序来处理海量数据。由于它的低成本和易用性, Hadoop已经成为越来越多的公司用作大规模数据处理的重要基础软件。
在云计算环境中,数据安全是所有用户都担心的一个重要问题。基于HDFS和MapReduce框架的云计算平台并不能提供很好的安全性。这是由Hadoop框架自身的安全机制所决定的。HDFS和MapReduce的设计之初并没有特别关注安全,作为一个底层分布式操作系统,它无法支持作业执行时的最小授权,那么所有基于HDFS和MapReduce框架之上的应用平台也无法提供很好的多租户安全支持。为了说明问题的重要性,这里做个类比。在经典Linux系统中, ping程序的运行需要被授予root权限,但实际上ping程序只需要用到一个创建raw_socket的特权。给ping授予root权限才能实在是太过了,但经典Linux kernel并不支持最小授权,所以这些进程经常成为攻击的目标。那么回到Hadoop分布式系统,上层数仓应用Hive必须以superuser身份运行于HDFS和MapReduce之上,但实际上用户提交的SQL或自定义函数往往只需要访问有限的底层资源。所以,攻击者极容易利用上层应用服务来攻击底层Hadoop系统平台,从而导致数据安全无法保证。
最小授权原则(the least-privilege principle)是设计容错系统的一个重要原则,也是设计分布式操作系统安全的一个重要原则。支持最小权限不仅能显著增强系统的安全性和稳定性,而且可以为上层应用提供更好的安全服务。缺少对最小权限的支持,就无法直接使用Hadoop平台来构建安全的云计算服务。
Capability[1,2]是实现最小权限的基本方法之一,但它不能直接应用于跨域的安全环境,因而不能直接应用于Hadoop分布式平台。
本文分析Hadoop云计算平台的安全需求,提出一种基于身份的Capability (ID-CAP), 然后提出一种基于ID-CAP的Hadoop访问控制方案。
在基于Hadoop平台框架建立的支持多租户的云计算服务中,由于每个用户都可以提交自己的MapReduce作业(job)来运行,那么最基本的安全需求是实现用户认证和访问控制,并且要提供作业运行时的相互隔离,以防止作业之间相互干扰,更要防止恶意作业对底层平台带来安全风险。
为了实现这一安全目标,本文提出的方案基于如下假设:
1) 集群初始化时是可信的。在集群初始化的第一天,认为这个环境是干净的,不存在任何攻击者。
2) 用户可能提交恶意的MapReduce job。比如,恶意的job可以向内部服务(例如, NameNode)发送任意的RPC请求。
3) 攻击者无法获取底层Linux Kernel的root权限。这意味着,攻击者不能监听网络,不能篡改网络数据包,不能访问本地文件系统中的敏感目录,无法篡改物理内存,无法修改安全策略等。
假设3看起来有点不切实际,因为Linux作为一个商用操作系统,也经常暴露Kernel的一些漏洞及攻击方法。但是,可以认为云服务提供商可以组合多种Linux沙箱技术,通过实现纵深防御策略来满足假设3。
基于Capability的访问控制方案在文[1-2]已有描述。一个Capability可以看作用户访问权限的集合。一个经典的Capability可以表示为如下的一个二元组:
其中:
1) PermList={(Object, Permissions)}。对于一个经典文件系统的PermList来说, Object通常为树状结构,如目录或文件路径。Permissions为Read, Write, eXecutable。举例来说, PermList的值可以为: {(“/home/admin/”, RW), (“/home/data/1.txt”, R), (“/usr/sbin/ping”, X)}。如何定义一个Object的格式是与具体服务相关的,比如在Hadoop平台中,可以使用(“hdfs: /home/admin/”, RW)来表示允许读写访问HDFS文件系统中的 “/home/admin/”目录及该目录下的所有子目录及文件,还可以使用(“mr: /alice/job1”, R)来表示允许读取MapReduce用户alice的作业job1的运行状态。
2) Random是一个用于抗伪造攻击的随机数,其典型实现是数字签名(digital signature)或消息认证码(message authentication code)。
关于Capability的历史研究较多[3,4,5,6,7,8]。Capability访问控制的显著特征是执行权限检查时性能高。当Capability随请求一起传递给Server时, Capability可以在本地进行验证,而无需与第三方交互(比如,不需要访问任何权限数据库)。而基于ACL访问控制列表的方法则需要访问权限中心数据库,或者需要昂贵的分布式缓存服务。Capability的另一个特征是能更有效地支持最小授权原则,它是取得系统安全性和稳定性的基础。当部分安全功能遭受攻击时,该原则能将安全风险控制到最小。Capability的这些特点使其更适合于分布式计算环境。
然而,经典Capability系统有一个主要的不足——拥有访问能力即拥有授权能力。这就是说,一个Capability可以被复制并传递给其他安全域的用户使用。Boebert在文[7]中指出,经典的Capability系统不能实施BLP模型中的 *-property[8], 或者说无法解决confinement问题[9]。由于经典Capability所存在的安全问题,它不能被直接用于跨域的分布式计算环境。
在Hadoop分布式环境中, Hadoop MapReduce安全框架以及HDFS服务运行在高安全层级,而用户提交的MapReduce job则运行于低安全层级。这意味着Hadoop环境涉及到至少2个安全域。因此,经典的Capability方案直接用于Hadoop环境是不安全的。为了解决这个问题,经典Capability的语义需要被扩充,比如增加主体身份信息,这就是下文提出的基于身份的Capability方案。
ID-CAP (identity-based capability)是经典Capability的一种扩展。与经典Capability相比, ID-CAP包含了更多的安全属性,如持有人身份,持有人的公钥。形式地, ID-CAP是如下属性的一个数字签名:
其中,每项含义如下:
1) ID: ID-CAP的ID。
2) OwnerID: Capability持有者的用户ID。
3) OwnerPK: Capability持有者的认证公钥。
4) Type: Capability的类型定义,比如bearer|renewable。
5) ExpTime: Capability的过期时间。
ID-CAP可看作一种特殊的支持访问控制属性的身份证书。基于ID-CAP, 验证者可以获得持有人的公钥及其访问权限。此外, ID-CAP持有者可以是用户,也可以是作业进程。在本文的方案设计中, Capability持有人是指作业进程。
2.3.1 产生ID-CAP
ID-CAP只能由云计算平台的内部CA中心签发。此时,内部CA中心提供的仅仅是一个数字签名服务。内部CA中心可以提供一个数字签名服务的API接口和访问控制功能,供其他服务器调用。
2.3.2 验证ID-CAP
ID-CAP一般为消息请求中的参数之一。一个Client请求访问Server时,必须使用支持ID-CAP的服务接口。当Server收到消息请求时,首先要检查ID-CAP的有效性,步骤如下:
1) 验证数字签名的有效性;
2) 验证有效期;
3) 验证Type.Bearer属性是否有被设置,若有设置则进入下一步; 否则,需要验证ID-CAP持有人的身份: 根据ID-CAP中的公钥OwnerPK来进一步验证消息请求的数字签名的有效性;
4) 根据ID-CAP中的PermList来判断是否包含本次请求所需要的访问权限,若满足,则权限检查通过; 否则,权限检查失败。
2.3.3 撤销ID-CAP
ID-CAP可以通过CRL撤销列表机制被撤销,也可以支持自动撤销。CRL撤销列表可以参考PKI体系的证书撤销方法。对于自动撤销来说,当ExpTime到来时, ID-CAP将自动失效。如果一个作业的运行时间超过ExpTime, ID-CAP的Type.Renewable属性需要被设置。当Type.Renewable被设置时,在ExpTime到来之前,可以换取一个拥有更长的过期时间的ID-CAP。
下面基于ID-CAP, 提出一种满足最小授权原则的Hadoop访问控制方案,它能为用户提交的每个job分配最小权限,从而提供更强的容错能力和系统安全性。
Hadoop作为云计算服务的一个底层平台框架,本文的设计基于以下考虑:
1) 最小授权原则。这一原则是提高分布式系统安全性和稳定性的核心。从容错和抵制恶意攻击的角度来看,实施最小权限可以有效的加强数据保护。在Hadoop系统中,本文的目标是让每一个作业都以最小权限运行。
2) 作业级隔离。在原生Hadoop系统中,一个用户提交的所有作业都具有相同的访问权限,而且只能做到用户级别的隔离,而无法满足作业级的隔离。那么,一个作业如果遭受攻击或遇到错误,很容易殃及该用户的所有作业。
3) 高性能。在云计算系统中,性能往往是所追求的一个核心指标。解依赖是提高性能的一个常用方法,尤其是高频操作一定不能依赖于某个单点。比如,权限检查操作就是一个高频操作,就要做到不依赖于单点服务(比如,不应该与权限数据库服务进行交互)。
在本文的方案中,除了MapReduce和HDFS服务之外,需要有一个内部CA服务和一个Broker服务。CA服务主要提供各服务模块及用户作业的密钥颁发和ID-CAP颁发服务。Broker服务主要提供用户的接入。
3.2.1 平台启动
在部署启动Hadoop集群之前,需要确保CA服务正常工作。首先为Hadoop各个Server (eg, MapReduce, HDFS, ZooKeeper) 申请Server PK/SK以及各自的ID-CAP。若是第一次部署或部署选项中显式要求更新密钥对和ID-CAP, 那么CA会撤销Server上一次使用的有效ID-CAP, 并为各个Server创建一个随机的Server PK/SK密钥对; 若是重启集群并无需更新密钥对和ID-CAP, 那么CA会继续保留Server正在使用的密钥对和ID-CAP。部署成功后, MapReduce的JobTracker和TaskTrackers都会获得相同的ID-CAPT和(PKT,SKT), HDFS的NameNode和DataNodes则会获得相同的ID-CAPN和(PKN,SKN)。
然后,申请Broker Server的PK/SK和ID-CAP, 申请方式与其他模块类似。部署成功后, Broker Server将会获得自己的ID-CAPB和(PKB,SKB)。
3.2.2 作业提交
Hadoop平台服务启动之后,用户就可以提交MapReduce作业了。图1描述了作业提交的流程。
在图1中, Client位于Hadoop平台的外面,其他组件属于平台的内部模块。Broker是整个Hadoop平台的入口,它执行用户身份认证与权限检查逻辑。CA是整个Hadoop平台的密钥管理中心,负责密钥及ID-CAP的颁发。JobTracker和TaskTracker为Hadoop MapReduce框架内组件,负责执行用户提交的MapReduce作业。
下面详细描述执行流程:
Step 1 Client通过外部认证之后, Client向Broker提交作业请求,请求内容包括:
由于Hadoop不做用户管理与认证, Client需要进行外部认证,比如Kerberos SSO认证服务登录,此时Client获得的身份证明就是一个访问Broker的Kerberos ST。当Broker收到请求后,首先验证Client的认证凭据,确认Client的用户身份,获得uid。分析作业配置文件JobConfiguration, 获取此作业需要访问的HDFS文件资源及其访问权限currentPermList。查询用户权限数据,确保currentPermList是该用户的permList的一个子集,否则返回权限检查失败的出错信息。
Step 2 Broker向CA申请颁发该job的ID-CAP J。该请求内容为:
其中ID-CAPB是Broker在初始化时获取的Capability, 可以用于访问CA和JobTracker的部分API。SKB是Broker的私钥,用于数字签名。
Step 3 当CA收到颁发ID-CAPJ的请求时,首先验证请求者的身份是否为Broker, 这是通过验证请求的数字签名来完成的。然后验证ID-CAPB来检查请求者的访问权限。验证通过后,为该Job产生一个公私钥对(PKJ,SKJ), 根据PKJ、 uid、 currentPermList、 Type、 ExpTime等请求参数,产生如下的ID-CAPJ:
最后, CA将SKJ和ID-CAPJ返回给Broker。
Step 4 收到CA返回的SKJ和ID-CAPJ之后, Borker将作业SKJ和ID-CAPJ添加到JobConfiguration, 向JobTracker提交SubmitJob请求时需要传递如下参数:
JobTracker收到请求后,首先验证Request的数字签名,然后验证ID-CAPB的有效性及其访问权限。验证通过后,从Request中提取JobConfiguration, 然后解析该job运行时所需要的SKJ和ID-CAPJ, 并传递给TaskTracker。
3.2.3 作业进程访问HDFS
TaskTracker启动job工作进程,会为工作进程配置好SKJ和ID-CAPJ。当job工作进程需要访问HDFS时,访问控制的执行流程如图2所示。
作业进程以一个HDFS Client角色与HDFS通信。假设Client执行文件读操作,比如读文件hdfs: /data/file1.txt, 下面来看具体的执行流程。
Step 1 Client向NameNode提交OpenFileForRead请求时,需要传递如下参数:
Step 2 NameNode验证Request的数字签名是否有效,然后验证ID-CAPJ是否有对/data/file1.txt的读权限; 若没有读权限,则拒绝。验证通过后, NameNode向Client发送文件位置信息,如DataNode位置, BlockInfo, 并且还包含一个访问DataNode的token。此token为bearer类型, DataNode无需验证持有人的身份,任何Client持有该token都可以访问DataNode。产生token方法如下:
Step 3 Client向DataNode发送读数据请求,请求参数需要包含步骤2中接收到的token。
Step 4 DataNode验证token的有效性,验证通过后,返回相应的数据块。
3.2.4 Master-Slaves认证
在Hadoop内部, MapReduce和HDFS都可以看做是一种Master-Slaves结构,比如JobTracker-TaskTrackers、 NameNode-DataNodes。在系统启动时, JobTracker与TaskTrackers都获得了私钥SKT, NameNode与DataNodes也都获得了私钥SKN。基于共享的私钥, Master与Slaves按如下方法进行认证: 将共享的私钥作为MasterKey, 使用HMAC_SHA1来计算消息签名,从而实现Master与Slaves之间通信的可认证性。
基于Hadoop的云计算平台主要提供数据分析与处理服务。Hadoop用户直接提交的或上层应用程序提交的MapReduce作业通常在一层或多层沙箱里运行。在第2节的威胁模型中,假设沙箱机制是安全的,那么恶意的MapReduce程序就无法控制底层操作系统,无法监听或篡改集群中传输的网络数据包。
4.1.1 认证性
1) Hadoop集群内部各模块之间的消息通信是可认证的。在job提交阶段(见3.2.2节描述), 每一个消息通信都有请求者的数字签名。运行在沙箱中的恶意程序无法获取其他作业进程的签名密钥,所以无法伪造消息请求者的身份。在job运行阶段(见3.2.3节描述), 当Client使用token来访问DataNode时, DataNode能验证token的真实性。由于token是NameNode使用HMAC计算的,所使用的是DataNode与NameNode之间所共享的密钥SKN, 运行在沙箱中的恶意作业进程无法窃取到SKN, 所以无法伪造token。
2) Hadoop集群内部各模块内部的消息通信是可认证的。如3.2.4节所描述, Master与Slaves之间的通信都是基于共享的密钥来计算HMAC来完成消息认证的,所以无法伪造消息请求者的身份。
4.1.2 作业级的最小权限控制
每个用户都有一个最大的权限集合,它由Broker服务所管理。在原生Hadoop中,用户提交的每个job都使用该用户的最大权限来执行。在本文的方案中, Broker会根据每个job的输入和输出配置来产生一个带有效期限的ID-CAP, 其访问权限是用户权限集合的一个子集,这个权限子集只满足运行该job所需要的权限,而不会多出与该运行job无关的权限。
追求高性能是本方案设计的一个基本原则。为了验证这一方案的有效性,本文基于Hadoop-1.0.2开发了一个概念证明系统。影响该方案性能的一个最大因素是密码函数操作。在所有的密码函数操作中,开销最大的是签发Capability操作,因为它涉及到计算数字签名操作。但是由于Hadoop平台主要用于离线数据处理业务,作业的提交并不是一个频繁的操作,所以签发Capability不会成为瓶颈,所以它并不是性能优化的目标。密码操作的优化目标应该是Capability验证操作,因为这是一个相当频繁的操作。鉴于此,选择数字签名算法时,尽管计算ECC签名要比RSA签名高效很多,但验证RSA签名的性能却要显著优于ECC签名。因此本文选择了RSA数字签名方案。实验中,采用了1 024-bit RSA签名算法(参考PKCS#1 v2.1), 该方案中选择RSA公钥指数 e=3, 签名验证操作仅需2次模乘运算。实验证明密码操作所引入的计算开销是可忽略的。
4.2.1 集群配置
实验环境使用1台物理主机和9台KVM虚拟主机。NameNode, JobTracker共享物理主机, DataNodes和TaskTrackers使用虚拟机。物理主机配置: CPU 2.53 GHz, 24 Cores, 96 G内存, 2×512 G 磁盘空间; 基于Linux的KVM(Kernel-based Virtual Machine)虚拟机配置: CPU 2.53 GHz, 6 Cores, 10 G内存, 100 G磁盘空间。此外,每个节点上使用的Linux版本为RHEL6.2, 2.6.32-220.el6.x86_64, Hadoop版本为Hadoop-1.0.2。
4.2.2 Hadoop基准测试
考虑到Hadoop平台主要提供大规模离线数据处理业务,用户一般主要关注的几个基准测试包括: HDFS读写测试、排序测试和MapReduce连续性测试。下面就这3个基准测试做了性能对比。
1) HDFS读写测试
执行读测试和写测试的工具如下:
$ hadoop jar hadoop-test-1.0.2.jar TestDFSIO -read -nrFiles 10 -fileSize 1 000.
$ hadoop jar hadoop-test-1.0.2.jar TestDFSIO -write -nrFiles 10 -fileSize 1 000.
基于原生Hadoop和基于本文提出的ID-CAP方案的吞吐量和平均IO率的测试结果如表2所示。容易看出, ID-CAP方案并没有导致吞吐量和平均IO率的显著降低。
2) 排序测试
每个节点运行10个map任务,产生10 GB的随机二进制数据。测试工具如下:
$ hadoop jar hadoop-examples-1.0.2.jar randomwriter /benchmarks/random-data.
排序的测试工具如下:
$ hadoop jar hadoop-examples-1.0.2.jar sort /benchmarks/random-data /benchmarks/sorted-data.
排序正确性检查的测试工具如下:
$ hadoop jar hadoop-test-1.0.2.jar testmapredsort -sortInput /benchmarks/random-data -sortOutput /benchmarks/sorted-data.
基于原生Hadoop和基于本文提出的ID-CAP方案在这3个步骤的运行时间对比结果如表3所示。测试结果显示, ID-CAP方案对排序测试没有明显的性能下降。
3) MapReduce连续性测试
每个job处理10 000行文本文件、 6个map、 2个reduce、 只收集数据,分别运行100次,测试工具如下:
$ hadoop jar hadoop-test-1.0.2.jar mrbench -numRuns 100 -maps 6 -reduces 2 -inputLines 10 000.
基于原生Hadoop和基于本文提出的ID-CAP方案的平均执行时间对比结果如表4所示。测试结果显示, ID-CAP方案对MapReduce连续性测试并没有明显的性能下降。
Hadoop云计算平台安全无法满足开放环境下的多租户安全需求。本文采用了分布式系统设计的最小授权原则,设计了一种基于身份的Capability (ID-CAP), 并提出基于ID-CAP的Hadoop访问控制方案。实践表明: 该方案能有效地实现在Hadoop平台上实施最小授权原则,并支持平台内部相互依赖的各模块之间的身份认证,能有效提高Hadoop平台的整体安全性。
[1] |
|
[2] |
|
[3] |
|
[4] |
|
[5] |
|
[6] |
|
[7] |
|
[8] |
|