pkexec sem senha para usuário sem privilégios

pkexec sem senha para usuário sem privilégios

Por vários motivos, quero executar meu navegador como um usuário de sistema diferente na minha caixa Fedora.

Por enquanto, criei um usuário de sistema separado chamado sandboxe criei um ~/.local/share/applications/chrome-sandboxed.desktoparquivo personalizado para o Google Chrome com meu usuário:

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

Depois de alguma luta e pesquisa, descobri quePreciso permitir que o sandboxusuário abra janelas na minha sessão comxhost +SI:localuser:sandboxe essao pkexeccomando teve que ser incluído em um sh -c ""comando separado que termina com&& truejá que não funciona no Gnome de outra forma. Eu até consegui issodefinir como meu navegador padrão executandoxdg-settings set default-web-browser chrome-sandboxed.desktop, já que antes não aparecia na ferramenta GUI para escolha de aplicativos padrão.

Agora, a única coisa que me incomoda é que tenho que digitar minha senha toda vez que clico em um link em outro aplicativo (por exemplo, Thunderbird) para autenticar pkexece executar o programa como outro usuário (mesmo que ele perceba que já existe um processo em execução e abrir o link em uma nova guia da janela existente - mas acho que essa lógica é implementada no próprio aplicativo e, portanto, só pode ser ativada após a autenticação ter ocorrido e o processo ser iniciado).

Como não me importo com o fato de meu usuário poder acessar as sandboxcoisas do usuário (é o contrário que quero evitar), gostaria de fazer isso sem senha. Não tenho certeza sobre como conseguir isso, no entanto.

Eu li que isso pode ser feito criando uma policykitACL. Mas como eu não querogeralmentedesativar o prompt de senhae não tenho ideia do nome do "aplicativo" personalizado, queparece ser relevante para configurações ajustadas(se entendi a sintaxe da resposta corretamente) não sei como desabilitar o prompt de senha apenas para este aplicativo (e talvez outros no futuro).

Qualquer ajuda seria muito apreciada.

PS: Desculpe, a tag sudoprovavelmente é confusa, mas eu precisaria de 300 reputação (que não tenho) para criar a nova tag pkexec.


EDITAR

Consegui funcionar com as dicas deusuário1686deresponder.

Primeiro, (se ainda não houver um) crie um policykitarquivo de política personalizado para configurar action ido programa desejado - no meu caso /usr/share/polkit-1/actions/com.google.chrome.sandboxed.policy(observe que nesta política padrão auth_adminainda é necessária):

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

Em seguida, crie uma regra personalizada para permitir a execução da ação sem senha com o configurado action id( com.google.chrome.sandboxedaqui) apenas para o seu usuário - no meu 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

Depois, remova todas as ocorrências do env DISPLAY=$DISPLAYseu .desktoparquivo, caso contrário, pkexectente executar envcomo o outro usuário /usr/bin/google-chrome-stable. Comousuário1686apontado, as variáveis ​​de ambiente necessárias são herdadas automaticamente para o processo filho, portanto, não são mais necessárias de qualquer maneira.

Você pode precisar systemctl reload polkit.serviceou systemctl restart polkit.service, mas não tenho certeza disso, pois pensei que esse era o motivo pelo qual não estava funcionando para mim no início - embora eu tenha esquecido de alterar meu .desktoparquivo.

Funciona exatamente como esperado agora.

Responder1

Veja como o GParted lida com isso:

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

Observe as duas <annotate/>tags.

Quando esta política é instalada, um simples pkexec /usr/bin/gpartedé automaticamente atribuído a um "ID de ação" de kit de política diferente (para que você possa definir padrões diferentes, bem como combiná-lo em regras personalizadas). Você também não precisa passar $DISPLAY manualmente – o pkexec copiará todas as variáveis ​​necessárias automaticamente.

informação relacionada