使用 Firejail 和其他工具构建 Linux 沙箱教程

使用 Firejail 和其他工具构建 Linux 沙箱教程

Linux 中的沙箱技术依赖于命名空间、seccomp-BPF、MAC 和 chroot 来隔离进程并限制漏洞的影响。

Firejail 提供了一种轻量级且简单的方法来限制桌面和服务器应用程序,并提供预定义的配置文件和高级选项。

Bubblewrap、Flatpak、AppArmor、SELinux 和 Kata Containers 等工具扩展了更复杂场景下的隔离可能性。

将内存安全与沙箱技术相结合,如 Fil-C 和 OpenSSH 方法那样,可以为关键应用程序提供纵深防御。

在 Linux 上保护您的应用程序。 如果你经常浏览充斥着恶意广告的网站、运行不受信任的二进制文件或管理暴露在互联网上的服务,那么采取安全措施几乎是必须的。虽然 Linux 本身已经是一个相当强大的系统,但现实情况是,如果你没有对浏览器、媒体播放器或任何网络客户端进行适当的隔离,它们都可能成为恶意软件、加密劫持或数据窃取的完美入口。

本教程将完整介绍…… Linux 系统中的沙箱技术,例如 Firejail、Bubblewrap、AppArmor 等工具以及内核技术。 您将了解进程隔离的真正工作原理,系统使用的安全机制(命名空间、seccomp-BPF、chroot、资源限制等),以及如何将它们实际结合起来,最大限度地降低潜在攻击的影响。我们的目标是让您在学习完本课程后,对进程隔离有清晰的理解,掌握可直接使用的示例,并为提升桌面和服务器应用程序的安全性奠定坚实的基础。

相关文章:如何在 Linux 上使用 Firejail 来隔离和保护应用程序

Linux 中的沙箱是什么?为什么要使用它?

当我们谈到Linux中的沙箱时,我们指的是 在受限环境下运行程序它与系统的其余部分隔离,这样,如果出现问题(漏洞利用、恶意软件、网站上的恶意脚本等),损害就会被限制在该“沙箱”内,不会轻易影响操作系统的其余部分、您的文档或其他服务。

这种方法对于以下情况尤其有用: 高曝光应用例如网页浏览器、电子邮件客户端、即时通讯应用、BT下载程序、媒体播放器或可通过互联网访问的网络服务。在所有这些情况下,它们处理不受信任内容的风险都极高,因此为它们设置多层保护措施是明智之举。

在 Linux 系统中,现代沙箱主要基于 原生内核机制: Linux 命名空间访问控制策略(MAC),例如 AppArmor 或 SELinux、seccomp-BPF 过滤器、setrlimit 限制、chroot 以及以非特权用户身份执行。Firejail、Bubblewrap、Flatpak 等工具,甚至 Docker 等容器系统都依赖于这些基本构建模块。

同样重要的是要明白这一点: 内存安全和沙盒是截然不同但又互补的概念。程序可以用内存安全的语言编写(或者通过运行时环境防止常见的 C/C++ 错误),但如果它拥有对文件系统和所有系统调用的完全访问权限,一旦遭到入侵,仍然会很危险。反之,隔离在沙箱中的程序也可能存在内存漏洞,这些漏洞可能被内部人员利用。真正的安全在于将这两种方法结合起来。

Firejail:最流行的桌面应用程序沙箱

Firejail 可能是 Linux桌面上最知名的沙盒工具它使用 C 语言编写,是一个 SUID 位可执行文件,它依靠命名空间、seccomp-BPF 和其他内核特性,在要运行的程序周围创建一个隔离的环境。

它的最大优点是 它非常轻便,而且易于使用。在沙箱环境中运行应用程序的速度几乎与正常执行速度相同;它不会在系统启动时添加驻留进程,并且依赖项极少。实际上,它仅在您通过沙箱启动应用程序时才会消耗资源,因此即使是配置一般的机器也适用。

