systemd: Accordez à un utilisateur une autorisation non privilégiée pour modifier un service spécifique

20

J'exécute un serveur de jeu privé sur une boîte Linux sans tête. Parce que je ne suis pas un idiot, ledit serveur fonctionne comme son propre utilisateur non privilégié avec les droits d'accès minimum nécessaires pour télécharger les mises à jour et modifier la base de données mondiale.

J'ai également créé un fichier d'unité systemd pour démarrer, arrêter et redémarrer correctement le serveur en cas de besoin (pour lesdites mises à jour, par exemple).

Cependant, afin d'appeler réellement systemctlou service <game> start/stop/restartje dois toujours me connecter en tant sudoqu'utilisateur root ou utilisateur capable.

Existe-t-il un moyen de dire à systemd que pour le <game>service, un utilisateur non privilégié gamesrvest autorisé à exécuter les commandes de démarrage / arrêt / redémarrage?

Shadur
la source
Quelle version de PolicyKit / distribution? Debian (et dérivés) sont sur une ancienne version qui nécessite un format de fichier de configuration différent .
Gert van den Berg

Réponses:

37

Je peux penser à deux façons de procéder:


L'une consiste à faire du service un service utilisateur plutôt qu'un service système.

Au lieu de créer une unité système, l'unité systemd sera placée dans le répertoire personnel de l'utilisateur du service, à l'adresse $HOME/.config/systemd/user/daemon-name.service. Le même utilisateur peut alors gérer le service avec systemctl --user <action> daemon-name.service.

Pour permettre à l'unité utilisateur de démarrer au démarrage , root doit activer la persistance du compte, c'est-à-dire sudo loginctl enable-linger username. L'unité doit également être WantedBy=default.target.


L'autre moyen consiste à autoriser l'accès de l'utilisateur à gérer l'unité centrale via PolicyKit. Cela nécessite systemd 226 ou supérieur (et PolicyKit> = 0.106 pour les fichiers JavaScript rules.d - vérifiez avec pkaction --version).

Vous devez créer un nouveau fichier de configuration PolicyKit, par exemple, /etc/polkit-1/rules.d/57-manage-daemon-name.rulesqui vérifie les attributs que vous souhaitez autoriser. Par exemple :

// 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;
    }
});

L'utilisateur nommé peut alors gérer le service nommé avec systemctlet sans utilisation sudo.

Michael Hampton
la source
Mode utilisateur et loginctltravaillé.
Shadur
1
Est-ce que cela fonctionne sur Ubuntu 16.04? Est-il normal que le répertoire rules.d n'existe pas? Je n'arrive pas à le faire marcher. Mes règles sont ignorées.
ygoe
3
Dois-je redémarrer quelque chose pour activer le PolicyKit?
Josir
@MichaelHampton Avec le systemd --user je peux obtenir tout ce que je veux travailler, sauf le démarrage du service au démarrage. Je pense que c'est normal car je l'ai lu à plusieurs endroits (par exemple, archlinux wiki), mais vous dites que cela devrait fonctionner, en êtes-vous sûr?
daks
@daks Oui ça marche. Si le problème persiste, posez une nouvelle question.
Michael Hampton
12

sudoest fait pour ça. Modifiez votre /etc/sudoersfichier avec visudopour ajouter un Cmd_aliaspour les commandes que vous souhaitez que l'utilisateur non privilégié puisse utiliser:

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

et ajoutez une ligne pour permettre à l'utilisateur non privilégié d'utiliser les commandes définies avec l'alias comme ceci:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Lisez plus de documentation sur le sujet pour les différents paramètres de la commande sudo.

Vous devrez peut-être installer le sudopackage pour qu'il soit sudodisponible sur votre système.

Henrik Pingel réintègre Monica
la source
Je sais utiliser sudo, oui. Je me demandais s'il y avait une option qui me permettrait de sauter même cela, car dans ce cas, la première chose que fait le systemdfichier d'unité est de spécifier qu'il doit être exécuté en tant que gamesrv.
Shadur
1

Vous pouvez associer sudoun accès équivalent à root, mais il peut également être utilisé pour autoriser un utilisateur root spécifique à accéder à un ensemble spécifique et limité de commandes.

Comment cela a-t-il déjà été répondu sur Server Fault, dans [ Donner accès à un utilisateur non root sans sudo à un utilisateur non root sans sudo).

L'utilisation de PolicyKit est encore rare. L'utilisation d'une "unité utilisateur" systemd devrait fonctionner correctement, mais historiquement, votre objectif a été atteint à plusieurs reprises en utilisant la possibilité de sudopermettre à un utilisateur d'exécuter des commandes spécifiques en tant que root.

Mark Stosberg
la source