ubuntuusers.de

Befehl in Shellscript in sudoers erlauben

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

pstree

Avatar von pstree

Anmeldungsdatum:
11. April 2009

Beiträge: 19

Wohnort: Hessen

Man kann in /etc/sudoers sehr genau einstellen, welcher User welchen Befehl unter sudo ausführen darf. Ist es allerdings auch möglich, einen bestimmten Befehl in einem Shellscript freizuschalten?

Zur Erläuterung (nur als simples Beispiel), momentan ist meine Lösung /usr/local/bin/meinscript:

1
2
#!/bin/bash
chown root /tmp/tmp.txt

welches ich

1
sudo /usr/local/bin/meinscript

ausführe (und dank der Anpassung von sudoers erfolgreich erlaubt habe. Ich möchte aber den Befehl nur in diesem Script erlauben, so dass ich /usr/local/bin/meinscript:

1
2
#!/bin/bash
sudo chown root /tmp/tmp.txt

so ausführen kann:

1
/usr/local/bin/meinscript

Ist das möglich? DieManpage hat mich diesbezüglich leider nicht schlauer gemacht.

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21836

Wohnort: Lorchhausen im schönen Rheingau

pstree schrieb:

Man kann in /etc/sudoers sehr genau einstellen, welcher User welchen Befehl unter sudo ausführen darf.

richtig. Und das sollte auch deine Frage beantworten, entweder ein user darf einen Befehl ausführen oder eben nicht. Ob er das in screen, einer Shell seiner Wahl oder in einem Skript in der Shell seiner Wahl tut, ist egal.

pstree

(Themenstarter)
Avatar von pstree

Anmeldungsdatum:
11. April 2009

Beiträge: 19

Wohnort: Hessen

redknight schrieb:

richtig. Und das sollte auch deine Frage beantworten, entweder ein user darf einen Befehl ausführen oder eben nicht. Ob er das in screen, einer Shell seiner Wahl oder in einem Skript in der Shell seiner Wahl tut, ist egal.

Okay, dann wäre es aus sicherheitstechnischen Überlegungen heraus sinnvoller, den einzelnen Befehl im Script zu erlauben, weil dann nicht das komplette Script als root läuft, oder? (Und ich nicht jedes Mal sudo vor die Ausführung meines Scripts packen muss 😉)

redknight Team-Icon

Moderator & Supporter
Avatar von redknight

Anmeldungsdatum:
30. Oktober 2008

Beiträge: 21836

Wohnort: Lorchhausen im schönen Rheingau

pstree schrieb:

Okay, dann wäre es aus sicherheitstechnischen Überlegungen heraus sinnvoller, den einzelnen Befehl im Script zu erlauben, weil dann nicht das komplette Script als root läuft, oder?

Völlig richtig. granulare Einteilung ist immer sinnvoll, auch wenn sie unter Umständen anfangs mehr Aufwand macht.

RealMabuse

Avatar von RealMabuse

Anmeldungsdatum:
23. Oktober 2015

Beiträge: 8

Wohnort: Im schönen Ostwestfalen

Ich finde die Antwort irgendwie unbefriedigend, denn in dem oben genannten Beispiel würde das doch bedeuten, dass der Benutzer die generelle Erlaubnis bekommen würde "chown" als sudo auszuführen?

In meinen Augen bedeutet das dem Benutzer zu erlauben grundsätzlich und immer den Besitz aller Dateien an sich reissen zu dürfen, was in meinen Augen gefährlicher ist als ihm den Einsatz dieses Skripts zu gestatten sofern das Skript selber für den Benutzer nicht editierbar ist.

Oder kann man in der sudoers das Cmnd_Alias so angeben das es nur als sudo aufgerufen werden kann wenn bestimmte Bedingungen zutreffen (mit bestimmten Parametenr, in einem bestimmten Skript enthalten, ...?).

Wenn ja, wie müsste so eine sudoers dann aussehen?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11250

Wohnort: München

RealMabuse schrieb:

Ich finde die Antwort irgendwie unbefriedigend, denn in dem oben genannten Beispiel würde das doch bedeuten, dass der Benutzer die generelle Erlaubnis bekommen würde "chown" als sudo auszuführen?

Das kommt darauf an, wie du es konfigurierst - das ist ein Thema, bei dem man in die (zugegebenermaßen aufgrund der EBNF-Syntax mitunter etwas kryptische) Dokumentation schauen sollte: https://www.sudo.ws/man/sudoers.man.html (da findet man unter anderem auch eine Einführung in EBNF)

Cmnd_List ::= Cmnd |
              Cmnd ',' Cmnd_List
 
command name ::= file name |
                 file name args |
                 file name '""'
 
Cmnd ::= Digest_Spec? '!'* command name |
         '!'* directory |
         '!'* "sudoedit" |
         '!'* Cmnd_Alias

A Cmnd_List is a list of one or more command names, directories, and other aliases. A command name is a fully qualified file name which may include shell-style wildcards (see the Wildcards section below). A simple file name allows the user to run the command with any arguments he/she wishes. However, you may also specify command line arguments (including wildcards). Alternately, you can specify "" to indicate that the command may only be run without command line arguments. A directory is a fully qualified path name ending in a ‘/’. When you specify a directory in a Cmnd_List, the user will be able to run any file within that directory (but not in any sub-directories therein). If a Cmnd has associated command line arguments, then the arguments in the Cmnd must match exactly those given by the user on the command line (or match the wildcards if there are any). Note that the following characters must be escaped with a ‘\’ if they are used in command arguments: ‘,’, ‘:’, ‘=’, ‘\’.

Wollte man also die passwortlose Ausführung von chown mit sudo nur mit einem definierten Set an Argumenten erlauben, ginge das z.B. so:

user ALL = NOPASSWD:/bin/chown root /tmp/tmp.txt

pstree schrieb:

(Und ich nicht jedes Mal sudo vor die Ausführung meines Scripts packen muss 😉)

Wenn man als in der Shell nicht jedes mal sudo davor schreiben will, kann man sich auch einen alias dafür anlegen.

RealMabuse

Avatar von RealMabuse

Anmeldungsdatum:
23. Oktober 2015

Beiträge: 8

Wohnort: Im schönen Ostwestfalen

So geht es... danke Dir vielmals!

Ich war da zugegeben verwirrt durch die Syntax im sudoers. Mit Komma, Pipe, Wildcards... man kann sich da halt auch schnell verzetteln und bei sudo gilt ja nun einmal: aus versehen zu weit geöffnet kann böse enden.

Ich habe hier noch einen alternativen Lösungsansatz:

Wenn der Benutzer keinen Schreibzugriff auf das Skript hat und das Skript für die eigenen Bedürfnisse dagegen abgesichert ist Schindluder zu treiben, dann mache ich es derzeit so:

In die sudoers-Datei trage ich das Skript ein:

1
benutzername ALL = NOPASSWD:/usr/local/bin/meinskript.sh

Und in /usr/local/bin/meinskript.sh mache ich dann folgendes:

1
2
3
4
5
6
7
#!/bin/bash

# did we run as root?
if [ "$(whoami)" != "root" ]; then
	sudo "$0" "$@"
	exit
fi

So ruft sich das Skript selber mit vorangestelltem sudo auf falls der Benutzer es vergessen hat.

Antworten |