使用 Smack 和 SELinux 增强轻量级容器

本文介绍了构建受 LSM 保护的容器所需的工具,但还有很多工作需要做:

对于 Smack,必须选择需要标记为 host 的文件。

对于 SELinux,应该对其进行调优,然后将一个 container 接口放置到上游引用策略。

尽管这些工作正在进行当中,在获得更多关于受 LSM 保护的容器的经验之前,您不应该完全信赖这些机制来阻止不可信的根用户。

尽管目前在创建容器方面还没有最佳实践,但仍然有一些想法是值得考虑的。首先,记住您正试图实现两个有些矛盾的目标:最小化容器(以及主机)之间的复制,同时需要确保安全隔离。实现这些目标的方法之一是,创建一个最小的完整 rootfs,其中不运行任何容器,并且将它的类型标记为所有容器都可以读取的类型。然后使用 lxc-sshd 脚本的定制版本创建每个基于原型的实际容器,以为容器的大部分文件系统创建只读装载,同时为容器提供一个可以存储文件的私有可写位置(比如 /scratch)。由于每个容器都有一个私有的装载名称空间,所以它能够绑定装载任何私有的和/或对于其私有共享目录可写的文件或目录。例如,如果它需要一个私有 /lib,则可以执行 mount --bind /scratch/rootfs/lib /lib。同样地,管理员也能确保每个容器都在启动时执行 mount --bind /scratch/shadow /etc/shadow。

对于 SELinux 和 Smack,我演示的这个方法的一个明显缺点就是容器管理员不能在自己的容器的内部利用 LSM 控制信息流。并且为简单起见,容器中的所有任务都使用 MAC 策略统一处理。在另一篇文章中,我将探讨如何允许容器管理员指定自己的 LSM 策略,同时又能够约束它们。

安全 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 不能解决这个问题,因为这需要大量的钩子,以检测内核 “短路” 故障系统在什么地方发出调用,并在接近重要对象时返回错误代码。

相关推荐