當前位置: 首頁>>技術教程>>正文


何時使用pkexec與gksu/gksudo?

, , , , ,

問題描述

有兩種通用的方法以root身份(或者更一般地說,作為另一個用戶)以圖形方式運行應用程序。像gksugksudokdesudo這樣的程序是sudo的圖形前端。相反,pkexecPolicyKit的圖形前端。

以root用戶(或另一用戶,non-root用戶)手動運行程序時,與使用sudo前端的更傳統方法相比,使用pkexec有哪些優點/缺點(如果有的話)?

最佳解決辦法

PolicyKit更具可配置性,但pkexec不使用此可配置性。另外,pkexec向用戶顯示將要啟動的程序的完整路徑,以便用戶更確定會發生什麽。 PolicyKit的so-called’策略’可用於設置更多高級設置。例如,是否應該記住密碼。

我從pkexec手冊中獲得的一些內容:

The environment that PROGRAM will run it, will be set to a minimal known and safe environment in order to avoid injecting code through LD_LIBRARY_PATH or similar mechanisms. In addition the PKEXEC_UID environment variable is set to the user id of the process invoking pkexec. As a result, pkexec will not allow you to run e.g. X11 applications as another user since the $DISPLAY environment variable is not set.

有關pkexec手冊中的策略或操作定義的更多信息:

   To specify what kind of authorization is needed to execute the program    /usr/bin/pk-example-frobnicate as another user, simply write an action    definition file like this         <?xml version="1.0" encoding="UTF-8"?>        <!DOCTYPE policyconfig PUBLIC         "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"         "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">        <policyconfig>           <vendor>Examples for the PolicyKit Project</vendor>          <vendor_url>http://hal.freedesktop.org/docs/PolicyKit/</vendor_url>           <action id="org.freedesktop.policykit.example.pkexec.run-frobnicate">            <description>Run the PolicyKit example program Frobnicate</description>            <description xml:lang="da">Kør PolicyKit eksemplet Frobnicate</description>            <message>Authentication is required to run the PolicyKit example program Frobnicate</message>            <message xml:lang="da">Autorisering er påkrævet for at afvikle PolicyKit eksemplet Frobnicate</message>            <icon_name>audio-x-generic</icon_name>            <defaults>              <allow_any>no</allow_any>              <allow_inactive>no</allow_inactive>              <allow_active>auth_self_keep</allow_active>            </defaults>            <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/pk-example-frobnicate</annotate>          </action>         </policyconfig>     and drop it in the /usr/share/polkit-1/actions directory under a    suitable name (e.g. matching the namespace of the action). Note that in    addition to specifying the program, the authentication message,    description, icon and defaults can be specified. For example, for the    action defined above, the following authentication dialog will be    shown:         [IMAGE][2]             +----------------------------------------------------------+            |                     Authenticate                     [X] |            +----------------------------------------------------------+            |                                                          |            |  [Icon]  Authentication is required to run the PolicyKit |            |          example program Frobnicate                      |            |                                                          |            |          An application is attempting to perform an      |            |          action that requires privileges. Authentication |            |          is required to perform this action.             |            |                                                          |            |          Password: [__________________________________]  |            |                                                          |            | [V] Details:                                             |            |  Command: /usr/bin/pk-example-frobnicate                 |            |  Run As:  Super User (root)                              |            |  Action:  org.fd.pk.example.pkexec.run-frobnicate        |            |  Vendor:  Examples for the PolicyKit Project             |            |                                                          |            |                                  [Cancel] [Authenticate] |            +----------------------------------------------------------+     If the user is using the da_DK locale, the dialog looks like this:         [IMAGE][3]             +----------------------------------------------------------+            |                     Autorisering                     [X] |            +----------------------------------------------------------+            |                                                          |            |  [Icon]  Autorisering er påkrævet for at afvikle         |            |          PolicyKit eksemplet Frobnicate                  |            |                                                          |            |          Et program forsøger at udføre en handling der   |            |          kræver privilegier. Autorisering er påkrævet.   |            |                                                          |            |          Kodeord: [___________________________________]  |            |                                                          |            | [V] Detaljer:                                            |            |  Bruger:   Super User (root)                             |            |  Program:  /usr/bin/pk-example-frobnicate                |            |  Handling: org.fd.pk.example.pkexec.run-frobnicate       |            |  Vendor:   Examples for the PolicyKit Project            |            |                                                          |            |                                [Annullér] [Autorisering] |            +----------------------------------------------------------+     Note that pkexec does no validation of the ARGUMENTS passed to PROGRAM.    In the normal case (where administrator authentication is required    every time pkexec is used), this is not a problem since if the user is    an administrator he might as well just run pkexec bash to get root.     However, if an action is used for which the user can retain    authorization (or if the user is implicitly authorized), such as with    pk-example-frobnicate above, this could be a security hole. Therefore,    as a rule of thumb, programs for which the default required    authorization is changed, should never implicitly trust user input    (e.g. like any other well-written suid program). 

