沙箱权限

flatpak的一个主要目标就是通过应用间的隔离来提高桌面系统的安全性。这通过使用沙箱来实现,默认地,应用运行的环境对主机的访问很有限。这包括:

  • 无法访问除runtime、app目录和 ~/.var/app/$APPID 目录以外的文件。而且只有最后一个目录(译者注:即 ~/.var/app/$APPID 目录)有写权限。
  • 无法访问网络。
  • 无法访问任何设备节点的(除了 /dev/null ,等等)。(译者注:可能有访问所有null设备的权限)
  • 无法访问沙箱之外进程
  • 有限的系统调用。举个例子,应用无法使用非标准的网络socket或者ptrace其他进程。
  • 有限地访问D-Bus实例的session——一个应用在总线上只能拥有它自己的名字。
  • 无法访问主机服务,像X11,system D-Bus或PulseAudio这些。

大部分应用需要访问这些资源。这些主要是在finishing构建步骤完成的,通过清单文件(查看 清单)的 finish-args 部分来配置。

门户(译者注:英文portals)

门户已经在 Flatpak简介 提到过。他们是一个提供沙箱外资源访问的框架。包括这些资源:

  • 用一个本地的文件选择对话框打开文件
  • 打开URL
  • 打印
  • 显示通知
  • 截取屏幕
  • 禁止用户会话结束、暂停、空转或切换。
  • 获取网络状态信息

在许多情况下,门户通过使用系统组件在获取访问某些特定资源的权限之前隐式地向用户获得了许可。举个例子,在打开一个文件的时候,用户用文件选择对话框进行文件选择,可以理解为隐式地授予了应用对选中文件的访问。

这种方式使得应用在需要访问大量数据或服务时避免重复配置, 也让用户可以掌控(译者注:知悉,了解)他们的应用的访问权限。

像GTK3和Qt5这样的接口工具包实现了对门户的透明支持,这意味着应用程序不需要做任何额外的工作来使用它们(每个工具包支持哪些门户值得了解)。没有使用受支持工具包的应用可以参考 xdg-desktop-portal API 文档

权限手册

虽然应用程序开发人员可以控制他们想要配置的沙箱权限,但是鼓励进行良好的实践。举个例子,Flathub主机托管服务对权限的使用提出了要求,如果使用了某些权限,主机上的软件可能会警告用户。

后面的手册描述了哪些权限可以任意使用,哪些可以根据需要使用,哪些应该避免使用。

标准权限

以下权限提供了应用通常需要访问的基本资源,因此可以自由使用:

  • --share=network - 访问网络
  • --socket=x11 - show windows using X11
  • --socket=fallback-x11 - 如果Wayland不可用,使用X11显示窗口
  • --share=ipc - 和主机共享IPC命名空间 (对于X11是必要的)
  • --socket=wayland - 使用Wayland显示窗口
  • --device=dri - OpenGL 渲染
  • --socket=pulseaudio - 使用PulseAudio播放音频

D-Bus访问

避免使用 --socket=system-bus--socket=session-bus 访问整个总线,除非应用是一个开发工具。

Ownership

应用会自动为他们自己命名空间授予访问权限,通常不需要有所有权,尽管如此还是有少量的例外,例如使用 MPRIS来提供媒体控制

Talk

Talk权限可以自由使用,尽管如此还是推荐使用应用所需的最小权限。

文件系统访问

应用要求范围主机文件系统的不同部分是很正常的,flatpak为此提供了一套灵活的选项。下面是一些例子:

  • --filesystem=host - 访问主机的常规文件,不包含一下提到的主机操作系统或者系统内部
  • --filesystem=home - 访问用户home目录
  • --filesystem=/path/path - 访问特定路径
  • --filesystem=xdg-download - 访问特定的XDG文件夹

作为一个通用规则,对文件系统的访问应该尽可能地进行限制。这包括:

  • 尽量使用门户来代替文件系统访问。
  • 尽量使用读取权限来访问,使用 :ro 选项。
  • 如果一定要访问home目录,只使用XDG目录访问。

完整的文件系统可用选项列表可以在 沙盒权限 找到。其它文件系统访问指南包含:

  • --persist=path 选项可以用来将用户目录映射到沙箱的文件系统。这可以避免配置整个home目录访问权限。并且对于在硬编码使用 ~/ 文件路径的应用程序非常有用。
  • If an application uses $TMPDIR to contain lock files you may want to add --env=TMPDIR=/var/tmp or if it uses $TMPDIR to share with processes outside the sandbox you will want a wrapper script that sets it to $XDG_CACHE_HOME.
  • 应该避免与非flatpak安装的应用共享配置。

如上所述, host 选项实际上没有提供主机文件系统的完整访问。主要的规则是:

  • 这些目录是屏蔽掉的: /lib , /lib32 , /lib64 , /bin , /sbin , /usr , /boot , /root , /tmp , /etc , /app , /run , /proc , /sys , /dev , /var
  • /run/media 例外
  • 这些目录被挂载到 /var/run/host : /etc/usr

许多目录被屏蔽的原因是他们已经在沙箱里存在了:例如 /usr 或者是一些在沙箱中不可用的目录。

设备访问

尽管不理想, --device=all 可以用来访问控制器和网络摄像头之类的设备。

dconf访问

在沙箱兼容后端可用之前,需要访问dconf的应用程序可以使用以下选项:

--filesystem=xdg-run/dconf
--filesystem=~/.config/dconf:ro
--talk-name=ca.desrt.dconf
--env=DCONF_USER_CONFIG_DIR=.config/dconf