此外,Firejail 还附带 为 300-1000 多个常用应用程序预定义了配置配置文件。 (取决于您查看的版本):浏览器(例如 Firefox 和 Chromium)、VLC、Transmission、PDF 阅读器、文本编辑器等等。这些配置文件指定了每个程序可以访问文件系统的哪些部分、拥有哪些权限、是否可以使用声音、拥有哪些网络访问权限等等。

你也可以使用 Firejail。 服务器程序和终端工具例如,可以对 Apache Web 服务器或监听特定端口的自定义服务进行限制。其模型始终相同:进程在一组命名空间和限制条件下运行,从而限制安全漏洞的影响。

Firejail 的技术工作原理

为了让火狱升起它的牢笼,它大量使用了…… Linux 命名空间此功能从内核版本 2.6.23 开始引入,并已扩展到提供各种类型的隔离:PID、网络、用户、挂载点、UTS(主机名)、IPC 等。每个命名空间封装了一组资源,因此共享同一命名空间的进程看到的现实与命名空间外的进程看到的现实不同。

换句话说,一个以 Firejail 为起点的程序 它看不到相同的文件系统、进程表、网络协议栈或主机名。 它并非使用系统的全部内容,而是根据当前使用的配置文件,使用经过筛选或部分组装的版本。这是许多容器技术(例如 Docker)的基础,也是其高效的主要原因。

Firejail 通过以下方式补充命名空间 文件系统上的访问控制(MAC)策略通过这些规则,您可以设置程序只能访问您主目录下的特定子目录,例如“下载”文件夹或应用程序的特定配置文件夹,同时阻止其访问其他目录。许多默认配置文件已经包含完善的规则,允许程序在不随意访问磁盘空间的情况下正常运行。

另一个重要的层面是 seccomp-BPF这种机制允许将系统调用(syscall)过滤器与进程关联起来。过滤器使用伯克利数据包过滤器(BPF)进行描述,定义了哪些系统调用是允许的以及允许哪些参数;任何其他调用都会导致内核终止进程或返回错误。Chrome 等浏览器和 Docker 等容器系统也利用这种技术来限制运行代码的功能。

在 Docker 中创建多架构镜像并发布 AMD64 和 ARM64 的清单文件最后,Firejail 可以 与 AppArmor 和 SELinux 共存这些 MAC 系统在内核级别工作,以限制对文件、套接字、功能等的访问。Firejail 增加了一层隔离:它不仅决定应用程序可以访问哪些资源,而且还将其划分为命名空间,这样即使几个具有类似权限的应用程序也不一定需要看到或操作彼此。

安装 Firejail 及其图形界面 Firetools

在大多数 GNU/Linux 发行版中,Firejail 它没有预装,但可以在官方软件仓库中找到。在 Debian、Ubuntu 及其衍生发行版中,只需使用 APT 即可将其集成到系统中,无需任何额外的依赖项或额外的后台服务。

要安装 Firejail 基础软件包,您可以运行:

sudo apt-get install firejail

只需执行这一个命令,你就能拥有 您需要在终端中使用 Firejail 的一切信息无需修改配置文件即可开始;只需掌握几个基本命令,您就可以开始部署您的第一个应用程序。

如果你想要一个 更加用户友好的图形界面 要启动和配置应用程序,您还可以安装 Firetools,它就像一个启动器,在系统托盘中有一个图标,并带有一个安装向导。

sudo apt-get install firetools

安装完成后,您将在应用程序菜单中看到两个新条目:一个是包含启动器的托盘,另一个是…… Firejail 配置向导一个分步向导,可让您选择应用程序,决定是使用默认配置文件还是自定义配置文件,并调整目录、声音、网络和其他内核保护的权限。

从终端使用 Firejail:基础知识及更多