次佳解決辦法

使用sudo,您可以設置每個用戶和每個計劃策略,以便在sudo環境中保留或重置呼叫者環境。 env_reset策略默認設置。

您不能通過pkexec運行圖形應用程序,而無需顯式配置它。因為這隻是環境重置的結果,所以sudo顯然也是如此。但是請注意,pkexec和sudo都不能阻止以root用戶身份運行的惡意應用程序從顯示管理器或用戶X11-cookie文件中檢索所有必要的信息。後者,既可以是相似的,也可以是根據情況由非根應用程序完成的。

Sudo不需要明確列出用戶。列出任何用戶組或者甚至為所有用戶設置權限都可以完成。 target_pw指令允許這些用戶在他們想要運行應用程序的whoose上下文中(即root)使用用戶憑證進行身份驗證。除此之外,同樣傳統的su(su /gtksu /kdesu)程序可以用來做同樣的事情,而無需特殊配置。

sudo也允許用戶在指定的時間內保持身份驗證。該選項名為timeout,可全局配置,每個用戶或每個應用程序。每個用戶可以保留每個用戶的身份驗證或全局用戶身份

盡管pkexec可能不會對傳遞給PROGRAM的ARGUMENTS進行驗證,但sudo確實具有此功能。雖然承認,你可以很容易地搞砸了,而且通常沒有完成。

您可以稍微調整一下您希望通過pkexec運行程序的方式:圖標,要顯示的文本,甚至可以擁有本地化內容等等。根據情況,這可能確實很漂亮。可悲的是,有人覺得有必要重新發明這個功能。這可能會被放入圖形gtksudo /kdesu包裝中。

那麽Policykit隻是一個集中的配置框架。不幸的是不是一個漂亮的。 PK XML-Files比任何應用程序本身可以提供的二進製文件都要複雜得多。而且沒有人會使用二進製代碼…哦gconf …沒關係。

第三種解決辦法

pkexecsudo及其前端不同之處:

  1. 您無法通過pkexec運行圖形應用程序,而無需顯式配置它。

  2. 您可以稍微調整一下您希望通過pkexec運行程序的方式:圖標,要顯示的文本,是否記住密碼,是否允許它以圖形方式運行等等。

  3. 任何人都可以運行”Run as”超級用戶(假設他們可以進行身份​​驗證),使用sudo您必須以管理員身份在sudoers文件中列出。

  4. gksudo在請求密碼時鎖定鍵盤,鼠標和焦點,pkexec不會。在這兩種情況下the keystrokes are sniffable though

  5. 使用pkexec,您可以在稍微更加衛生的環境中工作。

嘗試例如:

cd /etc/init.d
sudo cat README
# and now the same with pkexec
pkexec cat README
# nice, huh?

參考資料

本文由Ubuntu問答整理, 博文地址: https://ubuntuqa.com/zh-tw/article/977.html,未經允許,請勿轉載。