容器被誉为是将应用程序部署到服务器上的非常有效的手段。容器(例如基于Docker开源标准的容器)比虚拟机消耗更少的资源,并且容器的设计更容易,且实例化和提供更快。
然而,与虚拟机不同,容器并不是100%与底层主机操作系统(通常是Linux或Window Server)或服务器上的驱动程序或其他应用程序隔离的。
虚拟机是一个完整的虚拟化服务器,通过被称为虚拟机管理程序的软件分配磁盘空间、处理器周期和I/O资源。在虚拟机中可以找到真实服务器上的所有内容:操作系统、设备驱动程序、应用程序、配置文件和网络连接。
换句话说,从底层起,是裸机、服务器的主机操作系统、管理程序,然后是一个或多个虚拟机,每个虚拟机都有自己的操作系统、驱动程序和应用程序。
相比之下,容器中的所有内容都共享底层主机操作系统、设备驱动程序和一些配置文件。例如Docker,它提供一个或多个容器,而不是管理程序。每个容器只保存应用程序。这些应用程序依赖于主机操作系统和驱动程序,它也与在同一台服务器上运行的其他容器共享。
容器的好处是:开销更小
如果在Linux服务器上有20台Linux虚拟机,则需要使用内存和CPU资源运行21个Linux实例,其中20个是虚拟机,另一个运行主机。启动所有这些Linux实例需要一定的时间,并且开销很大。
另一方面,所有这些Linux虚拟机都是相互隔离的,事实上,它们甚至可能是不同版本的Linux.在VM模型中,这完全没问题。
相反,如果在Linux服务器上有20个容器,则只需要一个Linux副本运行。启动一个容器非常快,并且消耗的资源要少得多,只有一个Linux内核和一组共享库。
但是,一个容器中的出现安全问题可能会泄漏并影响其他容器或其应用程序。
虚拟机的好处:更强的隔离
现代微处理器、主机操作系统(Linux和Windows)以及虚拟机管理程序(VMware ESX,Citrix XenServer和Microsoft Hyper-V)中的技术可在每个虚拟机之间提供基于硬件的隔离。这种保护是同心环:每个环都受到较高编号的环的保护,其中0环位于中心,与应用隔离。
在虚拟机系统中,主机操作系统的内核在0环中运行,这意味着什么都无法达到。管理程序在环1中运行。而单个虚拟机在环2中运行,因此无法访问环1内的管理程序或操作系统。
更重要的是,管理程序可以使用它的环1权限来执行规则,防止一个VM访问另一个VM的内存、应用程序或资源。
由于Docker Daemon不是环1管理程序,而是简单的环2应用程序,所以在容器中事物并不是同样安全的。因此,硬件中没有任何东西可以完全阻止一个容器对底层服务器进行更改,或者访问其他容器的内存、存储或设置。虽然有软件保护,但它们并非难以穿透。
如何保护容器
基于容器的服务器的安全性应视为适合“friends and family”:我们应该了解并信任在该服务器上运行的所有应用程序。
但是我们不需要知道或信任在服务器上运行的其他虚拟机上的应用程序,这就是为什么云托管公司使用虚拟机而不是容器来隔离客户的软件和数据的原因。
保护容器不易受到伤害,可以归结为以下几种常见方法。首先,最小化容器化软件的攻击面,以便在受到攻击时,将数据泄漏的危险性降到最小。
另一个是严格控制对容器的访问,并且如果有必要,需要在自己的服务器上隔离特别敏感的容器。
一定要研究使用的容器系统以及底层主机操作系统。例如,那些在Red Hat Linux上运行的容器应该查看公司的“十层容器安全”文档。其他必读内容是Docker的“容器安全入门”和Microsoft的“在Azure容器服务中确保Docker容器安全”。
容器是将应用程序部署到云中的最快、最有效的方式,并且比虚拟机的资源效率更高。目前的问题是容器不像虚拟机那样安全。但只要在使用容器的时候考虑到这一点,你将能够得到更好的体验。