基于Java安全体系结构的托管PaaS平台安全容器*
2013-08-13杨莎莎杨放春
杨莎莎,杨放春,王 蔚
(1.北京邮电大学 网络与交换技术国家重点实验室,北京 100876;2.中兴通讯股份有限公司,江苏 南京 210000)
云计算是一种新兴的商业计算模式,它将计算任务分布在大量计算机构成的资源池上,使各种应用系统能够根据需要获取计算能力、存储空间和各种软件服务[1]。云计算代表了IT领域向集约化、规模化与专业化道路发展的趋势,是IT领域正在发生的深刻变革,但它在提高使用效率的同时,为实现用户信息资产安全与隐私保护带来极大的冲击与挑战[2]。当前,安全问题已成为云计算推广应用的最主要的制约因素,因此,云安全问题成为必须解决的问题之一[4]。
平台即服务PaaS(Platform-as-a-Service)作为云计算的一种,是将基础设施平台作为一种服务呈现给用户的商业模式,方案成本比较低。对那些资金有限、IT服务资源有限,并且急需扩展IT基础支撑的企业有着巨大的吸引力[3]。同时,PaaS也是SaaS模式的一种应用,它降低了SaaS开发应用的门槛,提高了开发效率,充分体现了互联网低成本、高效率、规模化应用的特性,是一场互联网应用软件开发的革命。
本文首先分析了现有PaaS平台的特征及其面临的安全问题,然后介绍了现有解决方案及其不足,最后提出了一种基于Java安全体系结构的托管PaaS平台安全容器解决方案。
1 托管PaaS平台及其安全问题
1.1 托管PaaS平台
PaaS提供基于基础设施(即 IaaS)上的软件、中间件和应用开发工具[8]。不同的PaaS提供不同组合的服务,综合的PaaS是一个集开发、测试、部署、托管和应用维护为一体的集成运维环境,有的PaaS还提供源代码和版本控制等应用软件开发的过程管理[6]。从PaaS环境的应用支撑环境出发,典型的PaaS系统分为两类:开放PaaS平台和托管PaaS平台。其中托管PaaS平台只提供包含安全和可伸缩性等基本功能的托管服务,不提供开发和测试环境。
1.2 托管PaaS平台的安全问题
托管PaaS平台为了实现可扩展、可用性、管理以及运行效率等方面的“经济性”,基本都采用多租户模式。多租户PaaS服务模式的应用面临着一些安全隔离问题[9]。
(1)云计算应用所用的数据会和其他用户的数据混合存储,恶意的云服务提供商、恶意的邻居“租户”以及某些类型应用的滥用会造成用户数据安全问题;
(2)不同用户的应用共同运行在一个JVM之上,对JVM的非法操作会造成邻居租户的应用安全问题,例如恶意应用通过系统调用使JVM退出;
(3)不同用户的应用在运行过程中共享系统资源,如CPU、内存、网络资源等。恶意应用对共享资源过多的非法占用将会造成邻居租户应用无法正常运行。
1.3 PaaS平台安全问题一般解决方案
在多租户PaaS模式中,最核心的安全原则就是多租户应用隔离[7]。云用户确保自己的数据只能被自己的企业用户和应用程序访问。为了实现多租户应用隔离,云提供商必须提供“沙盒”架构,通过平台的“沙盒”性实现集中维护客户部署在PaaS平台上应用的保密性和完整性。为了提供“沙盒”架构,现有云提供商通过为每一个用户应用提供一个Servlet容器的方法来实现逻辑上的隔离,例如Google App Engine为每一个应用运行一个独有的Jetty容器。
现有解决方案能有效提供平台的“沙盒”架构,实现多租户应用隔离,但是同时,多租户模式下运行多个Servlet容器的模式会带来较大的系统开销。本文在现有解决方案的基础上,提出了一种由一个Servlet容器承载不同应用的解决方案,在实现多租户应用隔离的同时保证系统性能。
2 托管PaaS平台安全容器设计
本研究中,基于Java实现托管PaaS平台,采用Jetty作为Servlet容器,实现对Java Web应用的托管服务。
自Java技术出现以来,Java平台的安全问题以及应用Java技术而产生的安全问题引起了广泛的关注,并从JDK1.0以来,Java的安全体系结构不断演变,安全也不断得到加强,如今Java技术已能提供对安全的良好支持。本文提出的PaaS平台安全容器,就是利用Java技术提供的安全性,并在此基础上结合托管PaaS平台特点进行定制而实现的。
2.1 Java安全体系结构
Java技术从多个方面提供了对安全性的支持:Java语言本身安全性;虚拟机的双亲委托类加载机制;安全管理器和Java API。这些共同构成了Java安全体系结构,即沙盒模型:一个支持灵活的细粒度访问控制安全策略,并且具有可扩充性和伸缩性的安全体系结构。
Java沙盒采用了灵活的保护域安全模型,由安全策略来决定代码具有的访问许可,对被保护资源的访问会激发安全检查,这些检查会将授权的许可和其试图访问所需要的权限进行比较。这些激发安全检查的访问包括文件系统访问、JNI访问本地代码和创建Socket连接等。
2.2 托管PaaS安全容器
利用Java沙盒模型提供的访问控制功能,可以将同一JVM中运行的代码从逻辑上分开:分别运行于不同的沙盒中。在本研究中,托管PaaS平台安全容器,即基于Java沙盒模型实现应用隔离。
利用Java沙盒模型可以实现PaaS平台应用的访问控制功能,但同时也存在一些不足:
(1)Java安全策略文件实现代码和权限映射,在托管PaaS平台上,系统运行过程中,用户不断上传新应用,这就使得安全策略文件需要不断修改并生效。
(2)用户上传Web应用多采用 war包的形式,Jetty部署应用时会将其自动解压至临时文件夹,这为在安全策略文件中指定该应用的代码位置带来了困难。
(3)在PaaS平台中,多租户应用共同运行在一个Jetty容器中。为避免相互影响,这些应用只能拥有有限并且相同的资源访问权限,通过安全策略文件的形式存在很大的重复,并且JVM实现安全策略文件到应用权限的映射也会降低系统性能。
因此,本研究中,基于托管PaaS平台及Jetty和用户应用的特点,在Java沙盒模型的基础上进行了扩展和定制。其体系结构如图1所示。
在托管PaaS平台运行环境中,安全容器提供应用运行受限的环境,即沙盒环境。沙盒环境实现应用运行时5个方面的访问控制:文件访问控制、网络访问控制、多线程控制、JNI访问控制和 System.exit()方法访问控制。在托管PaaS平台运行环境中,安全容器在Java安全体系结构基础上进行扩展,实现了两套逻辑沙盒模型,在逻辑上把系统代码和应用代码分开处理,实现简化安全策略文件的配置,提高系统性能。
在托管PaaS平台运行环境中,两套逻辑沙盒模型(默认沙盒、应用沙盒)分别提供系统代码和应用代码的运行环境,并实现相应的访问控制。托管PaaS平台运行环境安全模型主要通过保护域模块、类加载模块、安全策略模块、访问控制模块4个逻辑模块来实现。
(1)保护域模块
在Java安全体系结构中,域在逻辑上封装了一组类,并根据当前有效的安全策略,将这组类的实例赋予一组相同的许可权限。当类加载器将类型装入Java虚拟机时,它们将为每个类型指派一个保护域,Java应用环境通过维持代码到它们的保护域,再到它们的许可权限的映射来实现沙盒。
在PaaS系统中,定义了两种安全域:系统保护域和应用保护域。系统保护域使用Java安全体系结构中默认的域模型,即通过代码位置及签名指定保护域,并通过安全策略文件为其指定权限。
类似地,应用保护域由每个应用的AppContext来指定,逻辑上与一个Web应用相对应。同时,由于安全容器中所有应用拥有特定的有限权限,可以通过应用类加载器直接为应用指定权限集,从而避免安全策略文件到权限的映射。
(2)类加载模块
在Java安全体系结构中,由类加载器根据所加载的所有类或接口的代码库和签名,以及系统的安全策略创建保护域的实例,并为每个类型指派到相应的保护域。
PaaS平台运行环境中实现了两套保护域模型,相应地实现了两套类加载策略:系统类(Jetty代码和服务端代码)和应用类分别由系统类加载器和WebApp类加载器加载。系统类加载器加载代码时,使用Java安全体系结构默认的方式(即代码位置)为每个类型指派保护域。WebApp类加载器加载应用类时,根据该应用的AppContext为其指派保护域,并为此保护域赋予默认应用权限集。
在Jetty中,应用类的加载利用ContextClssLoader的方法,为每一个应用起一个线程,通过该线程的ContextClassLoader属性保存一个ClassLoader实例的引用,使得此线程的任何语句都可以得到此ClassLoader,然后用来加载类。即在Jetty中,每一个应用由一个WebApp-ClassLoader实例进行加载。
(3)安全策略模块
在Java安全体系结构中,沙盒模型中类和权限的映射由类加载器加载类时实现:类加载器创建一个保护域的实例,并根据当前安全策略为该保护域内代码创建权限集。
默认沙盒采用Java安全体系结构默认的安全策略文件来实现安全策略,即JVM实现安全策略文件到保护域权限集的映射。应用沙盒采用PaaS系统默认应用安全策略,该策略指定了PaaS系统中应用的默认权限集,由WebAppClassLoader加载应用类型时直接指定。
(4)访问控制模块
Java安全体系结构中,运行于沙盒中的代码访问被保护资源时,由安全管理器进行安全检查,最终实现对沙盒中代码的访问控制。由PaaS平台运行环境体系结构图可知,在PaaS中,为了更好地进行应用的访问控制,系统代码和应用代码分别运行于两套沙盒模型中,并且这两套沙盒分别采用各自的域模型和安全策略模型。因此,为了实现访问控制,需要分别按照两套逻辑分别进行权限检查。同时,出于安全的考虑,Java安全体系结构中,JVM实例某一时刻最多只能指定一个安全管理器实例,因此在PaaS平台运行托管环境中,安全管理器需要同时处理两套访问控制逻辑。其访问控制流程如图2所示。
图2 Java体系结构
访问被保护资源时,安全管理器将进行访问控制:首先判断当前访问请求来自应用沙盒还是系统沙盒;其次根据沙盒的保护域模型进行相应的访问控制。
3 托管PaaS平台安全容器系统测试
3.1 系统测试部署
测试环境如图3所示。
PaaS云平台中逻辑结点均为虚拟机,包括一个PaaS Manager、一个FTP服务器以及若干 PaaS Container结点。测试中,所有虚拟机性能均相同,CPU个数为1,内存为1 024 MB。
3.2 安全容器系统开销测试
在此测试阶段,3台Container结点分别使用以下方式托管应用:运行一个Servlet容器,托管一个用户应用;运行一个Servlet容器,托管 3个不同用户应用;运行 3个Servlet容器,分别托管一个用户应用。系统启动并运行稳定后,每5 s记录一次Container占用CPU及内存的情况。测试结果分别如图4、图5所示。
由测试结果可知,运行Servlet容器将会带来较大的系统开销,而一个Servlet容器中托管应用数的增加并不会带来较明显的CPU及内存的消耗。因此,与现有PaaS使用一个容器托管一个应用的方式相比,本文中PaaS安全容器解决方案将会带来明显的系统性能提升。
3.3 沙箱模型性能测试
为了实现PaaS容器安全,通过Java沙箱机制实现应用隔离。本文的PaaS安全解决方案中,结合Jetty托管应用的特点,在Java沙箱模型基础上实现定制。本测试阶段,3台Container结点分别作如下实现:无沙箱、默认沙箱和定制沙箱。3台Container分别托管相同应用,该应用无文件访问权限,系统启动并运行稳定后,通过PC客户端访问应用,进行10次文件读操作,记录所需CPU时间。测试结果如图6所示。
无沙箱限制时,应用读文件成功,沙箱环境下,应用访问失败。同时,由上述测试结果可知,没有沙箱限制时,应用读文件所需CPU时间最短。通过定制沙箱,减少从安全策略文件到沙箱权限集的映射,一定程序上提高了应用运行速度,提高系统性能。
云计算是当前发展迅速的新兴产业,其发展面临着许多关键问题,其中安全问题成为制约其发展的最主要因素[7]。PaaS作为云计算的一种服务方式,具有广阔的发展前景。本文研究了PaaS云平台所面临的一些安全问题,分析了现有解决方案及其存在的缺陷,并在此基础上提出托管PaaS平台安全容器解决方案。通过测试证明,本文所提出的解决方案在实现PaaS平台应用隔离的前提下,降低了系统开销,保证了系统性能。
[1]刘鹏.云计算的定义和特点[OL].(2009-02-05).http://www.chinaclold.cnlshow.aspx?id=741&eid=17.
[2]CSA,Cloud Security Alliance[EB/OL].http://clandsecuring aliance.org.
[3]LUIS M V,LUIS R M,JUAN C,et al.A break in the clouds:towards a cloud definition[J].ACM SIGCOMM Computer Communication Review,2009,39(1):50-55.
[4]BALACHANDRA R K,RAMAKRISHNA P V,ATANU R.Cloud security issues[C].Proceedings of the 2009 IEEE International Conference on Services Computing.2009:517-520.
[5]张云勇,陈清金,潘松柏,等.云计算安全关键技术分析[J].电信科学,2010,26(9):64-69.
[6]RAJU B P R,SWARNA P R,RAO M S.Privacy and security issues of Cloud Computing[J].IJART,2011,1(2):128-136.
[7]冯登国,张敏,张妍,等.云计算安全研究[J].软件学报,2011,22(1):71-83.
[8]KUYORA S O,LBIKUNLE F,AWODELE O.Cloud computing security issues and challenges[J].IJCN,2011,3(5):344-349.
[9]林兆骥,付雄,王汝传,等.云计算安全关键问题研究[J].信息化研究,2011,37(2):1-4.