permettant à l'utilisateur d'exécuter les services systemctl / systemd sans mot de passe

25

Je veux que l'utilisateur par défaut ubuntupuisse exécuter un service spécifique sans être invité à saisir un mot de passe.

Plus précisément systemctl restart unicorn_my_app.service.

J'ai suivi les instructions ici pour ajouter un utilisateur ubuntuà un groupe nouvellement créé LimitedAdmins, ce qui est confirmé par:

$ getent group LimitedAdmins
LimitedAdmins:x:1001:ubuntu

Création d'un nouveau fichier, limitedadmins(à l'aide sudo vim) dans le /etc/sudoers.drépertoire contenant le texte suivant:

%LimitedAdmins ALL=NOPASSWD: /etc/init.d/unicorn_ofn_america restart, /etc/init.d/unicorn_ofn_america start

J'ai aussi essayé:

%LimitedAdmins ALL=NOPASSWD: /bin/systemctl/unicorn_ofn_america restart, /bin/systemctl/unicorn_ofn_america start

(Et /bin/systemd)

Le contenu de /etc/sudoers/est la valeur par défaut confirmée par sudo visudo(ou sudo cat /etc/sudoers):

    #
    # This file MUST be edited with the 'visudo' command as root.
    #
    # Please consider adding local content in /etc/sudoers.d/ instead of
    # directly modifying this file.
    #
    # See the man page for details on how to write a sudoers file.
    #
    Defaults    env_reset
    Defaults    mail_badpass
    Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

    # Host alias specification

    # User alias specification

    # Cmnd alias specification

    # User privilege specification
    root    ALL=(ALL:ALL) ALL

    # Members of the admin group may gain root privileges
    %admin ALL=(ALL) ALL

    # Allow members of group sudo to execute any command
    %sudo   ALL=(ALL:ALL) ALL

    # See sudoers(5) for more information on "#include" directives:

    #includedir /etc/sudoers.d

(La connexion de hachage #includedirn'est pas un commentaire, mais fait partie de la syntaxe de la directive #include ).

Cependant, il y a toujours une invite de mot de passe après l'exécution systemctl restart unicorn_my_app.service

Le service est là dans l' init.dannuaire:

$ ls -l /etc/init.d | grep unicorn
-rwxr--r-- 1 ubuntu ubuntu 1874 Oct 29 06:47 unicorn_my_app

J'ai essayé chmodding 755sur l'application, mais ne pense pas que cela devrait faire la différence, car ubuntuil le possède de toute façon.

Même essayé de redémarrer le système sans aucune différence. Suis-je en train de manquer une étape, comme un redémarrage / rechargement)? Configurer quelque chose de mal?

Je dois également mentionner que j'avais l'habitude vimde créer le nouveau fichier à l'intérieur /etc/sudoers.d, car il semble que la visudocommande ne soit que pour l'édition /etc/sudoers.

MikeiLL
la source

Réponses:

38

Le fichier sudoers est assez flexible, et avec cela vient la complexité. Ce que vous voulez ici, c'est autoriser l'accès à la commande /bin/systemctl, avec des paramètres spécifiques:

%LimitedAdmins ALL=NOPASSWD: /bin/systemctl restart unicorn_my_app.service

Fondamentalement, vous prenez simplement la ligne de commande exacte que vous tapez, codez en dur le nom du chemin pour des raisons de sécurité, et placez-le dans votre fichier sudoers (ou /etc/sudoers.d). Et notez que «démarrer» et «redémarrer» sont complètement différents en ce qui concerne sudo; autoriser l'un n'accordera pas l'accès à l'autre.

rosuav
la source
1
Ne semble pas fonctionner. Je peux copier /bin/systemctl restart unicorn_my_app.servicedirectement à partir du /etc/sudoers.d/limitedadminsfichier et l'exécuter dans la CLI, et on me demande un mot de passe. L'utilisateur ubuntudoit-il être spécifié quelque part ou l' ALLouvre-t-il à tous les utilisateurs pour tous les domaines?
MikeiLL
5
Vous devez exécuter sudo /bin/systemctl restart unicorn_my_app.serviceet il doit ensuite s'exécuter sans mot de passe. (publication en tant que commentaire au cas où la réponse de PsiOps serait séparée de celle-ci)
rosuav
1
@rosuav Existe-t-il un moyen pour que nous puissions l'exécuter directement comme systemctl restart myapp.servicesans l'utiliser sudo.
kabirbaidhya
Pas vraiment, mais vous pouvez mettre la commande dans un script (avec le préfixe sudo), puis mettre ce script dans $ PATH. Ou faites-en un alias de shell.
rosuav
3
Attention: sur les autres distributions se systemctl trouve dans /usr/bin:-(.
guettli