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 sandbox
y creé un ~/.local/share/applications/chrome-sandboxed.desktop
archivo 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 sandbox
usuario abra ventanas en mi sesión conxhost +SI:localuser:sandbox
y esoel pkexec
comando tenía que estar incluido en un sh -c ""
comando separado que termina con&& true
ya 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 pkexec
y 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 sandbox
sus 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 policykit
ACL. 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 sudo
probablemente 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 policykit
archivo de política personalizado para configurarlo action id
para 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_admin
todaví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.sandboxed
aquí ) 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=$DISPLAY
de su .desktop
archivo; de lo contrario, pkexec
intente ejecutarlo env
como 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.service
o 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 .desktop
archivo.
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/gparted
se 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.