it-swarm.com.de

systemd: Gewähren Sie einem nicht privilegierten Benutzer die Berechtigung, einen bestimmten Dienst zu ändern

Ich verwende einen privaten Spieleserver auf einer Headless-Linux-Box. Da ich kein Idiot bin, wird der Server als eigener, nicht privilegierter Benutzer mit den minimalen Zugriffsrechten ausgeführt, die zum Herunterladen von Updates und zum Ändern der Weltdatenbank erforderlich sind.

Ich habe auch eine systemd-Einheitendatei erstellt, um den Server bei Bedarf ordnungsgemäß zu starten, zu stoppen und neu zu starten (z. B. für diese Updates).

Um jedoch tatsächlich systemctl oder service <game> start/stop/restart Aufzurufen, muss ich mich weiterhin entweder als root oder als Sudo -fähiger Benutzer anmelden.

Gibt es eine Möglichkeit, systemd mitzuteilen, dass der nicht privilegierte Benutzer gamesrv für den Dienst <game> Die Befehle start/stop/restart ausführen darf?

21
Shadur

Ich kann mir zwei Möglichkeiten vorstellen, dies zu tun:


Zum einen wird der Dienst eher zu einem Benutzerdienst als zu einem Systemdienst.

Anstatt eine Systemeinheit zu erstellen, wird die systemd-Einheit unter $HOME/.config/systemd/user/daemon-name.service Im Home-Verzeichnis des Dienstbenutzers abgelegt. Der gleiche Benutzer kann dann den Dienst verwalten mit systemctl --user <action> daemon-name.service.

Damit die Benutzereinheit beim Booten starten kann, muss root das Verweilen für das Konto aktivieren, d. H. Sudo loginctl enable-linger username. Das Gerät muss auch WantedBy=default.target Sein.


Die andere Möglichkeit besteht darin, dem Benutzer den Zugriff auf die Systemeinheit über PolicyKit zu ermöglichen. Dies erfordert systemd 226 oder höher (und PolicyKit> = 0.106 für die JavaScript rules.d-Dateien - überprüfen Sie mit pkaction --version).

Sie würden eine neue PolicyKit-Konfigurationsdatei erstellen, z. /etc/polkit-1/rules.d/57-manage-daemon-name.rules Überprüft, welche Attribute Sie zulassen möchten. Für Beispiel :

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

Der benannte Benutzer kann dann den benannten Dienst mit systemctl und ohne Verwendung von Sudo verwalten.

38
Michael Hampton

Sudo ist dafür gemacht. Bearbeiten Sie Ihre /etc/sudoers Datei mit visudo, um ein Cmd_alias für die Befehle, die der nicht privilegierte Benutzer verwenden soll:

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

und fügen Sie eine Zeile hinzu, damit der nicht privilegierte Benutzer die mit dem Alias ​​definierten Befehle wie folgt verwenden kann:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Lesen Sie mehr Dokumentation zum Thema für die verschiedenen Parameter des Sudo-Befehls.

Möglicherweise müssen Sie das Paket Sudo installieren, damit Sudo auf Ihrem System verfügbar ist.

12
Henrik Pingel

Sie können Sudo mit der Bereitstellung eines Zugriffs verknüpfen, der root entspricht, aber es kann auch verwendet werden, um einem bestimmten Benutzer Root-Zugriff für einen bestimmten, begrenzten Satz von Befehlen zu ermöglichen.

Wie wurde das bereits bei Server Fault unter [ Zugriff auf eine Reihe von Befehlen an einen Nicht-Root-Benutzer ohne Sudo Zugriff auf eine Reihe von Befehlen an einen Nicht-Root-Benutzer ohne Sudo beantwortet?) .

Die Verwendung von PolicyKit ist immer noch ungewöhnlich. Die Verwendung einer systemd "Benutzereinheit" sollte einwandfrei funktionieren, aber in der Vergangenheit wurde Ihr Ziel viele Male erreicht, indem die Fähigkeit von Sudo verwendet wurde, einem Benutzer das Ausführen bestimmter Befehle als root zu ermöglichen.

1
Mark Stosberg