Firejail 最典型的用途是 将 firejail 命令添加到可执行文件中。 您想要隔离的进程。如果该程序有预定义的配置文件,则会自动应用;否则,将使用通用配置加上您通过命令行添加的任何配置。

例如,要在沙盒环境中打开 Firefox,命令如下:

firejail firefox

请注意,在 Ubuntu 22.04 及更高版本等发行版中,Firefox 通常以 Snap 软件包的形式提供,因此 此命令可能无法直接运行。在这种情况下,您需要使用 APT 打包的版本,或者将配置文件调整为实际运行的二进制文件的正确路径。

其他桌面应用程序的情况也类似。一些常见的例子包括:

firejail gedit

firejail evince

firejail vlc

firejail transmission-gtk

当这些应用程序处于打开状态时,如果您查看资源监视器,您会发现 每个进程都显示为 firejail 进程的子进程。要查看沙箱中任何给定时间正在运行的完整进程树,您可以使用:

firejail --tree

如果您想探索所有支持的选项(有很多选项,例如网络、X11、带宽、自定义配置文件等等),您可以使用以下常用选项:

firejail --help

Firejail 配置配置文件:它们的位置以及如何访问它们

Firejail真正的力量源于它的 配置配置文件每个配置文件都描述了如何隔离特定程序:哪些目录挂载为只读或读写,是否有权访问用户文件夹,是否允许 3D 加速,是否可以访问互联网,使用哪个 DNS,是否监听声音服务器等等。

系统的全局配置文件通常存储在 /etc/firejail/要查看计算机上可用的完整列表,您可以运行:

ls /etc/firejail/

每个带有扩展名的文件 。轮廓 定义程序的规则。例如,如果您想修改默认的 Firefox 配置文件,可以使用您喜欢的文本编辑器,并以管理员权限运行该编辑器进行编辑:

sudo nano /etc/firejail/firefox.profile

在里面你会找到控制 Firejail 的指令。 特殊组件、通道、容量和选项要了解所有可用参数,强烈建议查阅配置文件的具体手册页面:

man 5 firejail-profile

除了修改现有个人资料外,您还可以 为没有自己配置文件的程序创建新的配置文件。在这种情况下,Firejail 通常使用较为宽松的通用配置。如果您想自定义特定应用程序的行为,可以创建一个以其名称命名的配置文件,并参考官方文档和其他用户的示例,根据您的需求进行调整。

用户配置文件:覆盖和扩展标准设置

通常情况下,触碰……并不符合我们的利益。 /etc/firejail 中的系统配置文件无论是为了方便未来的更新,还是因为你想为特定用户创建自己的变体,Firejail 都支持在用户的配置目录中创建配置文件,其中可以包含全局配置文件,并添加或修改规则。

第一步是创建用于存储这些用户配置文件的文件夹:

mkdir -p ~/.config/firejail/

假设你想用 VLC 播放器。 从未接触过互联网 使用 Firejail 打开 vlc.profile 文件时,您可以创建一个名为 vlc.profile 的本地配置文件,该配置文件包含全局配置文件并添加网络限制。为此,请打开该文件:

nano ~/.config/firejail/vlc.profile

然后输入类似以下内容:

include /etc/firejail/vlc.profile

net none

指示 包括 拖动默认的 VLC 设置,下一行代码会添加阻止网络的规则。之后,启动 VLC。 Firejail VLC 它还会使用此用户文件,因此 VLC 将无法访问互联网,只能播放本地内容。

请记住,用户文件夹中的文件名必须 与标准配置文件名称匹配 以便 Firejail 能够正确检测和合并它。

Firejail 高级选项:网络、私有模式和资源

除了个人资料之外,Firejail 还提供了一系列强大的工具。 命令行参数 在每次运行时临时调整沙箱行为,而无需修改配置文件。

Meta 在欧洲推出面部识别技术,以保护账户并打击诈骗例如,您可以 禁用特定应用程序的网络访问 使用 `--net=none` 选项。要以隔离网络模式启动 VLC,只需:

