pkexec sin contraseña para usuarios sin privilegios

pkexec sin contraseña para usuarios sin privilegios

Por varias razones, quiero ejecutar mi navegador como un usuario de sistema diferente en mi Fedora Box.

Por ahora, creé un usuario de sistema separado llamado sandboxy creé un ~/.local/share/applications/chrome-sandboxed.desktoparchivo personalizado para Google Chrome con mi usuario:

#!/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"

Después de un poco de lucha e investigación descubrí queNecesito permitir que el sandboxusuario abra ventanas en mi sesión conxhost +SI:localuser:sandboxy esoel pkexeccomando tenía que estar incluido en un sh -c ""comando separado que termina con&& trueya que de lo contrario no funciona en Gnome. Incluso tengo estoestablecer como mi navegador predeterminado ejecutandoxdg-settings set default-web-browser chrome-sandboxed.desktop, ya que antes no aparecía en la herramienta GUI para elegir aplicaciones predeterminadas.

Ahora lo único que me molesta es que tengo que ingresar mi contraseña cada vez que hago clic en un enlace en otra aplicación (es decir, Thunderbird) para autenticarme pkexecy ejecutar el programa como otro usuario (aunque luego se dará cuenta de que ya existe un proceso en ejecución y abra el enlace en una nueva pestaña de la ventana existente, pero supongo que esa lógica se implementa en la aplicación misma y, por lo tanto, solo puede activarse después de que se haya realizado la autenticación y se haya iniciado el proceso).

Como no me importa que mi usuario pueda acceder a sandboxsus cosas (es al revés lo que quiero evitar), me gustaría hacer esto sin contraseña. Sin embargo, no estoy seguro de cómo lograrlo.

Leí que se puede hacer creando una policykitACL. Pero como no quierogeneralmentedesactivar la solicitud de contraseñay no tengo idea sobre el nombre de la "aplicación" personalizada, queparece ser relevante para una configuración afinada(si entendí correctamente la sintaxis de la respuesta) No sé cómo desactivar la solicitud de contraseña solo para esta aplicación (y tal vez para otras en el futuro).

Cualquier ayuda sería muy apreciada.

PD: Lo siento, la etiqueta sudoprobablemente sea confusa, pero necesitaría 300 de reputación (que no tengo) para crear la nueva etiqueta pkexec.


EDITAR

Lo hice funcionar con las sugerencias deusuario1686'srespuesta.

Primero, (si aún no hay uno) cree un policykitarchivo de política personalizado para configurarlo action idpara el programa deseado; en mi caso /usr/share/polkit-1/actions/com.google.chrome.sandboxed.policy(tenga en cuenta que en esta política predeterminada auth_admintodavía se requiere):

<?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>

Luego, cree una regla personalizada para permitir la ejecución sin contraseña de la acción con la configuración action id( com.google.chrome.sandboxedaquí ) solo para su usuario, en mi caso /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

Luego, elimine todas las apariciones de env DISPLAY=$DISPLAYde su .desktoparchivo; de lo contrario, pkexecintente ejecutarlo envcomo el otro usuario /usr/bin/google-chrome-stable. Comousuario1686Como se señaló, las variables de entorno requeridas se heredan automáticamente al proceso hijo, por lo que ya no son necesarias de todos modos.

Es posible que necesites systemctl reload polkit.serviceo systemctl restart polkit.service, pero no estoy seguro de eso porque pensé que esa era la razón por la que no funcionaba para mí al principio, aunque olvidé cambiar mi .desktoparchivo.

Funciona tal como se esperaba ahora.

Respuesta1

Así es como GParted lo maneja:

<?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>

Tenga en cuenta las dos <annotate/>etiquetas.

Cuando se instala esta política, a un simple pkexec /usr/bin/gpartedse le asigna automáticamente un "ID de acción" de kit de políticas diferente (para que pueda definir diferentes valores predeterminados, así como combinarlos en reglas personalizadas). Tampoco es necesario pasar $DISPLAY manualmente: pkexec copiará todas las variables necesarias automáticamente.

información relacionada