Container和VM的隔离性分析 (1)

836 阅读6分钟

相较于现有容器技术,传统的虚拟机(VM)具有以下几个主要区别:1. 虚拟化技术:VM是通过虚拟化技术实现隔离,主要通过对CPU进行虚拟化,将虚拟机的指令转化为CPU指令,从而实现虚拟化。而容器是通过Linux内核的隔离机制实现隔离。VM使用虚拟机监控程序(VMM)在硬件层面上模拟出一个独立的操作系统环境,而容器则是在宿主机上共享同一个内核,并通过各种隔离机制来实现对容器的隔离。

  1. 完整的操作系统:VM是在一个完整的操作系统环境中运行应用程序,而容器则是在一个与宿主机共享同一个内核的环境中运行应用程序。因此,VM提供了更加彻底的隔离,可以避免容器中某些进程对宿主机的攻击和干扰。
  2. 资源占用:VM通常需要在每个虚拟机上运行一个完整的操作系统,因此资源占用更高。而容器则可以共享同一个内核和操作系统,因此资源占用更少。
  3. 启动速度:VM启动通常需要数秒钟,因为需要启动一个完整的操作系统环境。而容器的启动速度更快,通常只需要几毫秒或者几秒钟。
  4. 系统管理:VM通常需要进行独立的系统管理,包括更新、监控、备份等。而容器可以通过容器编排工具进行管理,简化了系统管理的复杂性。

容器相比虚拟机存在以下几个方面的安全问题:

  1. 共享内核:与虚拟机不同,容器使用与主机相同的操作系统内核。这意味着如果容器内发生安全漏洞,攻击者可以访问主机上的其他容器或主机本身。

  2. 特权提升:容器进程通常运行在 root 权限下,这意味着如果容器内发生安全漏洞,攻击者可以通过提升权限来访问主机上的其他容器或主机本身。

  3. 共享资源: 多个容器进程会共享网络和disk等资源, 可能造成资源抢夺的现象。

为了保护容器的安全,可以采取最小权限原则。

  1. 将容器内的进程权限限制为最小权限,并避免使用不该有的capability运行容器, 如果有share capability的地方,要在内核对share的kernel function做防护。

  2. 同时对容器进行memory fault 隔离,如果发现漏洞,不会access 别的容器的memory。

  3. 做隔离网络, 确保容器内网络流量与主机网络流量隔离。

  4. 限制资源访问量:通过使用cgroup安全机制,限制容器内进程对主机资源的访问。

现在的容器隔离是指通过操作系统提供的机制,将进程或者容器中的资源隔离开来,使得它们互不干扰,可以独立地运行和管理。在Linux系统中,容器隔离通常通过cgroup和namespace机制实现。 现有容器隔离方案的一些常见配置项:

  1. capabilities:capabilities是一种Linux内核的安全增强特性,它可以对操作系统的各种功能进行隔离和限制,从而提高系统的安全性。通过capabilities,可以让一个进程只能拥有部分root权限,而不是完整的root权限,这样就可以限制其对系统的操纵能力,降低系统被攻击的风险。
  2. Namespaces:Namespace 是一种内核机制,它可以提供隔离的视图,以使不同的进程看到不同的系统资源。Namespace 可以分为七种类型,包括Pid NS、Mount NS、Network NS、UID NS等,可以分别隔离进程树、文件系统、网络接口、用户ID等, 每一种类型都提供了一种隔离视图。它们分别是:
    1. Mount Namespace:控制文件系统的挂载点和挂载视图,可以在命名空间内挂载文件系统,但对外部不可见,并且可以放宽根文件系统的限制,实现文件系统隔离。
    1. UTS Namespace:隔离主机名和域名等系统标识符,使得进程可以有自己独立的主机名和域名。
    1. IPC Namespace:隔离 System V IPC 和 POSIX 消息队列,使得进程只能与同一命名空间内的 IPC 进行通信。
    1. PID Namespace:隔离进程树,使得进程只能看到同一命名空间内的进程。PID Namespace会让在容器内使用“ps”命令会显示不同的结果,并且可以限制信号的使用。
    1. Network Namespace:提供“虚假”的网络接口,隔离网络设备、网络栈、端口等网络资源, 由父容器连接外部网络,但受权限限制。
    1. User Namespace:可以提供“虚假”的root用户,隔离用户和用户组 ID,使得进程只能看到同一命名空间内的用户和用户组, 但受限于父容器的权限。
    1. Cgroup Namespace:隔离控制组,使得进程只能看到同一命名空间内的控制组。
  1. seccomp:Seccomp是Linux内核提供的一种安全增强机制,可以限制进程能够使用的系统调用。Seccomp可以通过定义一个策略,限制应用程序能够调用的系统调用类型、参数、数量等,从而达到对应用程序的限制和控制。当一个进程试图调用被Seccomp策略禁止的系统调用时,内核将会直接终止该进程,从而保证系统的安全性。
  2. cgroups:通过将系统资源分组和限制使用,包括CPU、内存、IO和网络等,控制容器内进程的资源使用量,从而实现资源隔离。
  3. AppArmor/SELinux:通过限制容器进程的访问权限,包括文件和目录、网络和系统调用等,保证容器内进程只能访问其需要的资源,从而实现安全隔离。
  4. 根文件系统隔离:通过为每个容器分配独立的根文件系统,使容器之间无法访问其他容器的文件系统,从而实现文件系统隔离。
  5. Masked path:masked paths是一种安全增强配置项,可用于限制容器的访问权限,防止容器访问/proc、/sys和其他敏感路径。

下面我们分别分析每种容器隔离的源码实现和背后的原理,并讨论安全容器添加的隔离带来的效果。