使用 SELinux 和 Smack 增强轻量级容器
安全 Linux 容器实现指南
轻量级容器 又称作 Virtual Private Servers (VPS) 或 Jails,它们是经常用于限制不可信应用程序或用户的工具。但是最近构造的轻量级容器没有提供充分的安全保证。使用 SELinux 或 Smack 策略增强这些容器之后,就可以在 Linux? 中实现更加安全的容器。本文介绍如何创建受 Linux 安全模块保护的更加安全的容器。SELinux 和 Smack 策略的开发都在进行当中,并且在各自社区的帮助下不断得到改善。
人们听到容器时的第一反应是 “如何才能创建安全的容器?”。本文通过使用 Linux 安全模块(Linux Security Modules,LSM)增强容器的安全性来解决这个问题。本文特别演示了如何设定安全目标,并通过 Smack 和 SELinux 安全模块实现目标。
要了解 Linux 容器的背景知识,请阅读 “linux.chinaitlab.com/administer/777960_2.html" target=_blank>LXC:Linux 容器工具”(developerWorks,2009 年 2 月)。
Linux 容器是根据几种 Linux 技术构建的概念性工件:
资源名称空间 允许在容器内部查找进程、文件、SYSV IPC 资源、网络接口等等。
控制组(Control groups)允许限制放置到容器中的资源。
功能绑定(Capability bounding)设置 限制容器的访问特权。
必须协调使用这些技术,以实现符合设想的容器。目前已有两个项目提供这个功能:
Libvirt 是能够使用 Xen 管理程序、qemu 模拟器、kvmis 甚至是轻量级容器创建虚拟机的大型项目。
Liblxc 是一个较小的库和用户空间命令集合,它们的目的之一是帮助内核开发人员快速轻松地测试容器的功能。
因为 “LXC:Linux 容器工具” 是基于 liblxc 编写的,所以我在这里继续使用 liblxc;不过这里完成的操作也能够使用 libvirt 的容器支持轻松完成。
主要元素 1:LSM
在开始之前,如果不太了解 LSM,现在可以快速浏览一下。根据 Wikipedia 中的定义:Linux Security Modules (LSM) 是一个允许 Linux 内核支持各种计算机安全模型的框架,同时也避免依赖于特定安全实现。这个框架由 GNU General Public License 条款授权使用,并且是 Linux 2.6 之后的 Linux 内核的标准部分。设计 LSM 的目的是为成功实现强制访问控制模块提供一切必要元素,同时最小化对 Linux 内核的更改。LSM 避免了 Systrace 中的系统调用插入,因为它不支持多处理器内核,并且容易受 TOCTTOU (race) 攻击。相反,当某个用户级别的系统将要访问重要的内部内核对象(比如 inode 和任务控制块)时,LSM 将在内核中插入 “钩子(hook)”(向上调用模块)。这个项目专门用于解决访问控制问题,以避免对主流内核进行大量的复杂修改。该项目并不打算成为通用的 “钩子” 或 “向上调用” 机制,也不支持虚拟化。LSM 访问控制的目标与解决系统审计问题密切相关,但又有所区别。审计要求记录每次访问尝试。LSM 不能解决这个问题,因为这需要大量的钩子,以检测内核 “短路” 故障系统在什么地方发出调用,并在接近重要对象时返回错误代码。
系统安全包括两个有些冲突的目标。第一个目标是实现完整的细粒度访问控制。必须对有可能泄露或损坏信息的位置实施控制。过于粗粒度的控制和不进行控制没有区别。例如,如果必须将所有文件归为一种类型,并且有任何一个文件是公开的,则所有文件都是公开的。
另一方面,配置必须简单,否则管理员就需要管理很多访问(但是再次强调,这和不进行控制是一样的)。例如,如果使程序正常工作需要大量访问规则,那么管理员就会为程序添加许多访问权限,而不是测试这些访问规则是否有必要。
Linux 中的两个基本安全模块使用不同的方法来平衡这个矛盾。
SELinux 首先对所有东西实施控制,同时使用强大的策略语言简化策略的管理。
Smack 主要提供简单的访问控制。
主要元素 2:SELinux
到目前为止,SELinux 是针对 Linux 的最有名的 MAC 系统(强制访问控制)。尽管仍然有人反对它,但流行的 Fedora? 发行版从几年前开始就和 SELinux 一起部署,这是它取得成功的有力证明。
SELinux 使用模块化策略语言配置,因此用户可以轻松更新已安装的策略。这种语言还提供一些接口,允许使用更高级的语句表达一组低级的语句。
在本文中,我们将使用一个新的接口来定义容器。虽然为容器添加许多访问权限使接口本身变得非常大,但是使用接口创建新的容器却很简单。这个接口很有希望成为核心发布策略的一部分。
主要元素 3:Smack
Smack 是简化的强制访问控制内核(Simplified Mandatory Access Control Kernel)的缩写。它首先使用简单的文本标签标记所有进程、文件和网络流量。使用创建进程的标签创建最新的文件。通常存在一些带有明确定义的访问规则的默认类型。进程常常可以对具有同一标签的对象进行读写。绕过 Smack 访问规则的特权由 POSIX 功能控制,因此带有 CAP_MAC_OVERRIDE 的任务可以覆盖规则;带有 CAP_MAC_ADMIN 的任务可以更改规则和标签。“POSIX file capabilities: Parceling the power of root”(参考资料)演示了这些特权。