PolicyKit

FlossDoc,自由中文開源知識庫

PolicyKit 是一個在 Unix 兼容系統控制權限的應用程式工具。它為現代桌面提供一個中央框架去處理授權一般應用程式進行特權工作。它不像 sudo 般容於整個程式以系統管理員身份運行,而容許較細緻的權限控制。

PolicyKit 由 Red Hat 工程師 David Zeuthen 提出、開發和維護[1],現為 FreeDesktop 專案之一。2007 年間,開發中的 Fedora 8 最先引入 PolicyKit[2],而其他 GNU/Linux 包括而 OpenSUSE 10.3Ubuntu 8.04 LTS 等亦在 2007 件尾至 2008 年間逐步使用 PolicyKit。

目录

歷史

傳統上 Unix/Linux 的存取權限較簡單,一般程式要進行如安裝程式和掛載 USB 手指等較高權力的操作都需要以超級使用者 (使用者 root) 權限執行的助理程式 (helper program) 協助或使用 su/sudo 等將整個程式以超級使用者權行執行。這做法不完善且有以下問題:[3]

  • 傳統機制很粗糙 - 無法指定個別使用者是否有權更仔細的特權工作,例如可以掛載 USB 手指等可移除裝置但不可以掛載如硬碟等固定裝置。
  • su/sudo 本質上有致命問題 - 以超級使用者權限執行如 synaptic 和 nautilus 等圖形介面程式令大量程式碼以高權力執行,直接違背『最小權限原則』。越大的程式,越高機會有安全漏洞。此外,這裡程式使用了超級使用者的偏好設定,甚表現和外權和其他應用程式可能有分別。例如布景主題不同,存取桌面資料夾變成超級使用者的桌面資料夾。
  • UNIX 使用者群組一直有安全題 - 使用者可以利用 setgid 在其離開某使用者群組後,亦可以擁有該使用者群組權限。 (把 bash 複製至自己的目錄,將所屬群組轉成要保留權限的群組並設定 setgid 位元)
  • 設定分散 - 因為欠缺中央框架,存取控制設定分散在系統多個地方並以多個不同格式和方法存放,這令系統管理員難以管理。

2006 年,Red Hat 工程師 David Zeuthen 提出 PolicyKit 以一個中央政策系統處理以上問題。[1]

原理

PolicyKit 將和其互動的程式分成兩類:

  • Mechanism - 真正進行包括掛載、格式化儲存裝置和連接特定無線網絡等各類操作的程式。以高權限執行,一般為沒有使用者界面的背景服務 (daemon)。例如 GNOME/KDE/Xfce 的裝置管理系統 HALudisks,網絡管理程式 NetworkManager 等。
  • 用戶端 (Client) - 以一般使用者權限執行,一般會直接和使用者應對的前端。會透過如 D-BUS 或 pipe 等 IPC 機制和 mechanism 程式通訊並叫用 mechanism 進行各類操作。早期 PolicyKit 稱為 Policy Agent。例如檔案管理員如 NautilusDolphinThunar,NetworkManager 面板程式 (Network manager Applet) 等。

Mechanism 程式需要仔細檢查每個用戶端發出的請求,以確保整個系統的安全。而 PolicyKit 本身則由兩個主要部份組成:[4]

  • Authority - 一個 D-Bus 服務管理所有政策庫。Mechanism 程式可以透過 D-Bus API 詢問 Authority 任何使用者是否有權進行特權操作。系統管理員可以透過修改設定檔控制不同使用者對不同操作的權限。
  • 認証代理 (Authentication Agent) - 用作確認操作使用者作業階段 (user session) 的使用者身份,例如要求使用者輸入自已的密碼再確認自己的身份或要求系統管理員輸入密碼授權等。

以下以應用程式掛載磁碟作例子說明 PolicyKit 的運作[5][6]

  1. 當一個用戶端程式需要進行一項操作時,它會向相關 mechanism 程式發出要求進行該操作。以 GNOME 的情況,檔案管理員 Nautilus 會令 GVFS (用戶端) 以 D-BusHALudisks (mechanism) 發出掛載 USB 手指上檔案系統請求。
  2. mechanism 程式發覺該操作是一個高權力操作,它會先詢問 PolicyKit 的 Authority 有關使用者或用戶端程式是否有權進行該操作。HAL/udisks 會由 ConsoleKit 取得使用者的資料並詢問 PolicyKit Authority 有關使用者是否有權掛載如 USB 手指等可移除裝置。
  3. PolicyKit Authority 會檢查該使用者或用戶端程式是否有權進行該操作,並把結果傳回 mechanism 程式。結果除了可以是有權或無權外,亦可以要求使用者確認身份 (可以指定輸入使用者自己還是系統管理員的密碼) 來取得授權。
  4. 如果 PolicyKit Authority 的回覆為有權,Mechanism 程式進行該操作,否則會回覆用戶端程式 PolicyKit Authority 的傳回的結果。HAL/udisks 會以 D-Bus 例外 (Exception) 通知 GVFS PolicyKit Authority 的回覆。
  5. 如果結果是要求取得授權,用戶端程式會要求 PolicyKit 的 Authentication Agent 授權使用者進行該操作。GVFS 向 PolicyKit GNOME Authentication Agent 要求授權使用者掛載可移除裝置。
  6. PolicyKit Authentication Agent 會透過一些方法認證使用者,包括彈出對話窗要求系統管理員輸入密碼授權或使用者輸入自己的密碼確認身份。系統管理員可以在對話窗設定相關授權的有限時間 (是永久或只是一次性質授權)。認證成功後,Authentication Agent 會將相關 cookie 記錄入 Authority。
  7. Authentication Agent 回覆用戶端程式授權已成功。
  8. 用戶端程式會再次要求 mechanism 程式進行該操作。GVFS 再次向 HAL/udisks 要求掛載 USB 手指上檔案系統。
  9. Mechanism 程式再次詢問 PolicyKit Authority。
  10. PolicyKit Authority 回答 mechanism 程式。
  11. Mechanism 程式進行該操作,並在成功後回覆用戶端程式

監察及除錯

  • pkcheck - 檢查某進程是否有權進行某特權操作,例如: pkcheck --action-id org.freedesktop.udisks.filesystem-mount --process 2450
  • pkaction - 列出所有特權操作或取得某特權操作的資訊,例如: pkaction --action-id org.freedesktop.udisks.filesystem-mount --verbose
  • pkexec - 以另一個使用者身份執行一個命令,例如: pkexec --user guest nautilus --browse file:///home/guest

相關目錄及檔案

參考資料

  1. 1.0 1.1 Zeuthen, David (2006-03) libhal-policy -> PolicyKit HAL Mailling List.
  2. Fedora Project (2007-10-03) Release Feature - PolicyKit. Fedora Project.
  3. Zeuthen, David (2007) Defining the Problem. PolicyKit Library Reference Manual, version 0.8. FreeDesktop.org.
  4. Zeuthen, David (2009) polkit(8) - Authorization Framework. PolicyKit Reference Manual, version 0.96. FreeDesktop.org.
  5. Zeuthen, David (2006) A picture says more. System Integration and the GNOME desktop. GUADEC 2006. P.42.
  6. Zeuthen, David (2007) Theory of Operation. PolicyKit Library Reference Manual, version 0.8. FreeDesktop.org.

請參看

外部連結

Personal tools
廣告橫額