Post

虚拟化及其安全

了解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)

容器逃逸

容器中的恶意进程基于已有权限实施攻击代码

原因

  1. 不安全配置导致的容器逃逸
    • 例:--privileged参数,提供在docker中运行docker的能力,容易
    • 应该坚持纵深防御、最小权限等原则
  2. 不安全挂载导致的容器逃逸
  3. 相关程序漏洞导致的容器逃逸

安全容器

在主机和容器之间提供一层隔离保护(安全沙箱)

  • 普通容器直接接触宿主机内核
  • 安全容器通过隔离层提供的API操作内核

gVisor

  • 为每个容器分配一个应用内核,即用户态内核
  • 该内核对容器进程提供Linux系统调用接口,屏蔽了进程对底层kernel的直接调用
  • 容器进程的所有内核系统调用都会用到gVisor,gVisor再去调用真正的系统内核
This post is licensed under CC BY 4.0 by the author.