虚拟化及其安全
了解Hypervisor和容器逃逸
虚拟化及其安全
虚拟化技术类型
- 指令级虚拟化
- 将虚拟机中执行的指令翻译成主机指令,然后在真实的硬件上执行,被称为模拟器
- 虚拟机和真实的硬件平台之间没有严格绑定,具有很强的可移植性
- Bochs、QEMU、BIRD
- 硬件级虚拟化
- VMM在物理机上创建多个虚拟机,并且给每个虚拟机提供底层真实硬件的视图,让虚拟机中的os或app认为其运行在真实的硬件上,大大提高执行速度
- VMware ESX Server、Virtual PC、Xen
- 操作系统级虚拟化
- 通过共享真实的物理硬件和操作系统来为多个租户提供独立、隔离的操作环境。
- 可以快速地“克隆”当前主机的操作环境来进行沙盒测试,免除了大量不必要的安装和配置开销
- Linux-VServer、Jails
- 编程语言级虚拟化
- 在应用层提供一套自定义、与处理器无关的指令集。利用该指令集开发的软件能够屏蔽硬件的异构型,主要应用于与硬件平台无关的软件开发
- Java、Microsoft .NET CLI
- 程序库级虚拟化
- 在应用层模拟一套租户级的应用编程接口,从而隐藏与操作系统相关的细节,可以在某种操作系统上运行其他操作系统的应用程序,例如在Linux上运行Windows程序
- WINE、Cygwin
Partition、Isolation、Encapsulation、Hardware free
Hypervisor
VMM
是一种运行在物理服务器和操作系统之间的中间层软件,允许多个操作系统和应用共享一套基础物理硬件
Type1
直接运行在物理硬件上,如KVM、Xen
- 以最高级别的特权执行,它们可以完全控制底层资源,并且可以完全控制运行在其之上的任何虚拟机
- 占用的空间较小,从而减少了漏洞(因为这通常与代码大小成正比),具有更强的安全性
Type2
运行在一个操作系统上,如VMware、JVM、QEMU
类型选择
取决于特定的使用场景和要求。
- 对于需要高性能和资源利用率的生产环境,Type1更为常见
- 对于开发、测试或桌面虚拟化等轻量级应用,Type2则更为实用
虚拟机攻击
- Traditional attacks according to services
- Guest VM attack other Guest VMs(same network segment)
- Guest VM attack other Guest VMs on the same Hypervisor(VM hyper Jumping)
- Cross-VM attack(Side Channel Attack)
- Guest Stealing
- Guest Copy
容器
在宿主操作系统上运行的独立、封装的进程,共享主机操作系统的内核
- 容器之间相互隔离、但与虚拟机相比,它们不需要运行完整的操作系统
- 性能开销相对Hypervisor较小
- 容器提供适度的隔离,但不如虚拟机那么彻底
镜像
是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数
Dockfile
一个用来构建镜像的文本文件,文本内容包含了多条构建镜像所需的指令和说明
- FROM:指定定制镜像依赖的基础镜像
- ENV:设定镜像中需要的环境变量
- RUN:运行指定的命令,此类命令通常用于安装程序或依赖库、编译程序源码等
- COPY:向镜像中拷贝文件
- WORKDIR:设定镜像实例化为容器后服务运行的工作目录
分层存储
- Dockerfile中的每个指令都会创建一个新的镜像层
- 镜像层将被缓存和复用
镜像仓库
Docker Hub是全球最大的公有镜像仓库
完全限定的镜像标识FQID
Docker Registry中可以包含多个仓库,每个仓库可以包含多个标签,每个标签对应一个镜像
公有仓库
私有仓库
镜像安全现状
将恶意软件上传到软件包仓库中
- 大量镜像中依旧存在许多违反安全规则的行为,如设置较弱的SSH连接密码等
- 镜像间存在复杂的继承关系,90%的镜像中仍包含高危漏洞
仓库域名抢注攻击
- 生成多个拼写错误的FQIDs,诱使用户从恶意仓库中拉取镜像
- 利用容器用户潜在的拼写错误分发恶意容器镜像
容器隔离技术
实现资源层面上的限制和隔离,依赖于Linux内核所提供的namespace和cgroup技术
命名空间(namespace)
容器逃逸
容器中的恶意进程基于已有权限实施攻击代码
原因
- 不安全配置导致的容器逃逸
- 例:
--privileged
参数,提供在docker中运行docker的能力,容易 - 应该坚持纵深防御、最小权限等原则
- 例:
- 不安全挂载导致的容器逃逸
- 相关程序漏洞导致的容器逃逸
安全容器
在主机和容器之间提供一层隔离保护(安全沙箱)
- 普通容器直接接触宿主机内核
- 安全容器通过隔离层提供的API操作内核
gVisor
- 为每个容器分配一个应用内核,即用户态内核
- 该内核对容器进程提供Linux系统调用接口,屏蔽了进程对底层kernel的直接调用
- 容器进程的所有内核系统调用都会用到gVisor,gVisor再去调用真正的系统内核
This post is licensed under CC BY 4.0 by the author.