一、虚拟机简介
虚拟化指的是讲一个物理计算机划分为一个或多个完全孤立的“虚拟机”,俗称VMs。对于操作系统而言,实际上把他们看作是在自己身上运行的一个程序,但他们实际上会共享机器的物理硬件,比如CPU、内存、磁盘和网络设备。虚拟机的使用提供了两个主要的好处:资源共享和隔离。在非虚拟环境中,所有的资源在物理计算机上专用。如果系统有2GB的内存,运行任务使用了其中1GB,那么其余的就会被闲置,不能充分利用。
在虚拟机的状态下,各种资源可以根据需要分配,在有的情况下甚至可以不用重启虚拟机即可分配硬件资源,虚拟机环境还提供了隔离。但是在非虚拟的状态下,所有运行的程序可以彼此看到对方,如果有足够的权限,他们可以相互进行通信。
虚拟机提供的环境,看起来就像是独立并存的数个计算机,而实际上他们都是在一个物理主机上模拟运行的。虽然虚拟机的隔离程度依赖于底层的虚拟化技术,但是在没有进行特殊配置的情况下,虚拟机之间并不允许互相交流。另外,这种环境的隔离还包括了另外一层意思,即使某个虚拟机崩溃了,也不应当影响其他的虚拟机运行。
二、虚拟机的安全威胁
虚拟化技术现在仍在发展,并且功能越来越强大。但是历史证明:功能越伟大,安全漏洞也越多,我们现在还不能完全知晓虚拟化技术的安全弱点,但问题是肯定存在的,本文意在透过已知的安全问题,提醒大家注意虚拟化带来的安全问题。
1、虚拟机之间的通信
虚拟机一般实现这四个功能:
多个组织共享一个物理机。
在一台计算机上,有高保密要求和低保密要求的应用。
合并一些服务到少数物理机上
提供一个通用硬件平台,承载多个操作系统
前三种情况都有隔离的需要,第一种情况下,其他组织是无法访问他们的。第二和第三种情况下,这些虚拟机不应该被不相关的人访问,第四种情况,虚拟化的目标一般是为了实现系统之间的交互。相对于物理机,虚拟机的安全问题是比较独特的。
比如剪贴板技术允许数据在虚拟机和主机之间传输,这个功能很方便,但也很容易被利用,恶意程序可以很方便的在系统之间传输。再比如,某虚拟技术在操作系统内核,提供了虚拟层的按键和屏幕记录,甚至可以监控虚拟机内的加密连接。还有,有的虚拟机根本没有进行隔离,可以让虚拟机无障碍的进入宿主机,在侧重运行的应用设计里比较常见,避免了信息孤岛,这也是很多虚拟机用户的要求,所以这也存在较大的安全隐患,应该讨论一个适当的方法进行隔离。
2、虚拟机逃逸技术
虚拟机让我们能够分享主机的资源并提供隔离。在理想的世界中,一个程序运行在虚拟机里,他应该无法影响其他虚拟机。不幸的是,由于技术的限制和虚拟化软件的一些bug,这种理想世界并不存在。在某些情况下,在虚拟机里运行的程序会绕过底层,从而利用宿主机,这种技术叫做虚拟机逃逸技术,由于宿主机的特权地位,其结果是整个安全模型完全崩溃。这也就是说,你在虚拟机上测试病毒、恶意软件,这些东西如果设计好的话,就会通过虚拟机进入你的系统。
3、宿主机对虚拟机的控制
对于虚拟机来说,宿主机是一个控制者,对虚拟机的检测、改变、通信都在宿主机上完成,所以宿主机的安全要更严格管理。根据不同的虚拟机技术,宿主机可在这几个方面影响虚拟机:
启动、停止、暂停、重启虚拟机;
监控和配置虚拟机资源,包括:CPU、内存、磁盘、虚拟机的网络;
调整CPU数量、内存大小、磁盘数量、虚拟网络的接口数量;
监控虚拟机内运行的应用程序;
查看、复制、修改数据在虚拟机的磁盘存储。
由于所有的网络数据都会通过宿主机发往虚拟机,那么宿主机就能够监控所有虚拟机的网络数据。
4、虚拟机对虚拟机的控制
隔离是虚拟机技术的主要特点,但是如果你从A虚拟机去控制B虚拟机,那么安全漏洞就出现了。现代的CPU可以通过强制执行管理程序,来实现内存保护,内存的管理程序应该是独立的,在正确的规则里,应该禁止正在使用的内存看到另外一个虚拟机。换句话说,即使B虚拟机上有内存未被使用,A虚拟机也不能去使用这些闲置内存。
那么对于网络流量来说也一样,每个虚拟机的连接都应该有专用的通道,虚拟机之间不能嗅探对方的数据包。但是,如果虚拟机平台使用了“虚拟hub”或者“虚拟交换”来连接所有虚拟机,那么虚拟机就可以进行嗅探,或者使用ARP中毒来重新定向数据包。
5、拒绝服务 由于虚拟机和宿主机共享资源,虚拟机会强制占用一些资源,从而使得其他虚拟机拒绝服务。现在通常的做法是:限制虚拟机可用资源。虚拟化技术提供了很多机制来保证这一点,把资源单独分配给一个虚拟机。正确的配置可以防止虚拟机无节制的滥用资源,从而避免拒绝服务攻击。
6、外部修改虚拟机
信任关系对虚拟机来说是个很重要的基础。例如,我们定义一个虚拟机的账户a,可以通过受保护的应用程序来访问数据库。账户a被锁定在这个应用程序里,也就是说账户a不能够访问数据库以外的应用。但是如果虚拟机可以被修改,那么账户a就有可能访问宿主机,这种信任模式就被打破了。对信任关系的保护可以通过数字签名和验证,签名的密钥应该放在安全的位置。
7、外部管理程序修改
虽然虚拟机一般都能够自我保护,但是恶意程序仍然能够影响虚拟机的管理程序。在去年加拿大举办的CanSecWest会议有一个来自VMware的研究员做了一个关于VMsafe的演讲,他利用Vmsafe API实现了一个小工具,这个工具是在VM外面运行,VM里面运行Filemon时会去修改SSDT表来监控文件的操作,在外面运行的小工具就会知道里面发生的一切,而且可以进行干预。比如说我想让VM中的系统在某些内存访问的时候产生一个断点,然后外面就可以知道里面运行的程序在做什么。因此还应该防止未授权的虚拟机管理程序,或者使用能够验证的管理程序。三、硬件安全
1、硬件环境
在物理机上需要有足够的处理能力、内存、硬盘容量和带宽,以满足虚拟机的运行要求,一般建议计划一些额外的处理能力和内存。
但是在资源有限的环境里,有时候会分配超出处理能力的资源给虚拟机,因为虚拟机群不会在同一时间内达到峰值。比如有3个虚拟机,每个虚拟机申请峰值不超过500MHz的处理器时间,但是物理机实际上只是1GHz的CPU,由于他们满负载的时间不一致,因此可充分利用CPU资源,这种方法叫做资源饥饿。但这种方法可能会导致拒绝服务,你如何确保所有虚拟机不会在同一时间达到峰值?而且虚拟机资源共享机制比较粗糙,被饿死的可能不仅是CPU,内存、磁盘、带宽都有可能。
虽然虚拟机软件不尽相同,但是应该对物理机的硬件做如下考量:
CPU–CPU数量、内核、缓存大小、速度
内存–需要的内存量,取决于物理机的需求+虚拟机的需求+额外开销
硬盘–容量、转速、存取时间、缓冲区大小
网络接口–单个或者多个网络接口
2、启动时的磁盘带宽
正常运行期间磁盘一般都能够提供足够的带宽,即使有多个虚拟机。但虚拟机在启动时会比较占用磁盘带宽,会同时加载一些库、守护进程及其他文件。有几种方法来解决:
A:开机时间错开,最关键的虚拟机首先启动,然后5分钟或者更长时间再启动另外一个虚拟机。
B:给每个虚拟机一个专用物理磁盘。
C:以上两种都没条件的话,你只好忍受漫长的启动。这是没有办法的办法。
3、限制对虚拟机的访问
宿主机对虚拟机的攻击有着得天独厚的条件,类似与贴身肉搏这种攻击,包括:
A:不需要账户和密码,即可使用操作系统特定的热键来杀死进程,监控资源的使用或者关闭机器。
B:重启机器,引导到外部媒体从而破解密码。
C: 窃取文件,比如利用软驱、光驱、USB等。
D: 捕获进出的网络流量。
E: 删除一个或多个磁盘,把它们挂载到已知管理员密码的机器上,可以进入虚拟机,从而看到全部内容。
F: 删除整个虚拟机。
宿主机的环境不同,造成的风险也不同,所以要对宿主机的安全提供细致的安全措施:
A: 宿主机的物理环境安全,包括对进入机房的身份卡验证,对机器进行加锁(避免被人窃走硬盘)。
B:在安装完毕后拆除软驱、光驱。
C:在BIOS里,禁止从其它设备引导,只允许从主硬盘引导。另外对BIOS设置密码,避免被人修改启动选项。
D:控制所有的外部接口。
4、加固操作系统
宿主机的操作系统相对于虚拟机,需要更加审慎的安全策略,因为宿主机管理着所有的虚拟机,一旦宿主机被突破,攻击者就有可能完全访问所有的虚拟机。并且宿主机还应提供一些额外的安全措施,比如防火墙、入侵检测系统:
A:宿主机应该只有一个账户能管理虚拟机。密码应该强壮,难以猜测,经常更换,只提供给必要的管理人员。
B:最安全当然是不接入任何网络。如果需要接入网络,在开启服务之前,要使用防火墙限制,只允许必要的人访问。
C:不需要的程序和服务不要开启,这样不仅可以保证安全,还可以节省资源。
D:应及时升级补丁。给宿主机打补丁要在其他机器上进行测试,因为一旦宿主机升级失败,会影响到所有的虚拟机运行。四、网络安全
1、虚拟机层端口的防火墙
除了宿主机上开放的端口,虚拟机层也会使用宿主机的IP开放一些端口,这些端口可以允许其他人远程连接到虚拟机层,以查看或配置虚拟机、磁盘,或者执行其他任务。对这些端口的访问应该受到严格的控制,至少需要一个宿主机的防火墙,只允许授权者对这些端口的访问。在理想的安全环境下,应该不允许任何远程访问,这样核心进程可以绝缘于外部环境。但在企业级的应用上这不现实,可以考虑设置一台单独的管理机进行管理。
2、使用加密通信
尽可能的使用通信加密手段,可以用HTTPS、TLS、SSH或者加密VPN来管理。仅有加密机制还是不够的,还应有身份鉴别和认证,以防止伪造源IP攻击、连接劫持、中间人攻击。
3、虚拟机身份验证
虚拟机和宿主机一样,也需要配置验证方式。比如密码的加密,登陆次数的锁定或延时等。
五、服务和配置
1、禁用部分功能
对于单一操作系统的虚拟机来说,总会有一些不需要的服务在启用,这些都是不必要的,而且他们占用了资源,可以关闭:屏幕保护、磁盘碎片整理、搜索工具(比如搜索磁盘内的文件)、病毒和恶意软件扫描、文件完整性检查、日志和日志分析工具、系统更新。这些功能的关闭都不会影响虚拟机运行。
比如空闲检测,系统会监视键盘活动、网络活动、磁盘负载、CPU利用率,来判断系统是不是空闲,如果是空闲的话,他可能会运行屏保或者其他程序。但由于虚拟机只了解自己的情况,别的虚拟机是不是更需要资源它不知道,它认定自己已经空闲下来了,于是开始运行程序,那么他就占据了相关的资源.在时间上,很多操作系统和应用程序会把低级别的工作安排在周末的一个固定时间。问题是,所有的虚拟机都这么做的话,就拉开了抢夺资源的大战,甚至这个时候,你的系统负载会超过业务繁忙时段。
这个问题有两个方法:
A:当然是关闭那些不需要的功能
B:错开低优先级应用的时间,例如在linux下,输入sleep $[ $RANDOM / 32 ],这个命令会在一个随机的秒数内暂停运行程序,这个随机的秒数在0-1023秒之内。如果系统没有提供随机休眠的话,可以手工设置虚拟机的任务开始时间。
2、文件共享
很多虚拟机软件支持在宿主机和虚拟机之间的无缝文件共享,这样带来了极大的方便,也引入了安全风险。这样虚拟机就有机会访问宿主机,甚至对共享的文件进行操作。即使没有共享目录,被激活的文件也有机会跑到虚拟机的环境之外,这个方便的口子可以被利用来攻击。除非有业务需要,明确要求文件共享,否则禁用文件共享功能。
3、时间同步
计算机的系统时钟是出了名的不准确,这还是在正常的情况下,如果BIOS或者电源出了问题,那计算机的时间就更不靠谱了。在虚拟机环境下,这个问题更严重,因为他们缺省都是依赖于宿主机的时钟,时钟的不准确性会导致任务的提前或滞后,比如我们限制周六到周日这两天,某服务关闭,由于时间的重大差异,可能会造成业务中断。同时日志也充满了未知的不确定,你根本无法从日志上得出事件的真实事件。解决他们的办法是配置同步时间服务器,这个服务器应该离你的网络很近。
4、操作系统安全加固
对操作系统进行各项安全的加固,就像它是一个物理机一样。这不是本文讨论的重点,网上有很多checklist可供参考。
5、断开不使用的设备
虚拟技术允许虚拟机直接、间接的控制物理设备,比如软驱、光驱、USB接口、打印机等。在虚拟机启动的时候,他们会检测这些硬件设备,如果多个虚拟机同时启动,则第一个启动的虚拟机优先使用,其他虚拟机的检测会被锁定,这会造成不必要的启动延迟。另外,如果在驱动器里有恶意代码,虚拟机可能会自动装入并执行,类似与自动运行的功能。建议关闭所有可控制的物理设备,或者只在需要的时候才允许连接。六、管理
1、远程管理方法
指定管理机的IP地址。设置强壮的用户名、密码,如果对安全有更高要求的话,可以使用双因素认证,PKI机制或一次性密码。通信管理也需要加密和认证,比如VPN或SSH。
2、SSH
SSH是个跨平台的终端管理程序,可以运行基于文本、图形的远程连接。SSH的客户端和服务端可以适用于不同的操作系统,灵活且安全。但要注意在使用SSH的时候,包括scp, sftp或者任何加强版本,都要禁用版本1协议。还要禁止管理员直接登录,用普通账户登录然后切换到管理员。安全要求较高,应选用DSA/RSA机制以防止中间人攻击。
3、VNC
VNC的英文名叫Virtual Network Computing,虚拟网络计算机,这个名字和虚拟机没有任何关系,它是一种软件方法,可以提供远程桌面功能,程序运行一个虚拟机,把屏幕推送到VNC 桌面上。你可以连到一个VNC桌面运行程序,就像在本地一样。断开之后,你安排的工作仍然会在后台继续运行。
类似于SSH,VNC提供了一个跨平台的工具,但是和SSH不同的是,VNC很难进行加密。所以VNC连接不能暴露在互联网上,如果需要从互联网连接的话,使用VPN或SSH隧道。
4、WEB管理
有些管理工具还提供了HTTP的管理界面,像前面一样,也应使用加密手段HTTPS。
七、审计
建议给虚拟机们提供一个集中的日志服务器,这个日志服务器也可以以虚拟机的状态来运行。好的虚拟机审计要包括:电源状态(开启、关闭、暂停、恢复),对硬件配置的更改,登录尝试、提升权限的账户。此外还应对文件的复制、移动、删除做审计。