pkexec без пароля для непривилегированного пользователя

pkexec без пароля для непривилегированного пользователя

По нескольким причинам я хочу запустить браузер от имени другого системного пользователя на моем компьютере Fedora.

На данный момент я создал отдельного системного пользователя с именем sandboxи создал пользовательский ~/.local/share/applications/chrome-sandboxed.desktopфайл для Google Chrome с моим пользователем:

#!/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, поскольку ранее он не отображался в графическом интерфейсе инструмента для выбора приложений по умолчанию.

Теперь единственное, что меня беспокоит, это то, что мне приходится вводить пароль каждый раз, когда я нажимаю на ссылку в другом приложении (например, Thunderbird), чтобы пройти аутентификацию pkexecи запустить программу от имени другого пользователя (хотя затем приложение поймет, что процесс уже запущен, и откроет ссылку в новой вкладке существующего окна, но я предполагаю, что эта логика реализована в самом приложении и, следовательно, может сработать только после того, как будет выполнена аутентификация и процесс будет запущен).

Поскольку мне все равно, сможет ли мой пользователь получить доступ к sandboxматериалам пользователя (я хочу предотвратить как раз обратное), я бы хотел сделать это без пароля. Хотя я не уверен, как этого добиться.

Я читал, что это можно сделать, создав policykitACL. Но так как я не хочув целомотключить запрос пароляи я понятия не имею о названии пользовательского "приложения", котороекажется, имеет значение для тонкой настройки конфигурации(если я правильно понял синтаксис в ответе) Я не знаю, как отключить запрос пароля только для этого приложения (и, возможно, для других в будущем).

Любая помощь будет высоко оценена.

PS: Извините, тег, sudoвозможно, сбивает с толку, но для создания нового тега мне понадобится 300 репутации (которой у меня нет) pkexec.


РЕДАКТИРОВАТЬ

Получилось с подсказками отпользователь1686'sотвечать.

Во-первых, (если его еще нет) создайте 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.serviceили systemctl 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набору политик автоматически назначается другой «идентификатор действия» (чтобы вы могли определять разные значения по умолчанию, а также сопоставлять его с пользовательскими правилами). Вам также не нужно вручную передавать $DISPLAY – pkexec автоматически скопирует все необходимые переменные.

Связанный контент