firejail --net=none vlc

另一个非常强大的功能是 私人模式在此模式下,程序运行于临时文件系统 (tmpfs) 中,无法访问您的实际设置或个人文件,并且当您退出沙盒环境时,所有操作都会消失。这非常适合敏感操作,例如访问网上银行、测试可疑网站或运行您不想留下任何痕迹的软件。

一个实际的例子是打开谷歌浏览器。 私有模式和特定 DNS (例如,来自谷歌的那些):

firejail --private --dns=8.8.8.8 --dns=8.8.4.4 google-chrome

在这种情况下,Chrome 会以默认设置启动,不安装任何扩展程序,也不保存浏览历史记录,并将自身隔离在 tmpfs 环境中,同时使用指定的 DNS 服务器。这是一种相当合理的访问敏感网站风险最小化方法。

Firejail 也允许这样做 沙箱内的应用程序使用它们自己的虚拟网络接口使用 macvlan,可以配置独立的内部 IP 地址、ARP 表、防火墙等。例如,您可以使用以下命令在 eth0 接口上启动 Firefox:

firejail --net=eth0 firefox

如果您想为该沙箱分配一个特定的 IP 地址:

firejail --net=eth0 --ip=192.168.1.80 firefox

请记住 此功能目前通常仅限于有线网络。根据您的系统配置和发行版,可能无法在无线接口上运行。

带宽控制和沙箱监控

Firejail 的一个鲜为人知的特性是它能够 限制带宽 限制您在沙箱中运行的应用程序的性能。这非常适合进行性能测试、模拟慢速连接,或者仅仅是为了防止BT客户端占用您全部带宽。

通常的模式包括: 给沙箱命名 然后从另一个终端对其进行操作。例如,在连接到 eth0 的名为 browser 的沙箱中启动 Firefox:

firejail --name=navegador --net=eth0 firefox

在另一个终端中,您可以使用 –bandwidth 选项设置上传和下载限制,指定沙箱名称、接口和值(单位为 KB/s):

firejail --bandwidth=navegador set eth0 80 20

基于这些参数, Firefox 的下载速度将被限制为 80 KB/s,上传速度将被限制为 20 KB/s。如果您之后想要解除这些限制,可以使用以下命令清除带宽规则:

firejail --bandwidth=navegador clear eth0

随时知晓 Firejail 内运行着哪些应用程序?`-list` 命令显示进程 ID、用户及其关联程序的列表:

firejail --list

如果你感兴趣的是 查看资源消耗 每个活动沙箱的(内存、CPU、进程数)资源可供您使用:

firejail --top

进入一个现有的沙箱环境,并默认使用 Firejail。

有些情况你可能会感兴趣。 从运行中的沙盒内部进行访问例如,您可以检查网络配置、查看已挂载的路由或执行管理任务。Firejail 允许您使用 `--join` 选项,通过指定进程的 PID 加入特定的沙箱。

例如,如果在出口处 火狱列表 您可以看到 Firefox 的进程 ID 为 5394,您可以使用以下命令进入其沙盒:

sudo firejail --join=5394

Firejail 本身会负责切换到 jail 内的第一个子进程,并将你留在隔离环境中的 root shell 中,你可以从中运行所需的检查。

另一个非常实际的可能性是 将 Firejail 设置为启动任何具有可用配置文件的程序的默认方式为此,您可以使用 firecfg 命令,该命令会在 /usr/local/bin 中为每个具有配置文件的应用程序创建指向 /usr/bin/firejail 的符号链接。

sudo firecfg

从现在开始,每次您从列表中启动程序(通过图形菜单或终端),它都会自动在沙盒中启动。如果您想恢复此设置,只需删除在以下位置创建的符号链接即可: 在/ usr / local / bin目录.

如果您希望仅将此行为应用于一个 具体应用您可以自行创建符号链接。例如,要让 Firefox 始终使用 Firejail:

