Firejail

出自 ArchWiki

Firejail 是一个易于使用的 Setuid 沙盒程序,它通过使用 Linux 命名空间、seccomp-bpf 和 Linux 功能来限制不受信任的应用程序的运行环境,从而降低安全漏洞的风险。

警告: 运行不受信任的代码永远是不安全的,沙盒化无法改变这一点。

安装

安装 firejailfirejail-gitAUR 软件包。还有一个用于 Firejail 的 GUI 应用程序可用,firetools

注意: 有关 Arch Linux 内核中 user_namespaces(7) 支持的信息,请参阅 Security#沙盒化应用程序即使禁用,Firejail 也可以使用它
警告: 虽然上游正在逐步采用白名单(参见 /etc/firejail/firefox.profile),但大多数提供的配置文件仍然严重依赖黑名单。这意味着配置文件中未明确禁止的任何内容都将可供应用程序访问。例如,如果您的 /mnt/btrfs 中有 btrfs 快照可用,则受限程序可能被禁止访问 $HOME/.ssh,但仍然能够访问 /mnt/btrfs/@some-snapshot/$HOME/.ssh。请务必审核您的配置文件;请参阅 #测试配置文件

配置

大多数用户不需要任何自定义配置,可以直接进行到 #用法

Firejail 使用配置文件为在其中执行的每个应用程序设置安全保护 - 您可以在 /etc/firejail/application.profile 中找到默认配置文件。如果您需要未包含的应用程序的自定义配置文件,或希望修改默认设置,您可以将新规则或默认设置的副本放在 ~/.config/firejail 目录中。您可以为单个应用程序拥有多个自定义配置文件,并且可以在多个应用程序之间共享同一配置文件。

如果 firejail 没有特定应用程序的配置文件,它将使用其限制性的系统范围默认配置文件。这可能会导致应用程序无法按预期运行,除非首先创建自定义且限制性较低的配置文件。

请参阅 firejail-profile(5)

用法

要使用 firejail 为该应用程序提供的默认保护(默认配置文件)执行应用程序,请执行以下操作

$ firejail program_name

可以作为命令行选项添加对默认配置文件的一次性添加(请参阅 firejail(1))。例如,要使用 seccomp 保护执行 okular,请执行以下操作

$ firejail --seccomp okular

您可以为一个程序定义多个非默认配置文件。创建配置文件后,您可以通过执行以下命令使用它

$ firejail --profile=/absolute/path/to/profile program_name

默认使用 Firejail

要为所有具有配置文件的应用程序默认使用 Firejail,请使用 sudo 运行 firecfg 工具

$ sudo firecfg

这将为 Firejail 具有默认或自行创建配置文件的程序在 /usr/local/bin/ 中创建指向 /usr/bin/firejail 的符号链接。请注意,firecfg(1) 仅符号链接 /etc/firejail/firecfg.config 中列出的程序。某些 CLI 程序不存在,例如:tarcurlgit。这些需要手动符号链接。请参阅 配置文件不在 firecfg #2507 以了解为什么未包含它们。firecfg 还会将当前用户添加到 Firejail 用户访问数据库,并检查 /usr/share/applications/*.desktop 文件是否包含相应可执行文件的完整路径,删除完整路径并将其复制到 ~/.local/share/applications/。这确保了将使用 /usr/local/bin/ 中的符号链接,从而防止 Firejail 被绕过。如果您的系统上未安装 sudo,则应执行

# firecfg

作为 root 用户,以及

$ firecfg --fix

作为用户,以修复 .desktop 文件。

在某些情况下,您可能需要手动修改 ~/.local/share/applications/.desktop 文件的 Exec= 行以显式调用 Firejail。

