Firejail
Firejail 是一个易于使用的 Setuid 沙盒程序,它通过使用 Linux 命名空间、seccomp-bpf 和 Linux 功能来限制不受信任的应用程序的运行环境,从而降低安全漏洞的风险。
安装
安装 firejail 或 firejail-gitAUR 软件包。还有一个用于 Firejail 的 GUI 应用程序可用,firetools。
/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 程序不存在,例如:tar、curl 和 git。这些需要手动符号链接。请参阅 配置文件不在 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。
/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#编辑提供的单元。
- 指向 gzip 和 xz 的符号链接会干扰 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
通过编辑文件 /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 指令之上。
配置文件编写
基本流程是
- 将
/usr/share/doc/firejail/profile.template
复制到/etc/firejail/
或~/.config/firejail/
并将其重命名为ProfileName.profile
,其中 ProfileName 应与要沙盒化的可执行文件的名称匹配 - 将行
include PROFILE.local
更改为include ProfileName.local
- 逐步注释/取消注释各种选项,同时在每个阶段检查应用程序是否在新沙箱内运行。不要更改该模板中各节的顺序。
- Firejail 配置文件的可能选项的详细说明可以在 firejail-profile(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.local
和 include 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.local
在 globals.local
之前读取,因此 ignore net
覆盖了 net none
,并且,作为奖励,以上更改将在未来的更新中保持持久性。
测试配置文件
为了测试和审核 Firejail 配置文件,您可能会发现以下内容很有用
firejail --debug $Program > $PathToOutputFile
提供沙箱的详细分解firejail --debug-blacklists $Program
和firejail --debug-whitelists $Program
显示当前配置文件的黑名单和白名单目录和文件。firejail --debug-caps
提供当前 Firejail 软件版本支持的功能列表。这在构建 caps 白名单时很有用。firejail --help
获取--debug
选项的完整列表firemon PID
监视正在运行的进程。有关详细信息,请参阅firemon --help
- 执行
sudo jailcheck
测试正在运行的沙箱。有关详细信息,请参阅 jailcheck(1) 手册页。 - checksec 也可能有助于测试正在使用哪些标准安全功能
Firejail 与 Xorg
在 Xorg 上,任何程序都可以监听所有键盘输入并记录所有屏幕。沙盒化 X11 的目的是限制这种行为,这对于处理潜在恶意输入(如浏览器)的复杂程序尤其成问题。
Xephyr 和 Xpra 允许您沙盒化 Xorg。虽然 Xpra 提供完整的剪贴板支持,但由于嵌套 X11 会话的非常明显且永久的延迟,建议使用 Xephyr。
有关具有(不太理想的)剪贴板支持(剪贴板始终共享)的完整设置,请参阅 Sakaki 的 Gentoo 指南,尤其是关于剪贴板和自动缩放的部分。
或者,如果不需要剪贴板支持但需要管理窗口,请安装独立的窗口管理器,例如 Openbox。
xephyr-screen WidthxHeight
可以在 /etc/firejail/firejail.config
中设置,其中 Width
和 Height
以像素为单位,并基于您的屏幕分辨率。
要打开沙箱
$ firejail --x11=xephyr --net=device openbox
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 可执行文件的文件模式。有关详细信息,请参阅此处。
/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 开发人员意识到了其附带工具的问题,并制作了自己的改进版本。
- firecfg.py,
firecfg
的改进版本。 - fjp,一个与 Firejail 配置文件交互的工具。
- fireurl,修复 firejail URL 打开问题。
- firejail-handler-http,有助于在沙盒化应用程序时正确打开 HTTP(S) 链接。
- firejail-handler-extra,如上所述,但处理其他协议。
故障排除
Firejail 可能难以调试。配置错误或不合适的设置的症状范围从应用程序中的随机分段错误和挂起到简单的错误消息。
某些应用程序比其他应用程序更难沙盒化。例如,Web 浏览器 和 Electron 应用程序往往比其他应用程序需要更多的故障排除,因为有很多可能出错的地方。务必首先查看 FAQ 和 未解决的问题,因为调试可能需要相当长的时间。
移除 Firejail 符号链接
要移除 Firejail 创建的符号链接(例如,重置为默认值)
# firecfg --clean
如果您不想将 Firejail 用于特定应用程序(例如,因为您更喜欢使用 AppArmor 限制它),则必须手动删除相关的符号链接
# rm /usr/local/bin/application
由于后续执行 firecfg 将重新添加已删除的符号链接,因此应在 /etc/firejail/firecfg.config
中注释掉相应的应用程序。
验证 桌面条目 的任何残留是否仍被 Firejail 覆盖。
PulseAudio
如果 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 限制应用程序
对于某些应用程序(例如 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 中的一个错误,因此没有任何配置可以解决此问题。幸运的是,问题中提到的应用程序通常没有很大的攻击面,因此在没有沙箱的情况下运行它们的风险相对较低。
参见
- Firejail GitHub 项目页面
- Sakaki 的 EFI 安装指南/使用 Firejail 沙盒化 Firefox 浏览器 隔离 firefox 的分步指南