应用开发中迅速增长的虚拟化容器方式巩固加深了其在生产环境IT管理者心目中的地位。尽管看起来与虚拟机相似,但两者相比还是有一些核心差异,这些差异促使IT部门重新审视已有的安全策略。
越来越多的IT部门正在被迫放弃已有的全栈虚拟机应用部署方式。应用运行在大量进程上,这些进程需要灵活可控。而在虚拟机中,如果进程发生变化,整个虚拟机的运行需要更改。
虚拟机通常基于传统的单片应用模型,而容器则能对复合应用模型提供更好的支持。
虚拟机具备了运行一个应用程序所需要的全部资源,包括应用程序、数据库、数据分析、虚拟化的硬件资源、BIOS以及应用正常工作所需要的所有服务。因此,每个虚拟机都是一个完整的系统,而虚拟机的安全策略在本质上与一个物理机系统完全相同。由于虚拟机是一个全栈系统,它的缺点是每当启动一台虚拟机,意味着启动BIOS,接着启动操作系统,然后启动余下的所有相关应用软件。虽然这个启动过程基于一系列虚拟化资源,比物理机启动快,但是并不足以快到能瞬时启动,除非使用事先预置好的热虚拟镜像(虚拟机快照),但是这种启动方式需要使用额外的存储资源,导致资源浪费。虚拟化容器则没有这些方面的问题。
容器更多依赖于容器外部,而不是容器本身。尽管也是从物理层创建的抽象实例,但虚拟化容器以动态的方式共享大部分资源,每个容器通过底层平台访问大部分的设备。容器化概念更接近于应用程序的使用方式,它假设BIOS和系统已经运行了,因此无需像虚拟机一样再次启动。容器化技术利用共享资源创建了一个宽松的沙盒环境,每个容器在上面构建函数、服务或者应用。
在虚拟化容器中,应用程序可以被划分成多组容器化的功能,它们合力运行,构成的系统能够以更加灵活多变的方式提供进程。一个复合应用可以由一个专门配置并优化用于执行数据分析的容器,和一个专用的数据库或者应用逻辑协同组合而成。容器在这种服务链管理方面优于虚拟机,因为它基于一个共享平台工作,在使用共享的功能、设备方面比虚拟机更有效率。
更高的灵活性意味着需要更多的安全性
尽管容器的使用增加了整体的灵活性,它也引入了额外的管理需求以及安全问题。在虚拟机中,所有组件都在同一个地方,虚拟机可以作为一个独立实体进行管理和安全防护。与此不同的是,对于基于容器的应用,组成应用的一系列功能都是松耦合在一起,因此需要对每一个分别进行管理和安全防护。
如果底层平台的安全防护不到位,那么在其基础上搭建的所有容器的安全都得不到保证。反过来的情况也是一样。我们假设一个容器镜像拥有完整的超级用户权限。因为容器需要持续地跟底层平台交互,一个有权限访问容器的入侵者,理论上就可以通过容器化环境攻破底层平台,从而获得底层平台的访问权限。
尽管前面描述的情况听起来像是一个非常严重的设计缺陷,但这是容器运行的必要条件,也是其核心特点,正是这个特点使得容器能够比虚拟机提供给开发人员更多的功能提升潜力,吸引了大量产品开发的关注。生产环境IT系统选择采用容器技术需要确保两个关键问题,既要能保证容器自身内部的安全性,又要能保证容器化环境创建方式的安全性。
保证虚拟化容器的安全性必然是任何使用容器的群体的高优先级任务。在可能的情况下,通过使用各自的命名空间来隔离容器。为每个虚拟化容器提供独立的网络堆栈,避免任何特殊权限的访问能够穿过多个不同的容器再到达物理端口。使用控制组管理资源分配和利用——这种方式加强了外部安全性,因为它能够有助于预防分布式DOS攻击。
使用虚拟化容器的一些建议
仅仅在非常必要的时候才能使用虚拟容器的增强权限,并且在不需要该权限时立即切换回标准权限。为以防万一,在不使用的时候,永远不要将权限设置为增强权限;每次提升权限和重置回标准权限所产生的额外内部处理时延是值得的,因为这种做法能增强整个IT平台的安全性。
尝试用非root的权限运行服务:如果必须使用root权限,一定要与在物理IT基础设施上使用root权限一样小心。容器并不是一个沙盒,它存在各种各样的可与外部交互的方法。开发者并不是在一个密封空间里面开发,一个容器里面任何糟糕的代码可能会对同一物理平台上所有其他容器都产生严重的安全影响。绝大多数容器不需要root权限。大部分需要root权限的服务应该在容器外部的更底层平台运行。以低权限运行容器能够阻止任何类型的挂载请求,拒绝创建文件或者修改属性,防止模块装载,达到保护系统的目的。
底层平台对容器的安全性处理与传统虚拟化不一样,这个主要区别正是虚拟化容器的核心功能所在。对于Docker来说,Docker后台守护进程(Docket Deamon)在物理平台的root环境中拥有全部权限,并使用该权限创建虚拟化的容器环境。任何有权限访问该后台守护进程的用户就能完全自由地做任何想做的事情。因此,必须只能通过专用的系统管理员权限控制方法来控制访问后台守护进程。
虚拟容器安全性也包括监控容器如何使用API。API调用中的非常小的错误有可能导致恶意攻击,例如启动新的容器或者改变现有API调用,使之以很高的权限访问root环境。当企业系统在使用容器时,需要在API监控和管理方面做一些投入,比如采用Akana、Apigee或者CA Technologies公司的产品。