如何在 flatpak 中设置 Firefox 和 KeePassXC 并使 KeePassXC-Browser 插件工作?

rug*_*ugk 5 password firefox password-store keepassx flatpak

如果 KeePassXC在 Flatpak 中被沙盒化,浏览器只能访问它,如果它们没有被沙盒化,即作为 deb/rpm 包或类似的安装在主机上。对浏览器,即Firefox和 KeePassXC 进行沙盒处理——或者至少是浏览器并本地安装 KeePassXC,出于安全原因,您实际上想要这样做——是不可能的。

特尔;博士:

  • 这应该是开箱即用的:Firefox(主机安装)、KeePassXC(来自 flathub 的 flatpak)
  • 这不是:Firefox(沙盒)、KeePassXC(主机或沙盒,无所谓)

那么如何使这种沟通有效呢?

rug*_*ugk 7

背景

如果您只想要解决方案,则可以跳过此部分。但出于好奇,我将解释我们面临的问题:

  • KeePassXC 也$XDG_RUNTIME_DIR/kpxc_server为应用程序创建了一个 UNIX 套接字来监听。keepassxc-proxy启动-通过本地消息-由浏览器(由附加触发keepassxc-browser@keepassxc.org和尝试,即KeePassXC浏览器的)听套接字上找到的消息。
  • 如果 Firefox 没有被沙盒化,该代理可以照常启动。它可能唯一需要做的就是进入 KeePassXC flatpak。
  • Flathub KeePassXC有一个补丁,允许通过 启动 keepassxc-proxy flatpak run,即 Firefox 现在可以运行
  • 也就是说,到目前为止,为什么安装在主机上的 Firefox 可以正常工作……
  • 现在为什么如果将 Firefox 安装为 flatpak 则它不起作用:Mozilla非常好的官方Firefox flatpak确实几乎没有作为浏览器的权限。例如,它没有对文件系统的任何通用访问(它使用portals)。无论如何,无论它做什么,它都不能做一件事:在主机或另一个 flatpak 中生成一个进程

所以我们可以通过制作包装脚本并使用 flatpak-spawn让 Firefox 逃离它的沙箱来解决这个问题。然而,看到 Firefox 沙箱已经构建的多么可爱和安全,我不敢破坏这样一个功能的安全性。毕竟,从安全 POV 中,您也可以再次在主机上安装 Firefox。好消息:这个解决方案保留了所有沙箱和安全方面!

然而,即使我们已经解决了 Firefox 必须运行代理的事实,还有更多的问题。剧透一下,以下是我们需要解决的要点:

  1. 通过 Firefox 启动 keepassxc-proxy(解决方案:我们在 Firefox 沙箱中运行它)
  2. 允许 Firefox 访问 KeePassXC 的 socket 注意:在这一步,你已经可以运行变体:Firefox(沙盒),KeePassXC(主机安装)
  3. 将来自 KeePassXC flatpak 的 UNUX 套接字暴露给 Flatpak 之外的其他应用程序。(解决方案:一个符号链接)

当前的解决方法

v1.2

测试:Fedora 32,org.mozilla.firefox来自 flathub 的 v75,org.keepassxc.KeePassXC来自 flathub 的 v2.5.4

