Flatpak 应用程序的密钥管理的三种方法

Flatpak 密钥管理正在升级。以下是即将推出的内容。
124 位读者喜欢这个。
Security file

By Acid the meme machine (Own work) [CC BY-SA 4.0], via Wikimedia Commons

Flatpak 使桌面应用程序能够在隔离的沙箱中运行,这显著提高了安全性,因为它防止应用程序相互影响并影响主机系统。然而,在实践中,典型的应用程序仍然需要访问在其他应用程序和主机之间共享的服务和用户数据。这种情况已经通过围绕门户机制的权限强化得到了改进,尽管长期存在一个问题:如何管理用户密钥。

在本文中,我们介绍了我们为 Flatpak 应用程序管理用户密钥的方法。虽然大多数应用程序可以透明地利用所提出的机制,但某些应用程序需要代码修改。本文还介绍了迁移步骤。

Linux 桌面上的密钥管理方式

在现代 Linux 桌面上,大多数密钥——密码、令牌等及其相关属性——都由守护进程 gnome-keyring-daemon 集中管理。应用程序通过 Secret Service API 访问此守护进程,该 API 通过 D-Bus 公开。如果应用程序使用像 libsecret 这样的客户端库,则此过程在后台完成。

注意: 为了相同的目的,有一个名为 libgnome-keyring 的库,它现在已经过时。请注意,尽管名称如此,libgnome-keyring 是一个与 gnome-keyring 分开的项目,gnome-keyring 没有过时,并且仍然保持着密钥管理的核心角色。

在守护进程端,密钥存储在文件系统上并被加密。除此之外,守护进程只是一个普通的存储服务,这意味着任何应用程序都可以在任意“路径”上存储数据,其他应用程序也可以看到这些数据。虽然只要我们信任所有应用程序,这种模型就足够了,但它否定了 Flatpak 的安全目标之一:通过将应用程序彼此隔离来提高桌面系统的安全性

因此,当安装使用 Secret Service API 的 Flatpak 应用程序时,系统会要求用户授予应用程序必要的权限。在下面的示例中,您可以看到该应用程序需要访问 Secret Service API (org.freedesktop.secrets)。如果用户不想允许此应用程序访问该服务,他们唯一的选择是放弃安装

$ flatpak install org.gnome.Epiphany
…
org.gnome.Epiphany permissions:
	ipc                    	network 	pulseaudio     	wayland
	x11                    	dri     	file access [1]	dbus access [2]
	system dbus access [3]

	[1] xdg-download, xdg-run/dconf, ~/.config/dconf:ro
	[2] ca.desrt.dconf, org.freedesktop.Notifications, org.freedesktop.secrets
	[3] org.freedesktop.GeoClue2
Proceed with these changes to the Default system installation? [Y/n]:

这显然是不希望的结果。

本地存储方法

解决此问题的基本思想是将密钥存储在应用程序端,而不是主机端 (gnome-keyring-daemon)。这种做法类似于 最近关于 GSettings 的工作,其中应用程序将设置数据存储在本地文件中,而不是存储在主机上运行的 dconf 服务中。

然而,当涉及到密钥时,存在一个引导问题:应用程序必须在将密钥存储在本地文件时对其进行加密,但它还不知道加密密钥。为了为应用程序提供加密密钥,我们依赖于 Flatpak 门户机制,该机制位于应用程序和主机之间,以允许两者通过受限接口进行通信。

我们还添加了 一个新的门户,允许应用程序检索加密密钥。首先,应用程序向门户发送请求(请求包含一个 Unix 文件描述符,加密密钥将写入其中)。然后,门户将请求委托给 gnome-keyring-daemon 中的后端实现,后者通过文件描述符为沙箱应用程序发送唯一的加密密钥。

收到加密密钥后,应用程序对密钥进行加密,并将其存储在应用程序数据目录 (~/.var/app/$APPID/data/keyrings) 中,该目录是 bind 挂载的,并且可以从主机和沙箱访问。

libsecret API

libsecret 项目提供了两组不同的 API。一个是 简单 API,另一个是 完整 API。前者为检索和存储密钥提供了更简单、无状态的操作,而后者提供了更完整、面向对象的 API,该 API 将 D-Bus 接口映射到 C API。

