什么时候使用pkexec与gksu / gksudo?


77

有两种一般的方法可以以root用户(或更一般地,以其他用户身份)以图形方式运行应用程序。喜欢的程序gksugksudo以及kdesudo用于图形前端sudo。相反,pkexecPolicyKit的图形前端。

手动运行的程序作为根(或作为另一非根用户),什么是使用的优点/缺点(如有的话)pkexec,与使用更传统的方法sudo前端?




相关(但不是重复的):sudo -i不如pkexec安全吗?
伊莱亚·卡根

Answers:


25

PolicyKit更具可配置性,尽管pkexec没有利用此可配置性。另外,pkexec向用户显示将要启动的程序的完整路径,以使用户更加确定会发生什么。PolicyKit的所谓“策略”可用于设置更多的预付款设置。例如,是否应该记住密码。

我从pkexec手册中得到的东西:

为了避免通过LD_LIBRARY_PATH或类似机制注入代码,将PROGRAM运行它的环境设置为最小的已知和安全环境。另外,PKEXEC_UID环境变量被设置为调用pkexec的进程的用户ID。结果,由于未设置$ DISPLAY环境变量,pkexec将不允许您以另一个用户身份运行X11应用程序。

关于更多信息,政策行动的定义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).

1
我想我应该说有两个以图形身份验证作为根运行应用程序的方法。我以为有一种方法可以pkexec用来运行图形应用程序(我从未这样做过……)。您的答案说明了为什么没有(或者至少为什么必须指定自定义环境才能这样做)。
伊利亚·卡根

1
但是,我确实有一个关于您答案的问题—当以root身份运行程序时pkexec,在什么意义上可以限制功能(“权限”)?我授予程序使用sudosudo前端运行程序时执行任何操作的能力...在什么意义上以root身份运行程序pkexec也不能这样做?
伊利亚·卡根

3
我了解PolicyKit用于允许程序仅执行特定类型的操作。但这是否pkexec促进了这一点,还是pkexec只是以不受限制的能力作为root运行事物?pkexec您包含在答案中的手册摘录记录了如何编写规则来确定谁可以以root用户(或另一个非root用户)身份运行程序,而不是程序可以做什么。
伊利亚·卡根

4
我想接受您的回答,因为它提供了很多很好的信息。但是我觉得这很容易引起误解,因为它说它pkexec比更具可配置性sudo,并且鉴于我们在评论中进行的讨论,情况似乎并非如此。您会考虑编辑答案以说明explicate sudo的可配置性并将其与pkexecs 进行比较/对比,还是会编辑您的答案以说区别不在于可配置性?
伊利亚·卡根

2
“简单地写”,然后是XML块。我需要那个笑声。
尔根·艾哈德

14

使用sudo可以在sudo上下文中为每个用户和每个程序设置有关保留或重置调用者环境的策略。默认情况下设置env_reset策略。

如果没有显式配置,则无法通过pkexec运行图形应用程序。因为这仅仅是环境重置的结果,所以对于sudo显然也是如此。但是请注意,pkexec和sudo都不能阻止恶意应用程序以root身份运行以从显示管理器或用户X11-cookie文件中检索所有必要信息。后者,或者两者相似,甚至可以根据情况通过非root用户应用程序来完成。

Sudo不需要明确的用户列表。列出任何用户组,甚至一般都可以为所有用户设置权限。target_pw指令允许那些用户在想要运行应用程序(即root)的上下文中使用用户的凭据进行身份验证。除此之外,同样传统的su(su / gtksu / kdesu)程序无需特殊配置即可用于执行相同的操作。

sudo也允许用户在指定时间内保持身份验证。该选项名为超时,可以按用户或每个应用程序全局配置。可以按tty保留身份验证,也可以按用户全局保留身份验证。

虽然pkexec可能不验证传递给PROGRAM的ARGUMENTS,但sudo确实具有此功能。当然,您可以轻松地将其弄乱,并且通常不会这样做。

您可以稍微调整一下如何通过pkexec运行程序:图标,要显示的文本,甚至还可以包含本地化内容。视情况而定,这确实很不错。可悲的是,有人觉得有必要为此功能重新发明轮子。这可能会放入图形化的gtksudo / kdesu包装器中。

那时,Policykit只是一个集中式配置框架。不幸的是不是一个漂亮的人。PK XML文件比应用程序本可以提供的缺少二进制文件的任何文件都要复杂得多。而且没有人会如此疯狂地使用二进制文件...哦gconf ...没关系。


8
我投下反对票是因为这篇文章并不是真正的答案,它是对另一个答案的批评。如果您觉得使用sudo而不是pkexec通常是更好的选择,请这样说,并通过这些反驳来说明您的观点。
Flimm 2013年

4
感谢Paul,在这里提供了许多有用的分析!但是我也同意弗利姆。您能从所要求的问题的简单答案开始吗?
nealmcb

1
不,pkexec 可以不配置即可运行GUI:askubuntu.com/a/332847/89385
akostadinov

8

有几件事情是如何pkexec不同于sudo其前端:

  1. 如果pkexec没有显式配置图形应用程序,则无法运行它。
  2. 您可以通过以下方式稍微调整一下程序的运行方式pkexec:图标,显示的文字,是否记住密码,是否允许其以图形方式运行等等。
  3. 任何人都可以以超级用户身份运行“运行身份”(前提是他们可以以此身份进行身份验证),而sudo您必须在sudoers文件中以admin身份列出。
  4. gksudo要求输入密码时锁定键盘,鼠标和焦点pkexec。在这两种情况下,击键都是可闻的
  5. pkexec您一起在稍微消毒的环境中工作。

尝试例如:

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

好点(#3)如何可以为其他用户的身份运行程序为rootpkexec。它是可配置的,哪些用户可以使用pkexec(即使他们知道允许这样做的另一个用户的密码)?su可以通过这种方式配置。当我尝试在Oneiric系统上尝试使用su另一个非root用户时guest,它告诉我不允许这样做。(相反,当我尝试在Oneiric或Precise上使用pkexecas guest时,我得到了看起来像断言错误的错误,我可能会很快将其报告为错误,因为即使不允许,我也不会得到该错误。)
Eliah Kagan

2
但是sudo,它的前端也可以按照第2点所述进行调整。您可以运行带有gksugksudo 显示自定义文本的程序,通过编辑/etc/sudoers(使用visudo)停止使用某些用户的密码,并从改变方式的角度更改记住他们的时间。 sudo超时所需的时间很长(尽管我不确定如何在Ubuntu上执行此操作,Ubuntu已配置为是否sudo需要密码以及再次需要多长时间才是特定于终端的问题)。
伊利亚·卡根

如果使用GNOME Shell,则#4不是正确的。
muru 2014年

否,无需配置pkexec 即可运行GUI:askubuntu.com/a/332847/89385
akostadinov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.