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

60

Mit würde sysvinitein sudoersEintrag wie dieser ausreichen:

%webteam cms051=/sbin/service httpd *

Dies würde Befehle ermöglichen wie:

  • sudo service httpd status
  • sudo service httpd restart

Nun ist mit systemdder Dienstname das letzte Argument. Dh der Neustart des Dienstes würde erfolgen mit:

systemctl restart httpd.service

Natürlich dachte ich, das Kommando so zu definieren, wie systemctl * httpd.servicees funktionieren würde, aber das würde so etwas ermöglichen, systemctl restart puppet.service httpd.servicewas nicht der gewünschte Effekt ist.

Wie können dann Benutzer ohne Rootberechtigung einen system.dDienst am besten steuern ? Das muss nicht sein sudoers; Vielleicht reicht eine Änderung der Dateiberechtigung aus?

Belmin Fernandez
quelle
Ich habe eine sudoKonfiguration schon eine Weile nicht mehr angefasst , aber konnten Sie nicht einfach so etwas tun cms051=systemctl * httpd.service?
John WH Smith
1
Auf diese Weise können Sie jeden Dienst dann neu starten. Ich hätte diesen Leckerbissen in die Frage aufnehmen sollen. Es tut uns leid.
Belmin Fernandez,

Antworten:

43

Fügen Sie einfach alle erforderlichen Befehle sudoersseparat 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
Jofel
quelle
Ich hatte gehofft, alle Einheitenbefehle erfassen zu können, aber wenn ich sie aufzählen muss, muss ich das wohl tun.
Belmin Fernandez
9
Status ist nicht nützlich, da jeder Benutzer das tun kann
Dereckson
5
Was ist cms051?
Kevin
1
Was passiert also, wenn ich systemctl starte http.service mariadb.service ;-)? Wahrscheinlich wird Mariadb auch neu gestartet
Marek Wajdzik
1
@MarekWajdzik sudo erlaubt keine zusätzlichen Argumente, wenn man nicht explizit mit *oder ähnlichen Mustern erlaubt .
Jofel
31

@jofels Antwort war genau das, was ich brauchte, um ein funktionierendes Setup zu bekommen. Ich stelle dies für alle anderen auf, die über diese Frage stolpern. Ich brauchte einen Weg , um capistranoneu zu starten Anwendung meines Rubins , nachdem sie von meinem lokalen Rechner einsetzen. Das heißt, ich brauchte einen kennwortlosen Zugang zum Neustart der systemdDienste. DAS habe ich und es funktioniert wunderbar!

Hinweis : Mein Benutzer und meine Gruppe heißen hier deployer
Code in eine benutzerdefinierte Datei einfügen: /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
BoomShadow
quelle
Ich muss hinzufügen, dass nach der Anmeldung als Benutzer deployerin diesem Fall Sie den systemctlBefehl mit sudo ausführen sollten .
Muyiwa Olu
8

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 ist auch empfehlenswert, Änderungen in Ihrem /etc/sudoers.d/dateinamen zu platzieren, anstatt die sudoers-Datei direkt zu bearbeiten. Stellen Sie sicher, dass Sie in den Sudoern auf Ihre .d / filename verweisen, was die meisten neuen Distributionen sowieso tun. Das Einfügen dieser beiden Zeilen in Ihre Sudoer 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 includeir ist kein Kommentar. Es muss bleiben.

Reich
quelle
Wie füge ich die Chance hinzu, Stop / Start / Neustart ohne Passworteingabe auszuführen?
Nikolay Baranenko
Beste Antwort IMO. Jeder sollte einen Befehlsalias hinzufügen und damit arbeiten.
DASKAjA
6

Es ist am sichersten, sie aufzuschlüsseln, wie es Jofel vorschlägt.

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.

Die service httpd *Zeile " " ist relativ sicher, da (überprüfe dies :) servicenur ein nützliches Flag ( --status-all) hat, das nichts besonders Sensibles bewirkt, und (überprüfe dies auch :) /etc/init.d/httpdnur die Befehlszeilen akzeptiert, die du zulassen möchtest.

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

Jander
quelle