通过 Firefox 启动 keepassxc-proxy

  1. 最糟糕的事情是:我们需要keepassxc-proxy一个二进制文件,因为我们想让它在 Firefox flatpak 中运行。对我们有好处:它没有太多的依赖,并且可以作为一个独立的应用程序使用。
    1. 所以我选择了Rust 代理应用程序(因为我为什么不应该?)。如果你相信我,你可以在下面得到我编译的二进制文件,只需跳到前面两步。
    2. 克隆 git repo 并编译它(运行cargo build --release)。
    3. 您会在 中找到结果./target/release。的keepassxc-proxy二进制版本211ae91,与rustc 1.43.0编译(目前稳定的Fedora 32),用于x86_64的(如果它可以帮助你想知道更多的是.rustc_info.json)。尽管Rust 还没有(还)完全可重复地编译,但我确实在两台装有 Fedora 32 的机器上得到了相同的逐位结果。 SHA-256 哈希是c5c4c6c011a4d64f7e4dd6c444dcc70bee74d23ffb28c9b65f7ff6d89a8f86ea. 因此,如果您处于危险情绪中,可以在此处下载我的 keepassxc-proxy 二进制文件。(由 GitHub 托管;P
  2. 现在我们需要告诉 Firefox 新的二进制文件。
    1. ~/.var/app/org.mozilla.firefox/.mozilla/native-messaging-hosts。实际上,native-messaging-hosts可能性尚不存在,因此请创建它。
    2. org.keepassxc.keepassxc_browser.json在其中创建一个文件,然后粘贴以下内容:
      {
          "allowed_extensions": [
              "keepassxc-browser@keepassxc.org"
          ],
          "description": "KeePassXC integration with native messaging support, workaround for flatpaked Firefox, see https://is.gd/flatpakFirefoxKPXC",
          "name": "org.keepassxc.keepassxc_browser",
          "path": "/home/REPLACE_WITH_USERNAME/.var/app/org.mozilla.firefox/.mozilla/native-messaging-hosts/keepassxc-proxy",
          "type": "stdio"
      }
      
      Run Code Online (Sandbox Code Playgroud) 请注意,只有绝对路径有效(我猜),因此请替换REPLACE_WITH_USERNAME为您的$USER姓名,以便路径指向它自己的工作目录。
    3. 你看我在做什么:我们现在将下载/编译的文件keepassxc-proxy 放在同一个 dir 中。显然,您可以在那里使用任何其他路径,但这是 Firefox 显然可以访问的第一个路径,并且您将所有内容都集中在一个地方。(如果您有更好的建议,请随时告诉我。)
      注意:chmod +x如果不是,请记住使其可执行 ( )。

允许 Firefox 访问套接字

默认情况下,KeePassXC 在$XDG_RUNTIME_DIR/kpxc_server. 所以这就是我们需要给 Firefox flatpak 访问权限(只读显然就足够了)。

幸运的是,这很容易。赶紧跑:

$ sudo flatpak override --filesystem=xdg-run/kpxc_server:ro org.mozilla.firefox
Run Code Online (Sandbox Code Playgroud)

万岁!:对于那些在主机上安装 KeePassXC (没有任何沙箱/flatpak)的人来说,这就足够了。启动 KeePassXC,然后启动Firefox,它应该能够连接。:tada: 不过,请注意底部的“现有问题”部分。

如果您还想在 flatpak 中运行 KeePassXC,请继续。

从 KeePassXC flatpak 暴露 UNIX 套接字

注意:如果您不想了解技术背景,请再次跳到下面的要点(第 1 点)。

来自 Flathub 的 flatpaked KeePassXC 在 flatpaks 应该这样做的位置创建它的 Unix 套接字,在$XDG_RUNTIME_DIR/app/org.keepassxc.KeePassXC/kpxc_server. (如果它$XDG_RUNTIME_DIR像“原生”KeePassXC 一样直接使用,它只会存在于沙箱中。)

正如我们所知,通常的 keepassxc-proxy 期望文件位于$XDG_RUNTIME_DIR/kpxc_server. 为了解决这个问题,我们只需创建一个符号链接。正如您可以验证的那样,这实际上解决了我们的问题。出于一些非常奇怪的原因,Flatpak 沙箱现在允许 Firefox(以及所有其他 flatpak!仅供参考,请注意。)查看该 UNIX 套接字文件。稍后会证明,当您将该符号链接移动到其他任何地方时,这不起作用(即使另一个文件名已经阻止它工作 - 我已经尝试了很多东西。)。

但是,$XDG_RUNTIME_DIR通常在关机时删除。所以我们需要在启动/用户登录时重新创建它。对我们有好处,已经是一个工具。(当然,您也可以在自动启动中修改 shell 脚本,但这很丑陋。)这就是我们使用systemd-tmpfiles 的原因。(tmpfiles.d的手册页实际上对我们更有用。)

  1. ~/.local/share/user-tmpfiles.d。同样,该user-tmpfiles.d目录很可能还不存在。如果是这样......好吧......你知道该怎么做......
  2. 现在下载并放置以下配置文件:kpxc_server.conf
    这基本上是一个配置文件,systemd-tmpfiles它说它为用户创建符号链接。
  3. 重新启动,以便systemd-tmpfiles可以应用更改并创建配置文件。(或者,您也可以手动运行systemd-tmpfiles --user --create以应用更改。)

万岁!:然后启动 KeePassXC flatpak,然后启动Firefox,它应该能够连接。:tada:

请注意下面的“现有问题”部分。

存在的问题

  • 如果文件(分别是符号链接目标)尚不存在,Firefox 出于某种原因无法看到该$XDG_RUNTIME_DIR/kpxc_server文件。实际上,这会导致一个很大的缺点:总是需要Firefox之前启动KeePassXC
  • 出于一些更奇怪的原因,如果您有这种变通方法设置,则运行非扁平化原生 Firefox 并通过在 flatpak 内生成代理(如flatpak run org.keepassxc.KeePassXC)来连接它的常用方法可能无法正常工作。再次删除符号链接以使其工作。

调试提示

  • 在 Firefox 中用于about:debugging访问附加组件内部。keepassxc-browser@keepassxc.org是附加 ID。它实际上还记录了失败的尝试。请注意,当它无法启动代理时和它可以启动代理时有不同的结果(日志和可见),但没有连接成功(因为 UNIX 套接字不存在,例如)
  • 要手动进入 flatpak 并在 shell 中“查看”它可以访问/看起来像什么,请使用类似flatpak run --command=/bin/sh org.mozilla.firefox.
  • 要检查套接字文件是否可访问(符号链接可以指向不存在的文件)cat,您将看到一个奇怪的错误,cat无法找到资源

我尝试过的事情

事情做工作: 保存作未来的解决方案,更好的解决办法™。

  • 里面的所有东西$XDG_RUNTIME_DIR/app都是高度沙盒化的,即使使用 flatpak 覆盖,我也无法让 Firefox flatpak 读取../org.keepassxc.KeePassXC目录的内容。即使在它自己的目录中有疯狂的符号链接。(尽管尝试一下,也许你会成功!至少你会学到一些东西。:wink:.)
  • 但有效的是:您可以覆盖 KeePassXC flatpak 以访问 Mozilla。不过只能访问!因此,如果它将代理放在那里(再次:这里的符号链接不起作用!),Firefox 也可以读取它。
  • 符号链接必须由沙箱外的应用程序创建。在它内部,它再次被沙盒化了,并且只有在它内部可见。

最后的笔记

这花了相当长的时间才弄明白。

我确实尝试继续改进此解决方法并在此 GitHub 问题中找到解决方案。如果您有兴趣,最好关注那里。


在 Fedora 社区Flathub 论坛中交叉发布了这个问题和答案。