harden-flatpak
GitHub
开源 · GPLv3 可一眼审计

让每个 Flatpak
都默认零权限

两个极简脚本。lockdown.sh 将 Flatpak 配置为默认拒绝几乎所有权限,cleanup.sh 一键清除应用残留数据。需要什么权限,再由你明确授予。

--nosocket=x11 ~/.ssh masked --nofilesystem=home
2个脚本,足够小,便于审计
0次确认弹窗 —— 运行即确认
User仅用户级 override,不碰系统
GPLv3自由软件,自由修改与分发
特性

收紧沙箱,
而不是相信默认值

Flatpak 的默认配置面向便利。harden-flatpak 反其道而行:先全部拒绝,再按需放行。

默认拒绝所有权限类型

覆盖每一种权限类别,包括 wayland 与 dri,对所有应用生效;绝不授予 --persist。

  • --unshare
  • --nosocket
  • --nodevice
  • --disallow
  • --nousb=all
  • --remove-policy

文件系统与凭据路径封锁

拒绝 home、host、host-os、host-etc,并对敏感路径持续遮蔽——即使日后给某个应用授予 --filesystem=home,这些路径依然被屏蔽。

  • ~/.ssh
  • ~/.gnupg
  • ~/.netrc
  • ~/.password-store
  • shell 初始化文件
  • ~/.config/systemd

D-Bus 名称收紧

拒绝静态名单(portal 后端、Secret、PermissionStore、Flatpak / systemd 逃逸名称),并读取已安装应用声明的总线名称,逐一拒绝。

cleanup.sh 一键清理

结束所有 Flatpak 进程,取消导出文档,清空 ~/.var/app/* 与 $XDG_RUNTIME_DIR/app/*。

可撤销,可测试

一条命令回滚:flatpak override --user --reset。tests/test.sh 用伪造的 flatpak 校验生成的命令,不触碰真实系统。

为 Flatseal 保留最小可用权限

锁定之后,你仍然需要一个图形界面来按应用精细授权。脚本只重新授予 Flatseal 正常工作所需的最少权限,详见仓库中的 docs/flatseal-grants.md。

交互演示

运行之前,运行之后

点击下方按钮,直观感受 lockdown.sh 对应用权限的影响,并查看脚本运行流程。

已安装的应用

示意:权限标签被划掉即代表被拒绝
FxWeb Browser
networkwaylanddripulseaudiosession-bus
EdText Editor
filesystem=homex11~/.sshtalk-name=…portal
FsFlatseal
最小授权保留networkfilesystem=host

* 纯前端动画示意,不会对你的系统做任何事情。

~/harden-flatpak — bash

        
快速开始

三步完成加固

两个脚本刻意保持很小,建议在运行前先通读一遍。

获取脚本

克隆仓库并先审阅源码。

git clone https://github.com/lingyicute/harden-flatpak.git && cd harden-flatpak

锁定权限

默认拒绝用户级 override。安装新应用后请再次运行。

bash lockdown.sh

按需清理

结束进程并清空应用数据。会立即删除数据。

bash cleanup.sh

重要提示

脚本不会请求确认——运行脚本即是确认。cleanup.sh 会立即删除数据。严格的权限限制也可能让许多 Flatpak 应用无法正常工作,请通过 Flatseal 或 flatpak override 为可信应用单独授予所需权限。

坦诚面对局限

高威胁模型下的 Flatpak

安全工具最重要的是不夸大效果。以下是 Flatpak 自身的边界,以及对应的应对办法。

仍会挂载过滤后的会话总线与 AT-SPI 总线
--nosocket=session-bus 只移除未过滤的总线。flatpak run 仍会挂载一个始终允许 org.freedesktop.portal.*(包含子沙箱 Spawn())的过滤代理,以及无障碍总线代理。如需完整的总线隔离,请使用 flatpak run --sandbox 运行应用。
~/.var/app/$APP_ID 始终可写且跨运行保留
Flatpak 没有 --nopersist 覆盖项,清单中声明的 persistent= 目录也无法撤销。这正是 cleanup.sh 存在的原因;flatpak run --sandbox 则提供一次性沙箱。
不要给不可信应用 home 或 host
Flatpak 无法遮蔽尚不存在的宿主路径。如果 ~/.bash_profile 不存在,拥有 home 的应用可以绕过遮蔽创建它。请授予更窄的目录,或使用 portal。
针对单个应用的 override 优先于全局设置
你之前用 Flatseal 等方式授予单个应用的权限,在运行 lockdown.sh 之后依然有效。请用 ls ~/.local/share/flatpak/overrides 检查。
Portal 的授权决定不会被清理
相机、位置、通知等决定保存在 $XDG_DATA_HOME/flatpak/db/。cleanup.sh 只会显示它们,不会删除。请使用 flatpak permissions、flatpak permission-remove 或 flatpak permission-reset APP_ID。
--no-talk-name=foo.* 不是通配符
它只会取消字面上名为 foo.* 的条目,因此静态名单永远无法做到完备。所以脚本会读取已安装应用的声明,并建议你在安装新应用后重新运行 lockdown.sh。
Wayland 隔离依赖合成器支持
需要合成器实现 wp-security-context-v1 协议。

小脚本,大边界

读完两个脚本只需几分钟。给你的 Flatpak 一个更克制的起点,然后只放行真正需要的权限。

已复制到剪贴板