容器安全入门

容器被认为是将这些微服务部署到云端的标准方式。除了安全性之外,容器在几乎所有方面都优于虚拟机,而安全性可能是它们被广泛采用的主要障碍。
本文将提供对容器安全性和可用于保护它们的可用技术的更好理解。
Linux 容器可以定义为在用户空间中运行的一个或一组进程,这些进程通过不同的内核工具与系统的其余部分隔离。
容器是虚拟机器 (VM) 的绝佳替代品。尽管容器和虚拟机都提供相同的隔离优势,但它们的区别在于容器提供操作系统虚拟化而不是硬件虚拟化。这使得它们轻量级、启动速度更快且消耗的内存更少。
由于多个容器共享同一个内核,因此该解决方案不如虚拟机安全,虚拟机拥有自己的操作系统副本、库、专用资源和应用程序。这使得虚拟机非常安全,但由于它们的存储空间大且性能降低,因此限制了可以在服务器上同时运行的虚拟机总数。此外,虚拟机启动需要很长时间。
微服务架构的引入改变了软件开发的方式。微服务允许以小型、自包含的独立服务来开发软件。这使得应用程序更容易扩展并提供敏捷性。
如果需要重写软件的一部分,则可以轻松地仅更改代码的该部分,而不会中断任何其他服务,这在单体内核中是不可能的。

1) Linux 内核功能
a. 命名空间
命名空间确保在容器中运行的进程的资源与其他进程的资源隔离。它们为不同的进程划分内核资源。一个单独命名空间中的一组进程将看到一组资源,而另一组进程将看到另一组资源。不同进程中的进程看到不同的进程 ID、主机名、用户 ID、文件名、网络访问名称和一些进程间通信。因此,每个文件系统命名空间都有其私有的挂载表和根目录。
这种隔离可以扩展到容器内运行的子进程。例如,如果容器中的进程分配了 PID 1,则也可以使用 PID 命名空间将相同的 PID 1 分配给任何其他子进程。
同样,其他命名空间(如网络、挂载、PID、用户、UTS、IPC 和时间)可以应用于隔离容器中的不同资源。
但是,命名空间的一个限制是一些资源仍然不感知命名空间。例如设备。
b. 控制组 (CGroups)
它们限制和隔离资源使用,例如 CPU 运行时、内存、磁盘 I/O 和网络,在系统上运行的用户定义的进程组之间。
与命名空间相反,cgroups 限制可以使用的资源数量,而命名空间控制容器可以看到哪些资源。
c. 功能
Linux 实现区分了两种进程类别:特权进程(超级用户或 root)和非特权进程。特权进程绕过所有内核权限检查,而非特权进程则根据进程的凭据接受完整的权限检查。
但在容器的情况下,这些二进制选项可能会很麻烦,因为为整个容器提供完整的 root 权限可能很危险。
功能将这种二分法转变为细粒度的访问控制。可以将一组功能分配给容器,这可以减少容器的 root 操作威胁。
d. 安全计算模式 (Seccomp)
Seccomp 可用于限制容器内可用的操作。它限制进程从用户空间到内核空间进行某些特定的预定义系统调用。如果进程尝试任何其他系统调用,则内核会终止该进程。每个用户空间进程都会公开大量系统调用,其中许多是不需要的。限制它们可以减少暴露给应用程序的内核表面总数。
seccomp-bpf 是 seccomp 的扩展,允许使用可配置的策略过滤系统调用。受限调用和允许调用的组合排列在配置文件中,不同的配置文件可以传递给不同的容器。与功能相比,它提供了更精细的控制,在安全漏洞期间,为攻击者提供了来自容器的有限数量的系统调用。
2) Linux 安全模块 (LSM)
为了理解 LSM 的工作原理,让我们看一下内核对象。
内核对象
每个内核对象只是内核分配的内存块。它将有关对象的信息保存在只能由内核访问的数据结构中。系统创建和操作多种类型的内核对象,这些对象包括访问令牌对象、事件对象、文件对象、文件映射对象、I/O 完成端口对象、作业对象、邮件槽对象、互斥体对象、管道对象、进程对象、信号量对象、线程对象和可等待计时器对象。

LSM
LSM 接口通过在内核中放置钩子(就在访问之前)来调解对内部内核对象的访问。它从根本上回答了以下问题:“<主体> 可以对 <对象> 执行 <操作> 吗?”,例如:“Web 服务器可以访问用户主目录中的文件吗?”。受保护的对象类型包括文件、inode、任务结构、凭据和进程间通信对象。操作这些对象代表了进程与其环境交互的主要方式,通过仔细指定允许的交互,安全管理员可以使攻击者更难以利用一个程序中的缺陷来转移到系统的其他区域。
Linux 安全模块 (LSM) 提供基于 MAC 的控制,且对内核本身的更改最小。LSM 允许模块通过在内核代码中放置钩子(就在访问之前)来调解对内核对象的访问。LSM 框架为各种安全检查提供了一种机制,可以通过新的内核扩展来挂钩这些检查。“模块”这个名称有点用词不当,因为这些扩展不是可加载的内核模块,而是在构建时选择的。
一些常用的 LSM 有
SELinux (Security Enhanced Linux) - 是基于 RedHat 的 Linux 发行版上的默认 MAC 实现。它以功能强大且复杂而闻名。SELinux 是基于属性的,这意味着文件的安全标识符存储在文件系统中的扩展文件属性中。SELinux 定义了系统上应用程序、进程和文件的访问控制。它使用安全策略(这是一组规则,告诉 SELinux 允许或不允许访问哪些内容)来强制执行策略允许的访问。
AppArmor - 它实现了一种以任务为中心的策略,其中任务“配置文件”是从用户空间创建和加载的。配置文件可以允许网络访问和原始套接字访问等功能。AppArmor 安全策略完全定义了单个应用程序可以访问哪些系统资源以及具有哪些权限。系统上没有定义配置文件的任务在未受限状态下运行,等同于标准的 Linux DAC 权限。
存在基于硬件的容器保护机制,可以保护容器免受其他容器以及恶意或受损主机的侵害。本文重点介绍了基于软件的容器安全方面。
这是对容器安全的简要介绍,主要与 Linux 容器相关。如果您想更详细地了解,请关注参考部分中的链接。
参考