sudo ln -s /usr/bin/firejail /usr/local/bin/firefox

如果您想停止自动为该程序使用 Firejail,只需删除 /usr/local/bin 中的相应符号链接即可。

备选图形服务器:Xpra 和 Xephyr(带 Firejail)

对X11机型的经典批评之一是: 它无法很好地隔离图形应用程序。这使得键盘记录器、屏幕截图和其他跨窗口监视技术有机可乘。Firejail 试图通过允许应用程序在其他图形服务器上运行来缓解部分此类问题。

具体来说,你可以使用 Xpra 和 Xephyr 将程序配置为独立的 X 服务器,这样被隔离的程序就不会与桌面其他程序共享同一个 X 服务器。首先,您需要在系统上安装相应的软件包:

sudo apt-get install xpra xserver-xephyr

然后,您可以使用 `-x11` 选项指定要使用的 X 服务器来启动应用程序。例如,要在没有网络连接的情况下使用 Xephyr 启动 VLC:

firejail --x11=xephyr --net=none vlc

如果您希望应用程序在 Xpra 上运行,命令类似,只需更改参数即可:

firejail --x11=xpra --net=none vlc

通过这一方案, 你让键盘记录器和屏幕截图用户的日子更难过了。 他们会试图监视你在该特定应用程序中的操作,因为它与自己的图形服务器保持“连接”,独立于桌面的其他部分。

Linux 中其他沙箱方案:Bubblewrap、Flatpak、AppArmor 和容器

虽然 Firejail 对桌面用户来说非常方便,但 Linux 生态系统中还有更多面向桌面环境的工具。 隔离进程和应用程序没有一种方法是完美的,每种方法都有其优点和缺点,但了解它们有助于在每种情况下选择最佳方法。

气泡膜是一种专注于……的替代品 提供极简的沙盒运行时与大型 setuid 工具相比,Bubblewrap 更简洁,攻击面更小。虽然它的直接配置比 Firejail 更复杂,但许多现代解决方案都在底层使用了它。与 Firejail 不同,Bubblewrap 的设计理念是尽可能避免使用 SUID,从而降低潜在内部漏洞的影响。

Windows、Linux 和 macOS 中验证总和或哈希值的方法像Bubblewrap这样的项目就是建立在此基础上的。 泡泡监狱其目标是通过纠正 Firejail 的一些组织缺陷(例如更一致的配置文件、更清晰的配置等)来提供更友好的用户体验。缺点是它是一款鲜为人知的工具,开发者群体也比较小。 它没有经过充分的审计或实战检验。 以及其他更受欢迎的选择。

另一方面是 Flatpak它被广泛用于分发隔离的桌面应用程序。尽管它依赖于沙箱技术(命名空间、门户、声明式权限等),但许多专家指出, 要配置它而不留下缝隙并非易事。此外,它仅适用于以 Flatpak 格式打包的应用程序,因此如果您的程序不是这种格式,则它对您不起作用。

在 MAC 策略领域, AppArmor 和 SELinux 它们允许您定义非常精细的规则,规定每个程序可以使用哪些文件、套接字、容量和资源。理论上,它们功能强大,通常比用户自定义的解决方案提供更高的安全性,但它们也存在同样的问题: 正确设置它们很复杂。为每项服务创建完善的配置文件需要时间、经验和持续维护。

在云和 Kubernetes 环境中,一个非常有趣的替代方案是: 基于轻量级虚拟机的容器例如,Red Hat OpenShift 将其集成为可选的符合 OCI 标准的运行时环境 Kata Containers。在这种模式下,每个工作负载都在轻量级虚拟机中运行于其自身隔离的内核上,从而提供…… 额外的隔热层 除了通常的命名空间划分之外,还有一个运行环境需要运维人员负责在集群内安装、管理和更新。