提示: 可以使用 pacman hookpacman 操作时自动运行 firecfg
/etc/pacman.d/hooks/firejail.hook
[Trigger]
Type = Path
Operation = Install
Operation = Upgrade
Operation = Remove
Target = usr/bin/*
Target = usr/share/applications/*.desktop

[Action]
Description = Configure symlinks in /usr/local/bin based on firecfg.config...
When = PostTransaction
Depends = firejail
Exec = /bin/sh -c 'firecfg >/dev/null 2>&1'

要手动映射单个应用程序,请执行

# ln -s /usr/bin/firejail /usr/local/bin/application
注意
  • /usr/local/bin 必须在 环境变量 PATH 中设置在 /usr/bin 之前。默认的 Arch Linux /etc/profile 脚本满足此前提条件 [1]
  • 要使用自定义 Firejail 设置运行符号程序,只需如 #用法 中所示添加 firejail 前缀即可。
  • 对于守护程序,您需要覆盖该守护程序的 systemd 单元文件以调用 firejail,请参阅 systemd#编辑提供的单元
  • 指向 gzipxz 的符号链接会干扰 makepkg 预加载 libfakeroot.so 的能力。请参阅 BBS#230913

与 hardened_malloc 一起使用

注意: 某些程序在使用 libhardened_malloc.so 时将无法工作,例如 PyCharm、Firefox。

hardened_mallocAUR 是 glibc 的 malloc() 分配器的强化实现,最初为 Android 编写,但已扩展到桌面使用。虽然尚未集成到 glibc 中,但可以与 LD_PRELOAD 选择性地使用它。以下演示了在 firejail 中使用 hardened_malloc 启动应用程序的正确方法。要使其永久生效,您需要在 /usr/local/bin/ 中为所需的应用程序创建自己的条目。

$ firejail --env=LD_PRELOAD='/usr/lib/libhardened_malloc.so' /usr/bin/firefox

或者,将以下内容添加到自定义配置文件

env LD_PRELOAD=/usr/lib/libhardened_malloc.so

具有 private-lib 的配置文件将需要在自定义配置文件中包含以下内容

private-lib /lib/libhardened_malloc.so

可以在 hardened_malloc 的 github 页面上找到可用于调整 hardened_malloc 的各种环境变量和设置。

启用 AppArmor 支持

自 0.9.60-1 起,Firejail 通过通用的 AppArmor 配置文件支持与 AppArmor 更直接的集成。在安装过程中,配置文件 firejail-default 被放置在 /etc/apparmor.d 目录中,并且需要通过以 root 身份运行以下命令加载到内核中

# apparmor_parser -r /etc/apparmor.d/firejail-default

请参阅 firejail(1) § APPARMOR

通过编辑文件 /etc/apparmor.d/local/firejail-local 支持对 apparmor 配置文件的本地自定义

AppArmor 已为 大量 Firejail 配置文件启用。有几种方法可以在 Firejail 安全配置文件之上启用 AppArmor 限制

  • 在命令行中将 --apparmor 标志传递给 Firejail,例如 $ firejail --apparmor firefox
  • 使用自定义配置文件并添加 apparmor 命令。
  • /etc/firejail/globals.local 中全局启用 Apparmor,并在 /etc/firejail/ProgramName.local 中使用 ignore apparmor 根据需要禁用。

请注意,通过上述方法启用 AppArmor 始终 意味着使用 /etc/apparmor.d/firejail-default。如果您希望为应用程序使用特定的 AppArmor 配置文件,则必须使用上述 ignore apparmor 命令。但是,不建议这样做,因为对同一应用程序同时使用 Firejail 和 AppArmor 通常会产生问题。

验证 Firejail 是否正在使用

$ firejail --list

更全面的输出由以下命令生成

$ firejail --tree

创建自定义配置文件

白名单和黑名单

黑名单 拒绝访问特定的文件或目录。未添加到黑名单的所有其他文件和目录都不会更改。

  • 拒绝访问目录或文件:blacklist <directory/file>
  • 忽略后面出现的 blacklist 行:noblacklist <directory/file>

它们在配置文件中出现的顺序很重要:noblacklist 指令必须添加到 blacklist 指令之上

白名单 阻止同一“顶层目录”下的所有内容,即未明确列入白名单的内容。这意味着,如果您将例如 /etc/something 列入白名单,则此文件将可访问,但例如,如果还有另一个文件 /etc/something_else,则该文件将不可访问。在 Firejail 中,“顶层目录”是指,如果列入白名单的文件的路径例如是 /etc/somedir/somefile,则顶层目录将是 /etc。所有其他顶层目录,如 /opt/usr 等,均未更改,因此其中的所有文件仍然可访问,除非其中的文件或目录也列入白名单。

  • 允许访问目录或文件并禁止“顶层目录”中的所有其他内容:whitelist <directory/file>
  • 忽略后面出现的 whitelist 行:nowhitelist <directory/file>

它们在配置文件中出现的顺序很重要:nowhitelist 指令必须添加到 whitelist 指令之上

配置文件编写

基本流程是

  1. /usr/share/doc/firejail/profile.template 复制到 /etc/firejail/~/.config/firejail/ 并将其重命名为 ProfileName.profile,其中 ProfileName 应与要沙盒化的可执行文件的名称匹配
  2. 将行 include PROFILE.local 更改为 include ProfileName.local
  3. 逐步注释/取消注释各种选项,同时在每个阶段检查应用程序是否在新沙箱内运行。不要更改该模板中各节的顺序。
  4. Firejail 配置文件的可能选项的详细说明可以在 firejail-profile(5) 手册页中找到
  5. 测试配置文件的安全漏洞,请参阅 #测试配置文件

如果要创建白名单配置文件(即包含 whitelist 指令的配置文件),您可以构建允许位置的白名单,方法是执行

$ firejail --build application

请记住,白名单配置文件对于需要访问随机位置的应用程序(如文本编辑器或文件管理器)来说是有问题的。

注意
  • 目的是尽可能严格,同时仍保持可用性。这可能涉及牺牲潜在的危险功能和改变轻率的工作习惯。
  • 默认情况下,seccomp 过滤器在黑名单上工作(可以在 /usr/share/doc/firejail/syscalls.txt 中找到)。可以使用 seccomp.keep 为应用程序构建自定义的过滤器白名单。[2]。自动化这些步骤的便捷方法是执行 /usr/lib/firejail/syscalls.sh。如果应用程序仍然由于缺少系统调用而崩溃,您应该按照 /usr/share/doc/firejail/syscalls.txt 底部的说明进行操作。

持久本地自定义

标准配置文件布局包括通过包含 .local 文件[3] 来进行持久本地自定义的功能。基本上,每个官方支持的配置文件都包含行 include ProgramName.localinclude globals.local。这些 *.local 文件可能位于 /etc/firejail/~/.config/firejail/ 中。由于优先级顺序由首先读取哪个文件决定,这使得本地自定义成为一种非常强大的方式。例如,参考 这个 firejail 问题,要全局启用 Apparmor 并禁用 Internet 连接,可以简单地创建/编辑 /etc/firejail/globals.local 以包含以下行

# enable Apparmor and disable Internet globally
net none
apparmor

然后,要允许例如 "curl" 连接到 Internet,但仍保持其 apparmor 限制,可以创建/编辑 /etc/firejail/curl.local 以包含以下行。

# enable internet for curl
ignore net

由于 curl.localglobals.local 之前读取,因此 ignore net 覆盖了 net none,并且,作为奖励,以上更改将在未来的更新中保持持久性。

测试配置文件

为了测试和审核 Firejail 配置文件,您可能会发现以下内容很有用

  1. firejail --debug $Program > $PathToOutputFile 提供沙箱的详细分解
  2. firejail --debug-blacklists $Programfirejail --debug-whitelists $Program 显示当前配置文件的黑名单和白名单目录和文件。
  3. firejail --debug-caps 提供当前 Firejail 软件版本支持的功能列表。这在构建 caps 白名单时很有用。
  4. firejail --help 获取 --debug 选项的完整列表
  5. firemon PID 监视正在运行的进程。有关详细信息,请参阅 firemon --help
  6. 执行 sudo jailcheck 测试正在运行的沙箱。有关详细信息,请参阅 jailcheck(1) 手册页。
  7. checksec 也可能有助于测试正在使用哪些标准安全功能

Firejail 与 Xorg

本文或本节的事实准确性存在争议。

原因: 为什么沙盒化 X11 需要 DNS?(在 Talk:Firejail 中讨论)

Xorg 上,任何程序都可以监听所有键盘输入并记录所有屏幕。沙盒化 X11 的目的是限制这种行为,这对于处理潜在恶意输入(如浏览器)的复杂程序尤其成问题。

XephyrXpra 允许您沙盒化 Xorg。虽然 Xpra 提供完整的剪贴板支持,但由于嵌套 X11 会话的非常明显且永久的延迟,建议使用 Xephyr。

有关具有(不太理想的)剪贴板支持(剪贴板始终共享)的完整设置,请参阅 Sakaki 的 Gentoo 指南,尤其是关于剪贴板和自动缩放的部分

或者,如果不需要剪贴板支持但需要管理窗口,请安装独立的窗口管理器,例如 Openbox

xephyr-screen WidthxHeight 可以在 /etc/firejail/firejail.config 中设置,其中 WidthHeight 以像素为单位,并基于您的屏幕分辨率。

要打开沙箱

$ firejail --x11=xephyr --net=device openbox

device 是您活动的网络接口,这是确保 DNS 正常工作所必需的。然后右键单击并选择要运行的应用程序。

注意: 如果您使用 UnbounddnsmasqPdnsd 或 127.0.0.1 上的任何其他本地解析器,您应该从命令中省略 --net=device,因为 DNS 应该会自动工作。

有关更简单的指南,请参阅 Firejail Wordpress 网站

根据指南

沙箱用 Xpra 或 Xephyr 服务器替换常规 X11 服务器。这可以防止 X11 键盘记录器和屏幕截图实用程序访问主 X11 服务器。

请注意,声明

禁用抽象套接字 @/tmp/.X11-unix/X0 的唯一方法是使用网络命名空间。如果由于任何原因您无法使用网络命名空间,则抽象套接字在沙箱内仍然可见。黑客可以将键盘记录器和屏幕截图程序附加到此套接字。

是不正确的,可以编辑 xserverrc-nolisten local,这将禁用 X11 的抽象套接字并有助于隔离它。

沙盒化浏览器

Openbox 可以配置为在启动时启动某个浏览器。program.profile/etc/firejail 中包含的相应配置文件,而 --startup "command" 是用于启动程序的命令行。例如,要在沙箱中启动 Chromium

$ firejail --x11=xephyr --profile=/etc/firejail/chromium.profile openbox --startup "chromium"

您可以使用参数控制屏幕大小

--xephyr-screen=400x250

技巧与窍门

强化 Firejail

可以通过添加以下行来缓解 Firejail 作为 SUID 可执行文件的安全风险

force-nonewprivs yes

/etc/firejail/firejail.config。但是,这可能会破坏特定的应用程序。在 Arch Linux 上,VirtualBox 不再启动。使用 linux-hardened 内核,Wireshark 和基于 Chromium 的浏览器也受到影响。

进一步的强化措施包括创建一个特殊的 firejail 组,将用户添加到该组,并更改 firejail 可执行文件的文件模式。有关详细信息,请参阅此处

提示: 您可以添加 pacman hook 以自动更改 firejail 所有者和模式
/etc/pacman.d/hooks/firejail-permissions.hook
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = firejail
[Action]
Depends = coreutils
Depends = bash
When = PostTransaction
Exec = /usr/bin/sh -c "chown root:firejail /usr/bin/firejail && chmod 4750 /usr/bin/firejail"
Description = Setting /usr/bin/firejail owner to "root:firejail" and mode "4750"

确保创建 firejail 组并将您的用户添加到其中。

包含空格的路径

如果您需要在自定义配置文件中引用、列入白名单或列入黑名单目录,例如使用 palemoonAUR,您必须使用绝对路径执行此操作,而无需封装或转义

/home/user/.moonchild productions

私有模式

Firejail 还包括一次性私有模式,其中不会在 chroot 中挂载到您的主目录。这样做,您可以执行应用程序而无需对磁盘进行任何更改。例如,要在私有模式下执行 okular,请执行以下操作

$ firejail --seccomp --private okular

实验性改进工具

一些 Firejail 开发人员意识到了其附带工具的问题,并制作了自己的改进版本。

警告: 正如某些项目描述中所述,这些工具可能是实验性的。

故障排除

Firejail 可能难以调试。配置错误或不合适的设置的症状范围从应用程序中的随机分段错误和挂起到简单的错误消息。

某些应用程序比其他应用程序更难沙盒化。例如,Web 浏览器Electron 应用程序往往比其他应用程序需要更多的故障排除,因为有很多可能出错的地方。务必首先查看 FAQ未解决的问题,因为调试可能需要相当长的时间。

提示: 另请参阅 上游 wiki这篇博客文章,尤其是关于 调试 Firejail 的页面。

移除 Firejail 符号链接

要移除 Firejail 创建的符号链接(例如,重置为默认值)

# firecfg --clean

如果您不想将 Firejail 用于特定应用程序(例如,因为您更喜欢使用 AppArmor 限制它),则必须手动删除相关的符号链接

# rm /usr/local/bin/application

由于后续执行 firecfg 将重新添加已删除的符号链接,因此应在 /etc/firejail/firecfg.config 中注释掉相应的应用程序。

验证 桌面条目 的任何残留是否仍被 Firejail 覆盖。

PulseAudio

注意: 使用 PulseAudio 9.0 或更高版本应该可以解决此问题。

如果 Firejail 导致沙盒化应用程序出现 PulseAudio 问题 [4],可以使用以下命令

$ firecfg --fix-sound

此命令为当前用户创建一个自定义的 ~/.config/pulse/client.conf 文件,其中包含 enable-shm = no 和可能的其他解决方法。

hidepid

如果系统使用 hidepid 内核参数,则 Firemon 只能以 root 身份运行。除其他外,这将导致 Firetools GUI 错误地报告“功能”、“协议”和“Seccomp”状态的问题[5]

专有 Nvidia 驱动程序

一些用户报告在使用 Firejail 和来自 NVIDIA 的专有图形驱动程序时出现问题(例如 [6][7][8])。这通常可以通过禁用应用程序配置文件中的 noroot Firejail 选项来解决。

--net 选项和 Linux 内核 >=4.20.0

firejail 0.5.96 和 linux >= 4.20.0 上存在一个错误,请参阅 [9][10]

错误消息示例

$ firejail --noprofile --net=eth0 ls
Parent pid 8521, child pid 8522
Error send: arp.c:182 arp_check: Invalid argument
Error: proc 8521 cannot sync with peer: unexpected EOF
Peer 8522 unexpectedly exited with status 1

警告:无法使用 AppArmor 限制应用程序

本文或本节是与 #启用 AppArmor 支持 合并的候选对象。

注意: 启用 AppArmor 的要求应在前面的文本中明确说明。(在 Talk:Firejail 中讨论)

对于某些应用程序(例如 Firefox),使用 Firejail 启动可能会导致如下警告

Warning: Cannot confine the application using AppArmor.
Maybe firejail-default AppArmor profile is not loaded into the kernel.
As root, run "aa-enforce firejail-default" to load it.

运行建议的命令时,您可能会看到

ERROR: Cache read/write disabled: interface file missing. (Kernel needs AppArmor 2.4 compatibility patch.)

这意味着 AppArmor 未作为内核参数启用,因此您必须根据 AppArmor#安装 进行设置。

/usr/bin/patch: **** 无法打开补丁文件

这意味着 PKGBUILD 使用带有 -i 参数的 patch,因此需要 /etc/makepkg.conf$SRCDEST 的白名单。

使用 $SRCDEST 的值创建 覆盖 patch.local

whitelist /path/to/makepkg/sources

更改 PKGBUILD 以使用 stdin 也有效

patch -p1 < ../file.patch

守护进程化/后台进程挂起

存在一个已知问题,它阻止进程守护进程化。目前没有解决此问题的方案,除非不使用 Firejail 来沙盒化受影响的应用程序。由于这是 Firejail 中的一个错误,因此没有任何配置可以解决此问题。幸运的是,问题中提到的应用程序通常没有很大的攻击面,因此在没有沙箱的情况下运行它们的风险相对较低。

参见