it-swarm.com.de

Wie können wir Nicht-Root-Benutzern erlauben, einen system.d-Dienst zu steuern?

Mit sysvinit würde ein sudoers Eintrag wie dieser ausreichen:

%webteam cms051=/sbin/service httpd *

Dies würde Befehle ermöglichen wie:

  • Sudo service httpd status
  • Sudo service httpd restart

Bei systemd ist der Dienstname das letzte Argument. Das heißt, der Neustart des Dienstes würde erfolgen mit:

systemctl restart httpd.service

Natürlich dachte ich, das Definieren des Befehls als systemctl * httpd.service Würde funktionieren, aber das würde so etwas wie systemctl restart puppet.service httpd.service Ermöglichen, was nicht der gewünschte Effekt ist.

Was wäre angesichts dieser Überlegungen der beste Weg, um Nicht-Root-Benutzern die Steuerung eines system.d - Dienstes zu ermöglichen? Dies muss nicht sudoers sein; Vielleicht reicht eine Änderung der Dateiberechtigung aus?

64

Fügen Sie einfach alle erforderlichen Befehle separat zu sudoers hinzu:

%webteam cms051=/usr/bin/systemctl restart httpd.service
%webteam cms051=/usr/bin/systemctl stop httpd.service
%webteam cms051=/usr/bin/systemctl start httpd.service 
%webteam cms051=/usr/bin/systemctl status httpd.service
45
jofel

@ jofels Antwort war genau das, was ich brauchte, um ein funktionierendes Setup zu bekommen. POsting dies für alle anderen, die über diese Frage stolpern. Ich brauchte eine Möglichkeit, um capistrano meine Ruby - Anwendung nach der Bereitstellung von meinem lokalen Computer neu starten zu lassen. Das bedeutet, ich brauchte einen kennwortlosen Zugriff, um systemd Dienste neu zu starten was ich habe und es funktioniert wunderbar!

Hinweis: Mein Benutzer und meine Gruppe heißen deployer
Fügen Sie hier Code in eine benutzerdefinierte Datei ein: /etc/sudoers.d/deployer
Code:

%deployer ALL= NOPASSWD: /bin/systemctl start my_app
%deployer ALL= NOPASSWD: /bin/systemctl stop my_app
%deployer ALL= NOPASSWD: /bin/systemctl restart my_app
33
BoomShadow

Erstellen Sie einen Befehlsalias mit den Befehlen, auf die sie Zugriff haben sollen. Weisen Sie dann die Gruppe diesem Befehlsalias zu:

Cmnd_Alias Apache-SVC = /usr/bin/systemctl stop httpd, /usr/bin/systemctl start httpd, /usr/bin/systemctl restart httpd

%webteam ALL=Apache-SVC

Es wird auch empfohlen, Änderungen in Ihrer Datei /etc/sudoers.d/filename vorzunehmen, anstatt die sudoers-Datei direkt zu bearbeiten. Stellen Sie sicher, dass Sie in den Sudoern auf Ihren .d/Dateinamen verweisen, was die meisten neuen Distributionen sowieso tun. Das Platzieren dieser 2 Zeilen in Ihren Sudoern sollte den Trick machen:

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

Hinweis: Das # vor dem enthaltenenir ist kein Kommentar. Es muss bleiben.

8
Rich

Es ist am sichersten, sie als jofel aufzuschlüsseln.

Wenn ich jemandem erlauben wollte, eine begrenzte Teilmenge der Fähigkeiten eines Befehls zu verwenden, würde ich keinen Platzhaltern in einer Sudoers-Zeile vertrauen, um dies zu tun. Auch wenn die Sprache ausdrucksvoller war als Shell Globs, gibt es einfach zu viele Eckfälle, um den Überblick zu behalten.

Das "service httpd * "Zeile ist relativ sicher, weil (dies überprüfen :) service nur ein nützliches Flag hat (--status-all) was nichts besonders Sensibles macht, und (überprüfe dies auch :) /etc/init.d/httpd akzeptiert nur die Befehlszeilen, die Sie zulassen möchten.

Wenn es so viele Kombinationen gibt, dass es schwierig wird, sie aufzulisten, sollten Sie sich wahrscheinlich fragen, was Sie tun. Sie können ihnen jedoch Zugriff auf ein sorgfältig geschriebenes Hilfsskript geben, das den Befehl für sie ausführt (ähnlich wie /etc/init.d/http). Auch in diesem Fall sollten Sie so präzise und explizit wie möglich sein, um genau aufzulisten, welche Befehle und Optionen zulässig sind, und keine Benutzereingaben direkt an den Zielbefehl übergeben.

6
Jander