内存安全 + 沙箱:Fil-C 方法和 OpenSSH 案例

除了桌面系统之外,许多关键应用程序也运行在服务器上(例如……)。 OpenSSH的 或SaaS平台的组件)受益于组合 内存安全和深度沙箱这正是 Fil-C 等项目发挥作用的地方,它们提出了一种安全的 C/C++ 实现,能够与 Linux 的原生机制很好地共存。

Linux 上的 OpenSSH 已经使用了多种隔离技术: chroot(创建一个 chroot 笼) 限制对文件系统的访问,限制进程以非特权用户和组的身份执行,限制使用 设置限制 限制资源(打开文件、创建进程等)和过滤器 seccomp-BPF 它只允许执行一部分受控的系统调用;其他所有操作都会导致进程终止。

像Fil-C这样的运行时面临的挑战是 在不违反计划的前提下适应这些限制。例如,如果垃圾回收器需要后台线程,则必须确保在激活沙箱之前创建所有这些线程,并且 seccomp 过滤器安装在所有这些线程上,而不仅仅是主线程上,还要遵守 PR_SET_NO_NEW_PRIVS 和 PR_SET_SECCOMP 等设置。

Fil-C 提供以下功能 zlock_runtime_threads()这些措施强制在激活沙箱之前初始化所有必要的线程,并在之后阻止创建新线程,从而确保在整个过程中始终如一地应用限制。它还要求 seccomp过滤器中的一些细微例外例如,在 mmap 中启用 MAP_NORESERVE 或 sched_yield 系统调用,这些都是内部运行时管理所必需的。

这类工作表明: 可以将内存安全环境、严格沙箱和高优先级应用程序结合起来。 就像 OpenSSH 一样,它既能实现类似的功能,又不会牺牲兼容性或性能。Chrome 和 Mozilla 的开发者多年来一直在记录类似的 Linux 沙箱实践,为强大的纵深防御树立了标准。

实际应用案例:保护您的浏览和日常生活

所有这些都可以转化为任何 Linux 用户非常日常的场景。例如,当你访问 种子网站、充斥着弹出窗口的下载网站、色情网站或包含可疑链接的门户网站遇到加密劫持脚本、恶意广告或指纹识别攻击的概率相当高。

一个简单的测量方法包括: 使用 Firejail 限制浏览器访问 每次遇到这种麻烦事时,请使用以下命令启动浏览器:

firejail chromium &

好吧:

firejail firefox &

它能让你更加安心。末尾的 & 符号可以防止浏览器在你意外关闭终端时仍然保持打开状态。如果你将它与本地网络上的 Pi-hole 之类的解决方案,或者脚本和挖矿拦截扩展程序结合使用, 你大大缩小了攻击面。 浏览可疑网站时。

Firejail 的隐私模式、阻止访问敏感文件夹的配置文件,以及为用于网上银行的浏览器使用受控 DNS,这些看似不起眼的小决定,加在一起却能起到关键作用。 它们决定了是会造成严重的惊吓还是只是轻轻合上睫毛。.

从整体来看,Linux 沙箱并非万能灵药,但如果懂得如何组合运用,它却是一个极其强大的工具:日常使用可以使用 Firejail 及其配置文件;需要更严格控制的环境可以使用 Bubblewrap 和 Flatpak;关键服务可以使用 AppArmor/SELinux 和 seccomp-BPF;构建更复杂的基础设施时,可以使用 Kata Containers 或 Fil-C 等内存安全运行时等技术。归根结底,关键在于构建多层架构,即使其中一层出现故障,其他层也能正常运行。 其余部分将继续确保您的系统安全。.

艾萨克对字节世界和一般技术充满热情的作家。我喜欢通过写作分享我的知识,这就是我在这个博客中要做的,向您展示有关小工具、软件、硬件、技术趋势等的所有最有趣的事情。我的目标是帮助您以简单而有趣的方式畅游数字世界。

相关推荐