Passwortloses pkexec für nicht privilegierten Benutzer

Passwortloses pkexec für nicht privilegierten Benutzer

Aus verschiedenen Gründen möchte ich meinen Browser auf meiner Fedora-Box als anderer Systembenutzer ausführen.

Vorerst habe ich einen separaten Systembenutzer mit dem Namen erstellt und mit meinem Benutzernamen sandboxeine benutzerdefinierte Datei für Google Chrome erstellt :~/.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"

Nach einigem Ringen und Nachforschen fand ich heraus, dassIch muss dem sandboxBenutzer erlauben, Fenster in meiner Sitzung zu öffnen mitxhost +SI:localuser:sandboxund dasDer pkexecBefehl musste in einen separaten Befehl eingeschlossen werden, sh -c ""der mit endete&& trueda es sonst in Gnome nicht funktioniert. Ich habe sogar dieseals Standardbrowser festlegen, indem Siexdg-settings set default-web-browser chrome-sandboxed.desktop, da es zuvor nicht im GUI-Tool zur Auswahl von Standardanwendungen angezeigt wurde.

Jetzt stört mich nur noch, dass ich jedes Mal, wenn ich in einer anderen Anwendung (z. B. Thunderbird) auf einen Link klicke, mein Kennwort eingeben muss, um mich zu authentifizieren pkexecund das Programm als anderer Benutzer auszuführen (obwohl es dann erkennt, dass bereits ein Prozess ausgeführt wird, und den Link in einem neuen Tab des vorhandenen Fensters öffnet – aber ich vermute, dass diese Logik in der Anwendung selbst implementiert ist und daher erst aktiviert werden kann, nachdem die Authentifizierung erfolgt ist und der Prozess gestartet wurde).

Da es mir egal ist, ob mein Benutzer auf die sandboxInhalte des Benutzers zugreifen kann (ich möchte das Gegenteil verhindern), würde ich dies gerne ohne Passwort tun. Ich bin mir jedoch nicht sicher, wie ich das erreichen soll.

Ich habe gelesen, dass dies durch die Erstellung einer ACL möglich ist policykit. Aber da ich nichtallgemeinDeaktivieren der Kennwortabfrageund ich habe keine Ahnung, wie der Name der benutzerdefinierten "Anwendung" lautet, derscheint für eine fein abgestimmte Konfiguration relevant zu sein(wenn ich die Syntax in der Antwort richtig verstanden habe) Ich weiß nicht, wie ich die Kennwortabfrage nur für diese Anwendung (und vielleicht auch für weitere in der Zukunft) deaktivieren kann.

Für jede Hilfe wäre ich sehr dankbar.

PS: Entschuldigung, das Tag sudoist wahrscheinlich verwirrend, aber ich bräuchte 300 Reputationspunkte (die ich nicht habe), um das neue Tag zu erstellen pkexec.


BEARBEITEN

Habe es mit den Hinweisen vonBenutzer1686'SAntwort.

Erstellen Sie zunächst (sofern noch keine vorhanden ist) eine benutzerdefinierte policykitRichtliniendatei, um eine Konfiguration action idfür das gewünschte Programm vorzunehmen – in meinem Fall /usr/share/polkit-1/actions/com.google.chrome.sandboxed.policy(beachten Sie, dass in diesem Fall weiterhin eine Standardrichtlinie auth_adminerforderlich ist):

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

Erstellen Sie dann eine benutzerdefinierte Regel, um die kennwortlose Ausführung der Aktion mit der action id( com.google.chrome.sandboxedhier) konfigurierten Regel nur für Ihren Benutzer zuzulassen – in meinem Fall /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

Entfernen Sie anschließend alle Vorkommen von env DISPLAY=$DISPLAYaus Ihrer .desktopDatei, andernfalls wird stattdessen die Ausführung als anderer Benutzer pkexecversucht .env/usr/bin/google-chrome-stableBenutzer1686Wie bereits erwähnt, werden die erforderlichen Umgebungsvariablen automatisch an den Kindprozess vererbt und sind daher ohnehin nicht mehr erforderlich.

Möglicherweise müssen Sie dies systemctl reload polkit.serviceoder tun systemctl restart polkit.service, aber da bin ich mir nicht sicher, da ich zunächst dachte, das wäre der Grund, warum es bei mir nicht funktioniert hat – obwohl ich einfach vergessen hatte, meine .desktopDatei zu ändern.

Es funktioniert jetzt wie erwartet.

Antwort1

So geht GParted damit um:

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

Beachten Sie die beiden <annotate/>Tags.

Wenn diese Richtlinie installiert wird, pkexec /usr/bin/gpartedwird einem Simple automatisch eine andere „Aktions-ID“ des Policykits zugewiesen (so können Sie verschiedene Standardwerte definieren und diese auch in benutzerdefinierten Regeln anpassen). Sie müssen $DISPLAY auch nicht manuell übergeben – pkexec kopiert alle erforderlichen Variablen automatisch.

verwandte Informationen