答案1
PolicyKit 更具可配置性,尽管pkexec
它没有利用这种可配置性。此外,pkexec
它向用户显示将要启动的程序的完整路径,以便用户更清楚会发生什么。PolicyKit 的所谓“策略”可用于设置更多高级设置。例如,是否应记住密码。
我从pkexec
手册中得到了一些东西:
PROGRAM 运行的环境将被设置为最小已知且安全的环境,以避免通过 LD_LIBRARY_PATH 或类似机制注入代码。此外,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).
答案2
使用 sudo,您可以为每个用户和每个程序设置策略,决定是否在 sudo 上下文中保留或重置调用者环境。默认情况下会设置 env_reset 策略。
如果不明确配置 pkexec,则无法通过 pkexec 运行图形应用程序。因为这仅仅是环境重置的结果,所以对于 sudo 来说显然也是如此。但请注意,pkexec 和 sudo 都无法阻止以 root 身份运行的恶意应用程序从显示管理器或用户 X11-cookie 文件中检索所有必要信息。后者(两者或类似)甚至可能由非 root 应用程序根据情况完成。
Sudo 不需要明确列出用户。可以列出任何用户组,甚至可以为所有用户设置权限。target_pw 指令允许这些用户使用他们想要在其上下文中运行应用程序的用户(即 root)的凭据进行身份验证。除此之外,同样传统的 su (su / gtksu / kdesu) 程序也可用于执行相同操作,无需特殊配置。
sudo 也允许用户在指定的时间内保持身份验证。该选项名为 timeout,可全局、按用户或按应用程序配置。身份验证可以按 tty 保留,也可以按用户全局保留。
虽然 pkexec 可能不验证传递给 PROGRAM 的参数,但 sudo 确实有这个功能。不过必须承认,你很容易搞砸这个功能,而且通常不会这样做。
您可以稍微调整一下程序如何通过 pkexec 运行:图标、要显示的文本,甚至可以包含本地化内容等等。根据具体情况,这确实很有用。但遗憾的是,有人觉得需要为此功能重新发明轮子。这可能是图形 gtksudo/kdesu 包装器中的内容。
Policykit 只是一个集中式配置框架。不幸的是,它并不漂亮。PK XML 文件比应用程序原生提供的任何东西都复杂得多,缺少二进制文件。而且没有人会疯狂地使用二进制文件……哦,gconf……算了。
答案3
与它的前端有以下几点pkexec
不同:sudo
pkexec
如果没有明确配置,您就无法通过它运行图形应用程序。- 您可以稍微调整一下程序的运行方式
pkexec
:图标、显示的文本、是否记住密码、是否允许以图形方式运行等等。 - 任何人都可以以超级用户身份运行“以超级用户身份运行”(前提是他们可以进行身份验证),并且
sudo
你必须在sudoers
文件中列出为行政。 gksudo
在要求输入密码时锁定键盘、鼠标和焦点,pkexec
否则则不会。在两种情况下尽管按键音是可以嗅探的。- 让
pkexec
您在稍微更加洁净的环境中工作。
例如尝试:
cd /etc/init.d
sudo cat README
# and now the same with pkexec
pkexec cat README
# nice, huh?