對非特權使用者進行無密碼 pkexec

對非特權使用者進行無密碼 pkexec

出於多種原因,我想在 Fedora 盒子上以不同的系統使用者身份運行瀏覽器。

現在,我創建了一個名為Google Chrome 的單獨系統用戶sandbox,並使用我的用戶建立了自訂檔案:~/.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 來完成。但既然我不想一般來說停用密碼提示我不知道自訂“應用程式”的名稱,似乎與微調配置相關(如果我正確理解了答案中的語法)我不知道如何停用此應用程式的密碼提示(也許將來還會有更多應用程式)。

任何幫助將不勝感激。

PS:抱歉,該標籤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 將自動複製所有必要的變數。

相關內容