Password

如何在 flatpak 中設置 Firefox 和 KeePassXC 並讓 KeePassXC-Browser 外掛工作?

  • April 20, 2022

如果 KeePassXC在 Flatpak 中被沙盒化,瀏覽器只能訪問它,前提是它們沒有被沙盒化,即在主機上安裝為 deb/rpm 包或類似包。對瀏覽器(即Firefox和 KeePassXC)進行沙箱處理——或者至少是瀏覽器並在本地安裝 KeePassXC,出於安全原因,您實際上想要這樣做——是不可能的。

TL;博士:

  • 這應該開箱即用:Firefox(主機安裝),KeePassXC(來自 flathub 的 flatpak)
  • 這不是:Firefox(沙盒),KeePassXC(主機或沙盒,沒關係)

那麼如何讓這種溝通發揮作用呢?

背景

如果你只是想要解決方案,你可以跳過這部分。但是對於好奇的人,我將解釋我們面臨的問題:

  • KeePassXC 創建一個 UNIX 套接字供應用$XDG_RUNTIME_DIR/kpxc_server程序監聽。由瀏覽器(由外掛觸發,即 KeePassXC-Browser)啟動-keepassxc-proxy通過本機消息傳遞,並嘗試在該套接字上偵聽以查找消息。keepassxc-browser@keepassxc.org
  • 如果 Firefox 沒有沙盒,該代理可以照常啟動。它唯一可能需要做的就是進入 KeePassXC flatpak。
  • Flathub KeePassXC有一個更新檔,允許通過 啟動 keepassxc-proxy flatpak run,即 Firefox 現在可以執行
  • 也就是說,到目前為止,為什麼主機上安裝的 Firefox 確實有效……
  • 現在為什麼如果將 Firefox 作為 flatpak 安裝它就不起作用:Mozilla 非常好的官方 Firefox flatpak確實沒有多少權限作為瀏覽器。例如,它沒有對文件系統的任何通用訪問權(它使用門戶)。無論如何,無論它做什麼,它都不能做一件事:在主機或另一個 flatpak 中生成一個程序

所以我們可以通過製作包裝腳本並使用 flatpak-spawn讓 Firefox 逃離它的沙箱來解決這個問題。然而,看到 Firefox 沙盒已經建構得多麼可愛和非常安全,我不敢破壞這樣一個功能的安全性。畢竟,從安全 POV 開始,您也可以再次在主機上安裝 Firefox。好消息即將到來:此解決方案保留了所有沙箱和安全方面!

然而,即使我們已經解決了 Firefox 必須執行代理的事實,還有更多的問題。劇透,這是我們需要解決的要點:

  1. 通過 Firefox 啟動 keepassxc-proxy(解決方案:我們在 Firefox 沙箱中執行它)
  2. 允許 Firefox 訪問 KeePassXC 的套接字 注意:在該步驟中,您已經可以執行變體: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 中執行。對我們有好處:它沒有很多依賴項,可以作為獨立應用程序使用。

  2. 所以我選擇了Rust 代理應用程序(因為我為什麼不應該?🙃)。如果你相信我,你可以在下面得到我編譯的二進製文件,只需向前跳到兩步。

  3. 複製 git repo 並編譯它(執行cargo build --release)。

  4. 您可以在 中找到結果./target/release。使用 rustc 1.43.0(Fedora 32 中的目前穩定版本)為 x86_64 編譯的keepassxc-proxy二進製文件 version 211ae91(如果它有幫助並且您想了解更多.rustc_info.json。雖然Rust 還沒有(還)完全可重複編譯,但我確實在兩台使用 Fedora 32 的機器上得到了相同的逐位結果。SHA-256 雜湊是c5c4c6c011a4d64f7e4dd6c444dcc70bee74d23ffb28c9b65f7ff6d89a8f86ea. 所以,如果你有冒險的心情,你可以**在這裡下載我的 keepassxc-proxy 二進製文件**。(由 GitHub 託管;P

  5. 現在我們需要告訴 Firefox 新的二進製文件。

  6. ~/.var/app/org.mozilla.firefox/.mozilla/native-messaging-hosts。實際上,native-messaging-hosts可能還不存在,所以一定要創造它。

  7. 在其中創建一個文件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"
}

注意,只有絕對路徑有效(我猜),所以`REPLACE_WITH_USERNAME`用你的`$USER`名字替換,這樣路徑就會指向它自己的工作目錄。
 你看我在做什麼:我們現在將下載/編譯的文件`keepassxc-proxy` **放在同一個目錄**中。顯然,您可以在那裡使用任何其他路徑,但這是 Firefox 顯然可以訪問的第一個路徑,並且您將所有內容都放在一個地方。(如果您有更好的建議,請隨時告訴我。)  

意:*`chmod +x`如果不是,請記住使其可執行( )。


允許 Firefox 訪問套接字
----------------


預設情況下,KeePassXC 在`$XDG_RUNTIME_DIR/kpxc_server`. 所以這就是我們需要讓 Firefox flatpak 訪問(只讀顯然就足夠了)。


幸運的是,這很容易。趕緊跑:

$ sudo flatpak override –filesystem=xdg-run/kpxc_server:ro org.mozilla.firefox


**萬歲!:**對於那些**在主機上**安裝 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](https://www.freedesktop.org/software/systemd/man/systemd-tmpfiles.html)的原因。([tmpfiles.d](https://www.freedesktop.org/software/systemd/man/tmpfiles.d)的手冊頁實際上對我們更有用。)


1. 去`~/.local/share/user-tmpfiles.d`。同樣,該`user-tmpfiles.d`目錄很可能還不存在。如果是這樣……嗯……你知道該怎麼做……
2. 現在下載並放置以下配置文件:**[kpxc_server.conf](https://gist.github.com/rugk/96b778603037a6bc5a690d7bac178c79)**  

這基本上是一個配置文件,`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 問題](https://github.com/flathub/org.keepassxc.KeePassXC/issues/29)中找到解決方案。如果您有興趣,最好關注那裡。




---


[我已經在 Fedora 社區](https://discussion.fedoraproject.org/t/how-to-run-firefox-and-keepassxc-in-a-flatpak-and-get-the-keepassxc-browser-add-on-to-work/19452?u=rugk)和[Flathub 論壇中](https://discourse.flathub.org/t/how-to-run-firefox-and-keepassxc-in-a-flatpak-and-get-the-keepassxc-browser-add-on-to-work/437/2?u=rugk)交叉發布了這個問題和答案。

引用自:https://unix.stackexchange.com/questions/584521