无密码 pkexec 给非特权用户

无密码 pkexec 给非特权用户

由于多种原因,我想在我的 Fedora 机器上以不同的系统用户身份运行我的浏览器。

目前,我创建了一个名为的单独系统用户,并使用我的用户为 Google Chromesandbox创建了一个自定义文件:~/.local/share/applications/chrome-sandboxed.desktop

#!/usr/bin/env xdg-open
[Desktop Entry]
Version=1.0
Terminal=false
StartupNotify=true
Type=Application
Categories=Network;WebBrowser;
MimeType=x-scheme-handler/unknown;x-scheme-handler/about;text/html;text/xml;application/xhtml_xml;image/webp;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;
Name=Google Chrome (sandboxed)
Exec=sh -c "xhost +SI:localuser:sandbox && pkexec --user sandbox env DISPLAY=$DISPLAY /usr/bin/google-chrome-stable %U && true"
Icon=google-chrome
Actions=new-window;new-private-window;

[Desktop Action new-window]
Name=New Window
Exec=sh -c "xhost +SI:localuser:sandbox && pkexec --user sandbox env DISPLAY=$DISPLAY /usr/bin/google-chrome-stable && true"

[Desktop Action new-private-window]
Name=New Incognito Window
Exec=sh -c "xhost +SI:localuser:sandbox && pkexec --user sandbox env DISPLAY=$DISPLAY /usr/bin/google-chrome-stable --incognito && true"

经过一番努力和研究,我发现我需要允许sandbox用户在我的会话中打开窗口xhost +SI:localuser:sandbox然后pkexec命令必须包含在sh -c ""以以下结尾的单独命令中&& true因为在 Gnome 中它不起作用。我甚至得到了这个通过运行设置为我的默认浏览器xdg-settings set default-web-browser chrome-sandboxed.desktop,因为它之前没有出现在用于选择默认应用程序的 GUI 工具中。

现在唯一困扰我的事情是,每次我点击另一个应用程序(例如 Thunderbird)中的链接时,我都必须输入密码进行身份验证pkexec并以另一个用户的身份运行该程序(即使它会意识到已经有一个进程正在运行并在现有窗口的新选项卡中打开链接 - 但我猜该逻辑是在应用程序本身中实现的,因此只能在身份验证发生并启动进程后才能启动)。

因为我不在乎我的用户是否能够访问sandbox用户的东西(我想阻止相反的情况),所以我想不用密码来做这件事。不过,我不确定如何实现这一点。

我读到可以通过创建policykitACL 来实现。但由于我不想一般来说禁用密码提示我不知道自定义“应用程序”的名称,似乎与微调配置有关(如果我正确理解了答案中的语法)我不知道如何仅为此应用程序禁用密码提示(也许将来还会禁用其他应用程序的密码提示)。

任何帮助将不胜感激。

附言:抱歉,该标签sudo可能令人困惑,但我需要 300 点声誉(我没有)才能创建新标签pkexec


编辑

按照以下提示操作即可用户1686回答

首先,(如果还没有的话)创建一个自定义policykit策略文件来配置action id所需的程序 - 在我的情况下/usr/share/polkit-1/actions/com.google.chrome.sandboxed.policy(请注意,在这个默认策略中auth_admin仍然是需要的):

<?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>Google</vendor>
    <vendor_url>https://www.google.com</vendor_url>
    <icon_name>google-chrome</icon_name>
    <action id="com.google.chrome.sandboxed">
        <description>Run Google Chrome as another user</description>
        <message>Authentication is required to run Google Chrome as another user</message>
        <defaults>
            <allow_any>auth_admin</allow_any>
            <allow_inactive>auth_admin</allow_inactive>
            <allow_active>auth_admin</allow_active>
        </defaults>
        <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/google-chrome-stable</annotate>
        <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
    </action>
</policyconfig>

然后,创建一个自定义规则,仅允许为您的用户执行无密码配置的操作action id(此处)——就我的情况而言:com.google.chrome.sandboxed/var/lib/polkit-1/localauthority/50-local.d/10-passwordless_chrome-sandboxed_from_myuser.pkla

[No pkexec password prompt for myuser when running chrome-sandboxed]
Identity=unix-user:myuser
Action=com.google.chrome.sandboxed
ResultActive=yes

env DISPLAY=$DISPLAY之后,从文件中删除所有出现的.desktop,否则pkexec尝试env以其他用户身份执行/usr/bin/google-chrome-stable用户1686指出,所需的环境变量会自动继承到子进程,因此不再需要它。

您可能需要systemctl reload polkit.servicesystemctl restart polkit.service,但我不确定,因为我认为这就是它一开始对我来说不起作用的原因 - 尽管我只是忘了更改我的.desktop文件。

现在它的运行正如预期。

答案1

GParted 的处理方式如下:

<?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>The GParted Project</vendor>
    <vendor_url>https://gparted.org</vendor_url>
    <icon_name>gparted</icon_name>
    <action id="org.gnome.gparted">
        <description>Run GParted as root</description>
        <message>Authentication is required to run the GParted Partition Editor as root</message>
        <defaults>
            <allow_any>auth_admin</allow_any>
            <allow_inactive>auth_admin</allow_inactive>
            <allow_active>auth_admin</allow_active>
        </defaults>
        <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/gparted</annotate>
        <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
    </action>
</policyconfig>

注意这两个<annotate/>标签。

安装此策略后,系统pkexec /usr/bin/gparted会自动为简单策略分配不同的策略套件“操作 ID”(因此您可以定义不同的默认值,也可以在自定义规则中匹配它)。您也不需要手动传递 $DISPLAY – pkexec 会自动复制所有必要的变量。

相关内容