Flatpak打包(8)——應用Sandbox(沙盒)

全部文章目錄:
Flatpak打包(1)——Flatpak 介紹
Flatpak打包(2)——Flatpak應用元素
Flatpak打包(3)——應用Flatpak
Flatpak打包(4)——構建第一個Flatpak
Flatpak打包(5)——開始配置
Flatpak打包(6)——構建一個簡單的應用
Flatpak打包(7)——Flatpak Builder
Flatpak打包(8)——應用Sandbox(沙盒)
Flatpak打包(9)——應用分發
Flatpak打包(10)——可用運行時(Runtime)
Flatpak打包(11)——命令參考
Flatpak打包(12)——Flatpak-builder命令參考

flatpak的主要目標之一是通過將應用程序彼此隔離來提高桌面系統的安全性。這是使用沙盒完成的,並且這意味着,默認情況下,flatpak對主機環境的訪問權限非常有限。

  • 除運行時,應用程序和〜/.var/app/$APPID之外,不能訪問任何主機文件.只有最後一個是可寫的。
  • 無法訪問網絡。
  • 不能訪問任何設備節點(除了/dev/null等)。
  • 無法訪問沙箱外的進程。
  • 有限的系統調用。例如,應用程序不能使用非標準網絡套接字類型或ptrace其他進程。
  • 有限的訪問會話B-Bus實例 - 應用程序只能在bus上擁有自己的名字。
  • 無法訪問X,系統D-Bus或PulseAudio等主機服務。

大多數應用程序需要訪問其中一些資源才能發揮作用,而flatpak提供了多種方式讓應用程序訪問它們。
儘管應用程序可以使用哪些沙箱權限沒有限制,但作爲良好的做法,建議儘可能使用最少數量的權限。強烈建議不要使用某些權限,例如全面訪問系統總線(使用--socket = system-bus選項)。

配置沙箱權限

使用build-finish命令是配置沙箱權限的最簡單方法。就像在前面的例子中看到的那樣,這可以用來添加對圖形套接字和網絡的訪問:

$ flatpak build-finish dictionary2 --socket=x11 --share=network --command=gnome-dictionary

這些參數可以轉換爲應用程序元數據(metadata)文件中的幾個屬性:

[Application]
name=org.gnome.Dictionary
runtime=org.gnome.Platform/x86_64/3.22
sdk=org.gnome.Sdk/x86_64/3.22
command=gnome-dictionary

[Context]
shared=network;
sockets=x11;

build-finish允許將全部範圍的資源添加到應用程序中。這些選項也可以作爲finish-args屬性傳遞給flatpak-builder。
本頁底部的表格提供了許多沙箱權限的概述。完整列表也可以使用flatpak build-finish --help進行查看。

直到兼容沙盒的後端可用之前,則需要使用以下選項啓用對dconf的訪問:

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

Portals

Portals是應用程序可以通過它與沙箱內的主機環境進行交互的機制。通過這種方式,他們可以提供額外的功能來與數據,文件和服務進行交互,而無需添加沙盒權限。
接口工具包可以爲Portals實現透明支持。如果應用程序使用這些工具包之一,則不需要額外的工作來訪問它們。
可以通過Portals訪問的功能示例包括:

  • 禁止用戶會話結束,暫停,空閒或切換
  • 網絡狀態信息
  • 通知
  • 開放給URI
  • 用本機文件選擇器對話框打開文件
  • 打印
  • 截圖

不使用支持門戶的工具包的應用程序可以參考xdg-desktop-portal API文檔以獲取有關如何訪問它們的信息。

覆蓋沙箱權限

在開發應用程序時,重寫flatpak的沙箱配置有時會很有用。有幾種方法可以做到這一點。一種是使用flatpak run來覆蓋它們,它接受與build-finish相同的參數。例如,這會讓Dictionary應用程序看到您的主目錄:

$ flatpak run --filesystem=home --command=ls org.gnome.Dictionary ~/

flatpak override也可用於永久覆蓋應用程序的權限:

$ flatpak --user override --filesystem=home org.gnome.Dictionary
$ flatpak run --command=ls org.gnome.Dictionary ~/

也可以使用相同的方法刪除權限。可以使用以下命令查看刪除訪問文件系統時會發生的情況,例如:

$ flatpak run --nofilesystem=home --command=ls org.gnome.Dictionary ~/

可用的沙箱權限

flatpak提供了一系列用於控制沙箱權限的選項。以下是一些最有用的:

選項 作用
--filesystem=host 訪問所有文件
--filesystem=home 訪問主目錄
--filesystem=home:ro 訪問主目錄,只讀
--filesystem=/some/dir --filesystem=~/other/dir 訪問路徑
--filesystem=xdg-download 訪問XDG下載目錄
--nofilesystem=... 撤消上一層
--socket=x11 --share=ipc 使用x11顯示窗口[1]
--device=dri OpenGL渲染
--socket=wayland 使用 Wayland顯示窗口
--socket=pulseaudio 使用PulseAudio播放聲音
--share=network 訪問網絡[2]
--talk-name=org.freedesktop.secrets 與會話總線上的命名服務對話
--system-talk-name=org.freedesktop.GeoClue2 與系統總線上的命名服務對話
--socket=system-bus 無限制地使用所有的D-Bus

[1]: --share = ipc表示沙箱與主機共享ipc命名空間。這不一定是必需的,但如果沒有它,x共享內存擴展將不起作用,這對x性能非常不利。
[2]: 賦予網絡訪問權限還可以訪問偵聽抽象的unix套接字的所有主機服務(由於網絡名稱空間的工作原理),並且這些服務沒有權限檢查。這不幸地影響例如x服務器和默認偵聽抽象套接字的會話總線。一個安全的分佈應該禁用這些,只需使用普通的套接字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章