Wie erlaube ich Nicht-Root-Benutzern, einen systemd-Dienst mit Instanzen zu steuern?

11

Ich muss Benutzern in der dbaGruppe erlauben , die database@Dienste zu steuern . Die Antwort auf diese verwandte Frage besteht darin, nur alle systemctl"Verben" aufzulisten, die ich in der sudoersDatei zulassen möchte. Dies gilt jedoch nicht für meinen Fall, da ich vorher nicht weiß, welche Datenbanken im System vorhanden sein könnten. Zum Beispiel, wenn ich aufliste

%dba = /usr/bin/systemctl start database@awsesomeapp
%dba = /usr/bin/systemctl start database@anotherawsesomeapp
%dba = /usr/bin/systemctl start database@yetanotherawsesomeapp
%dba = /usr/bin/systemctl start database@wowyetanotherawsesomeapp
# ... other "verbs" omitted for brevity

Dies gilt nicht für Instanzen, die möglicherweise in der Zukunft existieren, und eine Datenbank kann dies nicht

$ sudo systemctl start database@omgwowyetanotherawsesomeapp

Wie auch immer, ich denke mehr an die Verpackung als an ein bestimmtes System.

Beachten Sie, dass die Verwendung von Sudo Globs für diese Frage letztendlich unsicher ist , wie in dieser erstaunlichen Antwort auf eine andere verwandte Frage gezeigt :

%dba ALL = /usr/bin/systemctl start database@[a-z]* # UNSAFE!

erlaubt

$ sudo systemctl start database@awsesomeapp unrelatedservice

Ich vermute, dass die Verwendung sudomein Problem nicht lösen wird (obwohl ich sicher hoffe, dass ich falsch liege). Gibt es eine andere Möglichkeit, Nicht-Root-Benutzern die Steuerung von systemdDiensten zu ermöglichen?

Für das, was es wert ist, muss ich dies in einem CentOS 7-System und in Zukunft in RHEL7-Systemen tun. Ich würde mich auch für Lösungen interessieren, die unter Arch Linux funktionieren.

Vitor Eiji
quelle

Antworten:

1

Sudoers Datei wird so nicht funktionieren, oder so scheint es mir. Die Sudoers-Datei soll einem bestimmten Befehl Zugriff gewähren und nicht die Argumente angeben, die zu diesem Befehl gehören können.

Erstellen Sie ein Skript, das als Root ausgeführt wird und Folgendes ausführt:

/usr/bin/systemctl start database@

Lassen Sie das Skript ein Argument wie "anotherawesomeapp" verwenden, damit es Folgendes ausführt:

Das Skript wird ausgeführt: / usr / bin / systemctl start database @ anotherawsesomeapp

Geben Sie Ihren Benutzern die Berechtigung, die Datei script.sh mit / etc / sudoers auszuführen.

scriptuser ALL=(ALL) NOPASSWD: /path/to/script.sh

Der Benutzer kann es folgendermaßen ausführen:

sh script.sh anotherawsesomeapp

Beispiel:

AppName=$1

/usr/bin/systemctl start database@$AppName;
if [ $? != "0" ] 
then; 
    echo "$AppName could not be started. Are you using the right application name?";
fi
Baazigar
quelle
1
Wie es ist, hat dies die gleichen Probleme wie das Sudoers. Sie müssen die Variable in Anführungszeichen setzen, sonst wird sie auf Leerzeichen aufgeteilt.
Cyrias
Das wird nicht funktionieren; setuid wird für Shell-Skripte (unter Linux) nicht berücksichtigt.
Martijn
Alles, was es tut, ist die Verwendung von sudo, um ein Skript auszuführen. Es ist nicht anders als das gleiche mit einem "Hallo Welt" -Skript. Wenn root das Skript ausführen kann, funktioniert es.
Baazigar
0

Eine vorgeschlagene Lösung basierend aufSUID

Sie können das Skript erstellen, das systemctl mit sudo aufruft. Machen Sie das Skript im Besitz von root. Geben Sie SUIDder Gruppe der Datenbankadministratoren (dba) die Berechtigung zum Rooten sowie zum Lesen und Ausführen von Berechtigungen.
Achten Sie nur darauf, der Gruppe oder anderen keine Schreibberechtigung zu erteilen, da sie auf diese Weise das Skript ändern und alles ausführen können, was mit sudo vorangestellt ist! Stellen Sie außerdem sicher, dass das Skript in Bezug auf die Eingabe kugelsicher ist.

$ cat >> start_database.sh
sudo / usr / bin / systemctl Datenbank @ $ 1 starten
(Strg + D)

Dieses Skript könnte verbessert werden, indem überprüft wird, ob das Argument tatsächlich angegeben ist, und eine Usage: -Nachricht gedruckt wird, wenn nicht ..., auch da es sich um ein Skript handelt SUID, für das eine Überprüfung erforderlich ist. um das Einfügen anderer Befehle nach dem Argument zu vermeiden. Oder stellen Sie noch besser sicher, dass Sie als Eingabe nur eine der von Ihnen erwähnten App-bezogenen Zeichenfolgen zulassen!
Dann müssen Sie sicherstellen, dass die Berechtigungen für das Skript genau die folgenden sind:

$ sudo chown root: dba start_database.sh
$ sudo chmod ux, gw, o-rwx start_database.sh
$ sudo chmod u + s, g + rx start_database.sh

So überprüfen Sie die korrekten Berechtigungen:

$ ls -la
.
.
.
-rwSr-x --- 1 root dba 35 Aug 2 19:11 start_database.sh
.
.
.

Um es noch einmal zusammenzufassen:

1. die owner of the script is root
2. die Datei can be read and executed by the dba group members
3. no-one else will be able to even reades.
4. SUIDermöglicht es dem Benutzer, der das Skript ausführt , root zu werden, solange das Skript ausgeführt wird.
5. So stoppt sudo nicht für ein Passwort.

Auf jeden Fall in einem System mit mehreren Benutzern, werden sehr vorsichtig mit , SUIDweil es Raum für die Erlaubnis , Missbrauch hinterlassen.

Angelos Asonitis
quelle
Sie vermissen einen Schebang in Ihrem Skript und SUIDfunktionieren selbst dann standardmäßig nicht für Skripte.
Jan Tojnar