本地存储仅在简单 API 中受支持。如果您的应用程序已经在使用简单 API,那么它们在 Flatpak 下运行时将自动使用本地存储。否则,要启用本地存储,应用程序需要移植到简单 API。请参阅 Epiphany 中的迁移补丁 作为示例。

在两组 API 之间进行区分也使应用程序可以选择不使用本地存储。例如,如果您的应用程序是需要完全访问用户密钥环的密码管理器,则可以通过使用完整 API 来绕过本地存储。

密钥环格式

虽然理想情况下,我们应该能够为本地存储和 gnome-keyring-daemon 使用相同的密钥环格式,但我们意识到 gnome-keyring-daemon 使用的密钥环格式存在限制。密钥(包括关联的属性)作为一个整体加密,这意味着它们可能会消耗不必要的锁定内存量。此外,属性在没有密钥的情况下进行哈希处理,这意味着有可能猜测哪些密钥存储在文件中。

因此,我们决定定义新版本的密钥环文件格式,而不是在两个地方实现此格式,新格式具有以下特点:密钥单独加密,属性哈希现在是属性上的 消息认证码 (MAC)

除了标头之外,这种新格式基于 GVariant 序列化格式,此更改允许我们重用大部分代码用于编码、解码和查找。

Flatpak 密钥管理的下一步

必要的补丁(目前)仅在相关组件(xdg-desktop-portalgnome-keyringlibsecret)的 Git 存储库中可用。它们将包含在 GNOME 3.36 之前的下一个版本中。

如果您是开发人员,那么在这个领域仍然有改进的空间。以下是您可以提供帮助的地方

  • 会话密钥环: Secret Service API 支持“会话”密钥环,这些密钥环仅在用户会话期间持续存在。本地存储后端尚不支持此功能。可以使用 Linux 内核中的会话密钥环来实现此代码。

  • 管理和备份应用程序: 应用程序密钥现在存储在多个位置,而不仅仅是主机密钥环。如果有一个工具来管理应用程序密钥并进行备份,那将很有用。可以通过增强 GNOME 的 Seahorse 来查看应用程序密钥来实现此过程。

  • 在线帐户门户: 如今,Web 应用程序通常与基于 Web 的访问委派协议(如 OAuth 2.0)集成。这些协议由 gnome-online-accounts 支持,而 gnome-online-accounts 又使用 gnome-keyring-daemon 来存储令牌。在线帐户的门户接口对于限制每个应用程序的访问权限将很有用。

  • 更广泛地采用新的密钥环格式: 虽然新格式有几个优点,但目前仅在应用程序端的 libsecret 中使用。如果主机端的 gnome-keyring-daemon 也使用相同的格式,那将是有益的。

  • 强化重新安装过程: 默认情况下,应用程序的密钥环文件 (~/.var/app/$APPID/data/keyrings) 在卸载后会与其他数据一起保留。如果应用程序 ID 被不受信任的发布者重用,则此持久性是脆弱的。目前,我们建议使用 --delete-data 选项来确保删除此类应用程序数据。如果发布者的 ID 与应用程序关联,则可以改进此过程。

摘要

本文介绍了一种为 Flatpak 应用程序提供用户密钥的机制。此机制是基于以下原则设计的

  • 最大限度地减少主机接口。
  • 让应用程序通过 Flatpak 门户与主机交互。
  • 以通用数据格式存储应用程序数据。

虽然该机制是透明的,只要您使用 libsecret,该机制就仅通过 libsecret 的简单 API 启用。为了更平滑的过渡,我们建议将应用程序迁移到此 API。有关该项目的背景和设计原理的更多信息,请参见 GUADEC 演示文稿(幻灯片录音)。

接下来阅读什么

如何构建 Flatpak

具有分散式分发方式的通用打包格式。此外,还具有可移植性和沙箱功能。

(团队,红帽)
2019 年 10 月 21 日
User profile image.
自由软件爱好者,GNOME 贡献者,红帽公司的安全和加密工程师。

1 条评论

这是一个非常令人兴奋的发展。Flatpak 感觉越集成,就越好!

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.