Linux应用沙盒化实战:Firejail核心机制、配置与安全隔离指南

📅 2026/7/29 3:10:41
Linux应用沙盒化实战:Firejail核心机制、配置与安全隔离指南
1. 项目概述为什么我们需要Firejail在Linux世界里我们常常享受着开源带来的自由和强大但这份自由也伴随着潜在的风险。你有没有遇到过这种情况想试用一个从GitHub上找到的、功能很酷但来源不那么明确的小工具或者你日常使用的某个应用比如一个视频播放器或下载器突然因为一个漏洞而可能访问到你整个家目录下的私人文件对于桌面用户和开发者来说这种“应用权限过大”的问题一直存在。传统的解决方案要么太重比如为每个应用开一个完整的虚拟机要么太轻简单的chroot限制有限要么配置起来过于复杂如SELinux/AppArmor的策略编写。Firejail的出现就是为了填补这个空白。它不是一个全新的安全子系统而是一个基于Linux现有安全特性如namespaces, seccomp-bpf, capabilities的“沙盒”工具。它的核心思想是“最小权限原则”一个应用程序默认不应该拥有访问你整个系统的权限它只应该获得运行其功能所必需的最小权限集。Firejail通过一行简单的命令就能为绝大多数图形或命令行程序套上一个轻量级但坚固的隔离层。我最初接触Firejail是因为需要安全地运行一些第三方二进制文件进行逆向分析。虚拟机虽然隔离彻底但启动慢、资源占用高。而Firejail几乎零延迟资源开销极小却能有效将可疑程序限制在一个“牢笼”里即使它试图作恶影响范围也极其有限。后来我把它用在了日常工作中用隔离的浏览器访问敏感网站用沙盒化的文档处理器打开未知来源的文件。它就像给每个应用穿上了一件量身定制的“防护服”既不影响活动自由又能防止“交叉感染”。简单来说Firejail能帮你隔离文件系统程序只能看到你允许它访问的目录比如它自己的配置目录和必要的系统库你的个人照片、SSH密钥、工作文档对它而言是隐形的。隔离网络可以为程序创建一个全新的网络命名空间甚至提供一个虚拟的、独立的网络栈防止其嗅探你的主机网络。限制内核访问通过seccomp过滤器阻止程序调用危险的内核系统调用。剥离权限移除进程的非必要Linux能力Capabilities比如阻止其调试其他进程或加载内核模块。接下来我将带你从零开始构建一个覆盖安装、配置、高级定制和日常运维的完整Firejail安全防护体系。2. 核心安全机制与架构解析Firejail的强大并非来自魔法而是巧妙地组合运用了Linux内核提供的多项隔离与安全特性。理解这些底层机制能帮助你在后续配置时做出更明智的选择并在出现问题时知道从何排查。2.1 基石Linux命名空间Namespaces这是Firejail实现隔离的核心。你可以把命名空间想象成一种“视图滤镜”它为进程提供了一套独立的系统资源视图。Firejail主要利用了以下几种挂载命名空间Mount Namespace这是文件系统隔离的关键。当为一个进程创建新的挂载命名空间时它拥有独立的文件系统挂载点树。Firejail会在这里进行精密的操作首先它创建一个新的根文件系统视图通过pivot_root或chroot然后它使用bind mount将必要的目录如/usr,/lib,/bin以只读方式挂载到沙盒内确保程序能运行接着它可能会创建一个临时目录/tmp或特定的数据目录~/Downloads以读写方式挂载进去最后它将用户的家目录/home/username完全隐藏或仅以只读方式暴露特定子目录。这样沙盒内的程序认为自己运行在一个完整的系统上但实际上能触及的文件范围被严格限制了。网络命名空间Network Namespace这提供了完整的网络隔离。沙盒内的进程拥有自己独立的网络设备、IP地址、端口号、路由表和防火墙规则。默认情况下这个新网络空间是空的没有eth0。Firejail提供了多种方式将其与主机网络连接--netnone完全无网络最安全。--neteth0通过MACVLAN或IPVLAN创建一个虚拟接口如eth0桥接到主机的物理接口沙盒内程序像一台独立主机一样获取IP通常通过DHCP。--netbr0连接到用户预先配置的Linux网桥。--netfirejail默认使用Firejail自带的基于slirp的用户态网络栈通过NAT方式访问外网。这种方式不需要root权限安全且方便但性能稍差。PID命名空间PID Namespace沙盒内的进程只能看到自己命名空间内的进程它的PID从1开始计数。它看不到主机上其他的进程主机也看不到沙盒内具体的进程细节在主机上它们被“包裹”在一个Firejail进程下。这防止了沙盒内进程通过/proc文件系统窥探或向主机进程发送信号。用户命名空间User Namespace这是实现非特权沙盒的魔法。它允许在沙盒内部将非root用户映射为root用户uid 0。在沙盒内程序可以以root身份运行满足某些程序的权限需求但这些“root权限”被严格限制在沙盒的命名空间内无法对主机系统产生任何实际影响。这是Firejail能以普通用户身份运行许多沙盒的关键。2.2 防线Seccomp-BPF与能力Capabilities即使隔离了视图程序本身可能还存在有缺陷或恶意的代码。这两道防线用于限制程序的行为本身。Seccomp-BPF可以理解为给进程安装了一个“系统调用过滤器”。Linux所有功能都通过系统调用syscall实现如open打开文件、socket网络通信。Seccomp-BPF允许你定义规则明确允许或禁止特定的系统调用。Firejail内置了针对不同程序类型的配置文件其中包含了严格的seccomp规则。例如一个文本编辑器很可能不需要mount或ptrace调试系统调用那么这些调用就会被直接阻断即使漏洞试图利用它们也无计可施。Linux Capabilities传统的Unix权限是“要么是root要么不是”过于粗放。Capabilities将root特权细分成几十个独立的单元如CAP_NET_ADMIN网络管理、CAP_SYS_ADMIN系统管理。Firejail在启动沙盒时会默认丢弃所有非必要的Capabilities。例如即使沙盒内以映射的root运行因为没有CAP_SYS_MODULE能力它也无法加载内核模块。2.3 配置文件安全策略的蓝图Firejail的易用性很大程度上归功于它的配置文件系统。每个支持的程序如firefox,vlc,transmission-gtk通常都有一个对应的配置文件如/etc/firejail/firefox.profile。这个文件本质上是一个脚本定义了启动该程序时需要应用的所有隔离规则。一个典型的配置文件内容如下# Firefox profile include /etc/firejail/default.profile include /etc/firejail/disable-common.inc include /etc/firejail/disable-devel.inc caps.drop all netfilter no3d nodvd nogroups nonewprivs noroot nosound notv seccomp shell none # 允许访问必要的目录 whitelist ${HOME}/.mozilla whitelist ${HOME}/Downloads whitelist ${HOME}/.cache/mozilla # 创建一个私有的/tmp private-tmp这个配置做了以下事情包含了一些基础、通用的限制配置。丢弃所有Capabilities。启用网络过滤netfilter。禁用3D、DVD、声音等不必要的硬件访问。启用seccomp过滤。使用whitelist明确允许访问Firefox需要的几个特定目录其他家目录内容均不可见。为其创建一个私有的/tmp目录。注意Firejail的配置遵循“默认拒绝显式允许”的原则。在自定义配置时务必通过whitelist或bind命令明确放行程序运行所必需的文件和目录否则程序很可能因找不到库或配置文件而启动失败。3. 从安装到基础使用的完整实操理解了原理我们开始动手。Firejail的安装和使用非常直观。3.1 系统安装与初步验证大多数主流Linux发行版的仓库都已包含Firejail。Debian/Ubuntu及其衍生版sudo apt update sudo apt install firejailFedora/RHEL/CentOSsudo dnf install firejailArch Linuxsudo pacman -S firejail安装完成后无需任何配置你就可以立即使用。让我们进行一个简单的测试看看隔离效果# 1. 首先查看当前主机的主机名和网络接口 hostname ip addr show eth0 | grep inet # 2. 在Firejail沙盒中运行一个shell并启用网络命名空间使用默认的slirp模式 firejail --netfirejail bash # 3. 在沙盒内的shell中再次查看主机名和网络接口 hostname ip addr你会观察到沙盒内的主机名可能变成了一个随机字符串如f5c6e2d0而网络接口不再是eth0变成了lo回环和一个tap0之类的虚拟接口IP地址也是完全不同的内网段如10.0.2.100。这直观地证明了网络和UTS主机名命名空间已经生效。退出沙盒只需输入exit。3.2 运行图形与命令行程序运行图形程序以GIMP为例firejail gimp就这么简单。GIMP会在一个受限制的沙盒中启动。你可以尝试在GIMP的“打开文件”对话框中导航会发现你只能访问到Firejail默认允许的少数几个目录如~/Downloads,~/Pictures以及系统目录。你的~/Documents、~/.ssh等目录是看不见的。运行命令行程序以wget下载文件为例# 在沙盒中下载文件文件会被保存在沙盒内的当前目录。 # 由于沙盒有自己的文件系统视图下载的文件在沙盒退出后默认会消失除非你保存在绑定的目录里。 firejail wget https://example.com/somefile.tar.gz # 更好的方式指定一个宿主机的目录作为沙盒的“下载目录” firejail --private~/Downloads/sandbox_dl wget -O /home/user/Downloads/sandbox_dl/file.tar.gz https://example.com/somefile.tar.gz上面第二条命令使用了--private参数。这个参数非常有用它会创建一个全新的、空的临时目录作为沙盒的根/并将必要的系统目录以只读方式绑定进去。同时我们将宿主机的~/Downloads/sandbox_dl目录绑定到了沙盒内的同名路径。这样wget下载的文件就实际保存在了宿主机的~/Downloads/sandbox_dl目录下沙盒退出后文件依然存在。3.3 核心命令行参数详解Firejail的强大功能通过命令行参数控制。以下是几个最常用、最核心的参数--nettype指定网络类型。如前所述none无网络、firejail默认用户态NAT、eth0桥接等。--private以一个新的临时目录作为私有根目录启动沙盒。这是进行一次性、高隔离度任务的首选。--private-homedir将指定的目录如~/sandbox_home作为沙盒内的家目录/home/user。这比--private更灵活可以持久化一个专用的沙盒家目录。--whitelisthomedir_path这是精细化控制文件访问的核心。它允许将宿主机的某个目录或文件以读写方式暴露到沙盒内对应的路径下。例如--whitelist~/Documents/ProjectA允许沙盒内的程序访问宿主机的ProjectA文件夹。--read-onlyhomedir_path与whitelist类似但以只读方式暴露。--seccomp启用seccomp系统调用过滤默认在多数配置文件中已启用。--caps.dropall丢弃所有非必要的Linux能力默认在多数配置文件中已启用。--apparmor如果系统启用了AppArmor可以加载指定的AppArmor配置文件需要Firejail编译时支持。--list/--tree查看当前正在运行的所有Firejail沙盒。--tree会以树状图显示更清晰。--joinPID加入一个正在运行的沙盒需要firejail --join命令支持。实操心得对于需要频繁使用且配置固定的程序如浏览器不建议每次都输入一长串参数。最佳实践是编辑或创建对应的配置文件。例如复制/etc/firejail/firefox.profile到~/.config/firejail/firefox.profile并进行自定义以后直接运行firejail firefox就会自动应用你的个人配置。4. 高级配置与自定义策略当基础用法满足不了你的需求时就需要深入配置文件打造量身定制的安全策略。4.1 解读与修改现有配置文件系统级的配置文件位于/etc/firejail/。用户级的配置可以放在~/.config/firejail/这里的配置会覆盖系统配置。让我们以自定义Firefox配置为例复制全局配置到本地mkdir -p ~/.config/firejail cp /etc/firejail/firefox.profile ~/.config/firejail/编辑本地配置文件(~/.config/firejail/firefox.profile) 假设我们想要允许Firefox访问~/Documents/WebProjects目录。禁止其访问麦克风。使用一个特定的、独立的磁盘缓存位置。我们可以在文件末尾添加或修改# 允许访问WebProjects目录 whitelist ${HOME}/Documents/WebProjects # 禁用音频输入麦克风 disable-audio-input # 定义一个独立的缓存目录并允许Firefox访问 mkdir ${HOME}/.cache/firejail_firefox 2/dev/null whitelist ${HOME}/.cache/firejail_firefox # 然后需要告诉Firefox使用这个缓存这通常通过环境变量或在Firefox内部配置。 # 我们可以在profile里设置环境变量 env MOZ_CRASHREPORTER_DISABLE1 # 注意修改Firefox的磁盘缓存路径更复杂可能需要about:config设置此处仅作whitelist示例。4.2 为任意程序创建自定义配置对于没有默认配置的程序或者你想为一个脚本创建配置可以自己编写.profile文件。例如为vlc媒体播放器创建一个更宽松的配置因为它可能需要访问更多媒体设备和目录# 保存为 ~/.config/firejail/vlc.profile include /etc/firejail/default.profile # 保留声音输出和视频播放相关的能力但丢弃其他高危能力 caps.drop all caps.keep block_suspend chown dac_override fowner ipc_lock kill setgid setuid sys_nice sys_resource # 启用网络用于流媒体 netfilter # 允许访问媒体目录 whitelist ${HOME}/Videos whitelist ${HOME}/Music whitelist ${HOME}/Pictures # 允许访问外部存储假设挂载在/media whitelist /media # 允许访问音频设备可选如果沙盒内声音有问题 # allow-debuggers # noblacklist ${HOME}/.config/pulse # 禁用不必要功能 nodvd nogroups nonewprivs noroot notv seccomp shell none然后使用这个配置运行VLCfirejail --profile~/.config/firejail/vlc.profile vlc4.3 使用“覆盖”目录进行灵活配置~/.config/firejail/目录下还有一个特殊的子目录overrides。放在这里的.profile文件具有最高优先级并且是“覆盖”式的。当Firejail启动一个程序时它会按顺序加载系统profile - 用户profile - override profile。override profile中的指令会替换之前同名指令的效果这对于临时调整某个设置非常有用而无需修改主配置文件。例如你通常使用一个严格的firefox.profile。但今天你需要用Firefox上传~/Documents里的一个大文件到某个网站。你可以创建一个覆盖文件echo whitelist ${HOME}/Documents ~/.config/firejail/overrides/firefox.profile这次运行firejail firefox时Documents目录就会被临时允许访问。完成后删除这个override文件即可恢复原配置。4.4 网络高级配置创建虚拟网络对于更复杂的网络需求比如让多个沙盒程序在同一个隔离的网络中互相通信可以使用Firejail的网络桥接功能。创建并配置一个Linux网桥需要root权限sudo ip link add name br-firejail type bridge sudo ip addr add 10.10.10.1/24 dev br-firejail sudo ip link set br-firejail up配置iptables/nftables实现NAT让桥接网络可以上网此处以iptables为例sudo iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i br-firejail -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o br-firejail -m state --state RELATED,ESTABLISHED -j ACCEPT在Firejail中使用这个网桥# 以普通用户运行Firejail会创建veth设备连接到网桥 firejail --netbr-firejail --ip10.10.10.100 bash在沙盒内你可以ping 10.10.10.1网关并访问外网。启动另一个沙盒指定--ip10.10.10.101它们就可以在10.10.10.0/24网段内互访同时与主机和外部网络隔离。注意事项桥接网络配置涉及系统网络设置操作不当可能导致主机网络问题。建议在测试环境中先练习。对于大多数桌面用户默认的--netfirejailslirp模式已经足够安全且无需root是首选。5. 实战场景与深度集成Firejail的价值在具体场景中能得到最大体现。下面分享几个我常用的深度集成方案。5.1 场景一安全浏览与隐私保护浏览器是风险最高的应用之一。一个强化的浏览器沙盒配置至关重要。创建强化版Firefox/Chromium配置 基于系统默认配置我们可以进一步收紧策略# ~/.config/firejail/firefox-hardened.profile include /etc/firejail/firefox.profile # 移除所有能力比默认的caps.drop all更严格默认配置可能保留个别 caps.drop all # 启用私有模式的黑名单阻止访问大量敏感路径 include /etc/firejail/disable-common.inc include /etc/firejail/disable-devel.inc include /etc/firejail/disable-passwdmgr.inc include /etc/firejail/disable-programs.inc # 不共享IPC进程间通信增加隔离性 private-ipc # 使用全新的临时文件系统不保留任何痕迹 private-tmp # 严格限制CPU和内存资源可选防挖矿脚本 # cpu 2 # 最多使用2个CPU核心 # rlimit-as 2G # 虚拟内存限制2GB # rlimit-nproc 100 # 进程数限制100 # 只允许访问浏览器绝对必要的目录 whitelist ${HOME}/.mozilla whitelist ${HOME}/Downloads # 注意缓存目录whitelist可能导致性能问题也可考虑用private-dev模式让浏览器使用内存盘做缓存使用firejail --profilefirefox-hardened firefox启动。与多账户容器扩展结合Firefox和Chromium都有多账户/多Profile容器扩展。你可以在沙盒内启动浏览器再结合浏览器自身的容器功能实现“沙盒套容器”的双重隔离将不同身份、用途的浏览活动完全分开。5.2 场景二开发与测试环境隔离作为开发者经常需要测试第三方库、运行不确定的脚本或构建项目。测试Python脚本# 创建一个临时的、干净的Python环境 firejail --private --netnone python3 myscript.py脚本无法访问你的代码库、SSH密钥也无法联网彻底杜绝了脚本可能存在的“偷数据”或“打电话回家”的行为。构建项目# 假设项目在 ~/projects/myapp # 使用--private-home创建一个专属的构建沙盒家目录 firejail --private-home~/sandbox-build --whitelist~/projects/myapp bash # 进入沙盒后家目录是干净的只有被whitelist的myapp目录可见。 cd ~/projects/myapp ./configure make这样构建过程产生的临时文件、下载的依赖包都污染不到你的真实家目录。5.3 场景三桌面环境集成与一键启动每次从终端启动沙盒程序太麻烦。我们可以将其集成到桌面启动器中。修改桌面快捷方式 以Ubuntu的GNOME桌面为例桌面启动器文件通常在/usr/share/applications/或~/.local/share/applications/。复制Firefox的启动器文件进行修改cp /usr/share/applications/firefox.desktop ~/.local/share/applications/firefox-sandboxed.desktop编辑~/.local/share/applications/firefox-sandboxed.desktop找到Exec这一行修改为Execfirejail firefox %u同时修改Name为Firefox (Sandboxed)以便区分。保存后在应用菜单中就会出现一个名为“Firefox (Sandboxed)”的图标点击它就会自动在沙盒中启动。使用Firejail的“包装”功能 Firejail提供了一个更系统化的方式firejail --fix。这个命令可以扫描系统的/usr/local/bin,/usr/bin等目录并为找到的可执行文件创建包裹脚本。例如执行sudo firejail --fix后可能会在/usr/local/bin/下生成一个firefox脚本其内容就是调用firejail来启动真正的Firefox。这样任何地方终端、启动器调用firefox命令时都会自动进入沙盒。警告--fix命令会覆盖系统命令的链接使用前务必理解其影响并在测试环境中先行尝试。我个人更倾向于手动修改桌面文件或使用别名alias可控性更高。5.4 场景四服务器场景下的应用沙盒化虽然Firejail主要面向桌面但在轻量级服务器场景下也有用武之地特别是用于隔离那些不需要完全容器化Docker但又有一定风险的服务进程。例如运行一个用户提交的、不受信任的CGI脚本# 使用一个非常严格的沙盒无网络、无文件访问、资源受限 firejail --netnone --private --caps.dropall --seccomp --rlimit-as500M --rlimit-nproc50 -- /usr/lib/cgi-bin/untrusted_script.cgi这样即使脚本有漏洞或恶意代码其破坏力也被限制在极小的范围内。6. 问题排查、性能分析与社区资源即使配置得当也可能会遇到问题。掌握排查方法至关重要。6.1 常见问题与解决方案速查表问题现象可能原因排查步骤与解决方案程序启动失败提示“权限不足”或“找不到库”1. 配置文件过于严格whitelist未包含程序必需的库或配置文件路径。2. Capabilities被过度剥夺。1. 使用firejail --debug启动程序查看详细的启动日志定位失败的系统调用或文件访问。2. 临时使用firejail --debug --caps.dropnone启动如果成功说明是能力问题。然后逐步添加--caps.dropall并配合--caps.keepcap1,cap2来精确保留必要能力。3. 检查程序的依赖ldd /path/to/program确保/lib,/usr/lib等目录在沙盒内可访问默认配置通常已包含。沙盒内程序无法连接网络1. 使用了--netnone。2. 默认的--netfirejailslirp模式在某些网络环境下可能有问题。3. 防火墙/iptables规则阻止。1. 确认启动参数。使用firejail --netfirejail。2. 尝试使用主机网络--neteth0需要权限或桥接网络测试。3. 在沙盒内执行ping 8.8.8.8和curl -I https://example.com诊断。4. 检查主机防火墙是否允许slirp的流量。图形程序白屏、闪烁或无法显示1. X11套接字/tmp/.X11-unix未正确暴露给沙盒。2. DRI直接渲染设备访问被阻止。3. 共享内存/dev/shm问题。1. Firejail默认会处理X11转发。确保未使用--x11none。2. 对于需要硬件加速的程序如游戏、3D应用可能需要--allow-debuggers或noblacklist ~/.config/dri。注意这会降低安全性。3. 尝试在配置文件中添加blacklist ${HOME}/.config/dri有时反向操作能解决某些驱动冲突。声音无法播放或录制PulseAudio或PipeWire套接字未暴露。1. 检查配置中是否有nosound指令注释掉它。2. 尝试添加whitelist ${HOME}/.config/pulse对于PulseAudio或对应的PipeWire路径。3. 更安全的方式是使用--envPULSE_SERVERunix:/tmp/pulse-socket并配合--whitelist/tmp/pulse-socket需要提前配置好PulseAudio的套接字。沙盒内时间不对未同步时间命名空间。使用--time参数firejail --time。这会将沙盒的/proc文件系统关于时间的视图与主机隔离但初始时间是一致的。6.2 性能影响评估Firejail的额外开销主要来自启动开销创建命名空间、加载配置、设置过滤规则。对于长期运行的程序如浏览器这个一次性开销可忽略不计。运行时开销系统调用拦截seccomp开销极小几乎可忽略。文件系统重定向bind mount对文件操作有轻微性能影响但在现代SSD上感知不强。网络slirp用户态NAT这是开销最大的部分。--netfirejail模式下的网络吞吐量和延迟会低于主机原生网络。对于需要高速网络的应用如大文件下载、视频流考虑使用--neteth0桥接模式需要root以获得接近原生的性能。实测对比在一台普通台式机上使用--netfirejail运行speedtest-cli网速约为原生速度的85%-95%。对于日常网页浏览、邮件、文档处理完全无法感知差异。6.3 安全边界与局限性认知必须清醒认识到Firejail不是万能的银弹它有其安全边界内核漏洞如果存在能直接突破命名空间隔离的内核漏洞Firejail也无法防护。不过这种漏洞通常影响所有容器技术。侧信道攻击针对CPU缓存如Spectre, Meltdown的侧信道攻击在理论上可能跨越沙盒边界。Firejail不提供针对此类硬件级攻击的防护。配置错误最大的风险来源。一个过于宽松的whitelist规则或错误保留的capability可能让隔离形同虚设。永远遵循最小权限原则。非隔离资源某些系统范围的资源如系统负载、某些内核参数通过/proc/sys可能仍被部分暴露。Firejail提供了--private-*系列参数来进一步隔离这些资源。最佳实践是将其视为“安全增强层”而非“绝对安全容器”。对于运行完全不可信的二进制文件虚拟机如QEMU-KVM仍然是更安全的选择。Firejail的定位是在便捷性和安全性之间取得极佳平衡用于隔离日常应用和轻度不可信代码。6.4 获取帮助与社区资源官方文档man firejail和man firejail-profile是最权威、最详细的参考资料。Firejail的文档写得非常全面。内置帮助firejail --help和firejail --list可以快速查看参数和运行状态。GitHub仓库 https://github.com/netblue30/firejail 这里是代码、问题追踪和讨论区。在提交issue前请先搜索是否已有类似问题。调试输出遇到诡异问题时--debug、--debug-caps、--debug-syscalls等参数能输出海量信息是定位问题的利器。审计工具Firejail自带firemon工具可以实时监控沙盒的资源使用情况和安全状态。firejail --tree也能直观显示沙盒进程树。Firejail是我个人Linux桌面上不可或缺的工具之一。它把原本复杂的Linux安全特性变得唾手可得让“默认沙盒化运行”成为一种轻松的习惯。经过一段时间的磨合为常用程序定制好配置文件后整个过程几乎无感但心底却多了一份踏实。安全往往不是靠一个惊天动地的方案而是靠这些细致、可坚持的日常实践堆砌起来的。如果你还在为某个应用权限过大而担忧或者想尝试一些来源不明的软件不妨从firejail --private bash这个最简单的命令开始体验一下这种“锁在玻璃房里操作”的感觉。