Landlock:Linux 应用沙箱简介 (Landlock: An Introduction to Linux Application Sandboxing)
Landlock 是 Linux 内核中的一个 API,允许应用程序明确声明其被允许访问的资源。它的设计理念类似于 OpenBSD 的 unveil() 和 pledge():程序可以与内核建立契约,声明“我只需要这些文件或资源——如果我被攻破,请拒绝我访问其他资源。”Landlock 提供了一种简单易用的方法,为应用程序增加纵深防御,相比传统的 Linux 安全机制,它更容易理解和集成。
工作原理 (How it Works)
Landlock 是一个 Linux 安全模块 (LSM),自 Linux 5.13 起可用。它采用 瞬时 限制:策略在运行时创建,应用于当前线程及其后续子线程,并在进程退出时消失。与 SELinux 或 AppArmor 等 MAC 框架不同,Landlock 不需要对文件进行标记或添加扩展属性,应用程序动态创建策略。
Landlock 策略由两部分组成:
- 处理的访问:您希望限制的操作类别(例如,文件系统读/写)。
- 访问授权:明确允许这些操作的对象的列表。
例如,您可以创建一个策略,处理所有文件系统读/写和网络绑定,并授权:
- 对
/home/user 目录的只读访问权限。
- 对
/tmp 目录的读/写访问权限。
- 绑定到端口
2222 的权限。
应用程序通过调用 landlock_restrict_self() 进入受限域。从那时起,该线程的子线程和子进程将受到永久约束。限制无法撤销。
策略可以分层(最多 16 层)。子层可以进一步 减少 访问权限,但不能重新引入父层删除的权限。例如,子线程可以添加一层到此策略,以限制其仅读取 /home/user 目录,但它无法重新获得绑定到端口 2222 的权限。
Landlock 不要求特权,任何应用程序都可以自行进行沙箱化。它还使用 ABI 版本控制,允许程序在较旧的内核上应用最佳效果的沙箱化,即使缺少较新的功能。
Landlock 也是一个可堆叠的 LSM,可以与 SELinux 或 AppArmor 结合使用,作为补充层。
为什么使用 Landlock (Why Use It?)
当应用程序需要一组可预测的文件或目录时,Landlock 表现出色。例如,Web 服务器可以限制其仅访问 /var/www/html 和 /tmp 目录。
与 SELinux 或 AppArmor 不同,Landlock 策略不需要管理员参与或系统范围内的配置。开发人员可以将策略直接嵌入到应用程序代码中,使沙箱化成为开发过程的自然组成部分。
由于 Landlock 使用无需特权,因此将其添加到大多数程序非常简单。Rust、Go 和 Haskell 等语言都提供了绑定,并且有几个项目提供类似于 unveil 的用户友好的包装器。
当前状态与意义 (Current State and Significance)
Linux 的普及带来了针对桌面用户的恶意软件数量的增加。虽然 Linux 历史上一直相对安全,但这是由于市场份额较小和与 Windows 相比更高的技术门槛,而不是 Linux 本身更安全。
Landlock 填补了一个重要的空白:一种简单、自包含且无需特权的沙箱化工具。它可以应用于长时间运行的特权系统守护程序,处理二进制格式的桌面应用程序(如 PDF 阅读器、图像查看器、Web 浏览器和文字处理器),以及 FTP 和 HTTP 服务器。
正在进行的工作 (Ongoing Work)
以下是一些正在积极开发中的有前景的功能:
- 监督模式 (Supervise Mode):允许用户空间的“监督者”交互式地允许或拒绝访问,类似于 Android 风格的权限提示。
- 套接字限制 (Socket Restrictions):对进程可以使用哪些类型的套接字或端口进行细粒度控制。
- LANDLOCK_RESTRICT_SELF_TSYNC:确保限制传播到进程中的所有线程。
- LANDLOCK_ADD_RULE_QUIET:允许抑制某些对象的审计消息。
- LANDLOCK_ADD_RULE_NO_INHERIT:防止规则意外地从父目录继承权限,从而实现更精细的文件系统控制。
总结 (TL;DR)
Landlock 是 Linux 的一种简单、无需特权、默认拒绝的沙箱机制。它易于理解、易于集成,并且在提高桌面和应用程序安全方面具有巨大的潜力。建议在您的应用程序中尝试使用它。