40 votes

Systemd : Accordez à un utilisateur non privilégié la permission de modifier un service spécifique

Je fais tourner un serveur de jeu privé sur une boîte Linux sans tête. Parce que je ne suis pas un idiot, ledit serveur tourne en tant que son propre utilisateur non privilégié avec les droits d'accès stricts nécessaires pour télécharger les mises à jour et modifier la base de données du monde.

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

Cependant, pour réellement appeler systemctl ou service start/stop/restart, je dois encore me connecter en tant que root ou un utilisateur capable de sudo.

Existe-t-il un moyen de dire à systemd que pour le service , l'utilisateur non privilégié gamesrv est autorisé à exécuter les commandes start/stop/restart?

69voto

Michael Hampton Points 232226

Je peux penser à deux façons de faire cela :


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 sous le répertoire personnel du service utilisateur, à $HOME/.config/systemd/user/daemon-name.service. Le même utilisateur peut ensuite gérer le service avec systemctl --user daemon-name.service.

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


L'autre façon est de permettre à l'utilisateur d'accéder à la gestion de l'unité système 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). Notez que Debian a délibérément retenu PolicyKit pour une version presque vieille de dix ans, la version 0.105, qui ne prend pas en charge cette fonctionnalité, apparemment en raison de l'opinion personnelle de quelqu'un, et ni lui ni les distributions dérivées de lui (comme Ubuntu) ne peuvent utiliser cette méthode.

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

// Autoriser alice à gérer example.service;
// sinon, retour à l'autorisation implicite.
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 ensuite gérer le service nommé avec systemctl et sans utiliser sudo.

25voto

Henrik Pingel Points 8426

sudo est fait pour cela. Modifiez votre fichier /etc/sudoers avec visudo pour ajouter un Cmd_alias pour les commandes que vous souhaitez que l'utilisateur non privilégié puisse utiliser :

# commandes du serveur de jeux
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start , /usr/bin/systemctl stop 

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

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

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

Vous devrez peut-être installer le package sudo pour avoir sudo disponible sur votre système.

2voto

Mark Stosberg Points 3665

Vous pouvez associer sudo à l'octroi d'un accès équivalent à root, mais il peut également être utilisé pour permettre à un utilisateur spécifique d'accéder en tant que root à un ensemble spécifique et limité de commandes.

Comment faire cela a déjà été répondu sur Server Fault, à [Donner accès à un ensemble de commandes à un utilisateur non root sans accès sudo).

L'utilisation de PolicyKit reste encore peu commune. Utiliser une "unité utilisateur" systemd devrait fonctionner, mais historiquement, votre objectif a souvent été atteint en utilisant la capacité de sudo à permettre à un utilisateur d'exécuter des commandes spécifiques en tant que root.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X