ubuntu: Lassen Sie einen Benutzer ein Skript mit Root-Berechtigungen ausführen

9

Ich habe Ubuntu 8.04 und möchte ein Bash-Skript schreiben, das so ausgeführt wird, wie es rootjeder Benutzer ausführen kann.

Ich selbst kann Sudo machen.

Wie mache ich das?

ERKLÄRUNG : Ich möchte es nicht mit sudo machen, da Benutzer dann ihr Passwort eingeben müssen. Ich möchte nur, dass sie das Skript als root ausführen, vielleicht etwas Setuid, keine Ahnung.

Flybywire
quelle

Antworten:

23

Wenn dies eine normale Binärdatei wäre, könnten Sie setuid durch Ausführen festlegen

# chmod u+s /path/to/binary

Leider können Skripte nicht gesetzt werden. (Nun, Sie können, aber es wird ignoriert). Der Grund dafür ist, dass die erste Zeile des Skripts dem Betriebssystem mitteilt, unter welchem ​​Interpreter das Skript ausgeführt werden soll. Zum Beispiel, wenn Sie ein Skript hatten mit:

#!/bin/bash

Du würdest tatsächlich rennen

/bin/bash /path/to/script

Natürlich müsste der Interpreter setuid sein, was dann bedeuten würde, dass alle Skripte setuid sind. Das wäre schlecht.

Sie können dies mit sudo tun, indem Sie Folgendes in Ihre / etc / sudoers-Datei einfügen, indem Sie visudo ausführen.

ALL ALL=NOPASSWD: /path/to/script

Und jetzt kann jeder Benutzer laufen

$ sudo /path/to/script

Auf diese Weise können sie das Skript ausführen, ohne ihr Kennwort eingeben zu müssen.

Es gibt eine Alternative, für die im Befehl kein sudo erforderlich ist. Dazu muss eine kleine setuided-Binärdatei erstellt werden, die Ihr Skript ausführt. Jede zusätzliche setuid-Binärdatei fügt jedoch ein weiteres potenzielles Sicherheitsproblem hinzu.

David Pashley
quelle
Ich denke, das ist die Antwort, nach der ich gesucht habe. Kann ich kein Bash-Skript festlegen, nur eine Binärdatei? (Natürlich würde ich Maßnahmen ergreifen, um es unbearbeitbar zu machen)
Flybywire
Nein, Sie können keine Skript-Setuid erstellen.
Wfaulk
wfaulk: Früher war das möglich, aber die neuesten Linux-Distributionen erlauben es nicht mehr. Sie können ein Tool wie shc verwenden, um das Skript zu "kompilieren" und es dann setuid zu machen.
Kyle Brandt
wfaulk: Natürlich würde das alles daran setzen, etwas zu tun, das absichtlich deaktiviert ist, also ist es wahrscheinlich eine schlechte Idee :-)
Kyle Brandt
Ersetzen Sie den Begriff ALLdurch einen Benutzernamen, damit nur dieser eine Sudoer ohne Eingabe eines Kennworts ausgeführt werden kann.
Hdave
3

Ich musste diese Zeile am Ende von / etc / sudoers einfügen: ALL ALL = NOPASSWD: <filename> Anscheinend %admin ALL=(ALL) ALLerforderte eine spätere Überschreibung ein Passwort für Administratorbenutzer.

Es gibt kein Sicherheitsproblem, das das Ausführen eines Skripts als Root zulässt, solange das Skript eine genau festgelegte, harmlose und zulässige Aktion ausführt und wenn Werte für Parameter nicht zu einem Fehlverhalten des Skripts führen können.

Aber es gibt eine Gotcha ...

Verwenden Sie immer vollständige Pfade in Befehls- und Dateinamen. Wenn Sie so etwas wie echo Hello world!in schreiben myrootscript, könnte jemand ein schreiben ~/bin/echo scriptund myrootscriptals root ausführen, was auch immer darin enthalten ist.

/bin/echo "Hoping this will keep you safe" :-)

André
quelle
Wenn es einem Nicht-Root-Benutzer auf dem Computer möglich ist, dieses Skript zu bearbeiten, kann dieser Benutzer den Computer übernehmen. Wenn derselbe Benutzer ein schwaches Kennwort hat, verhindert nichts, dass Ihr Computer vollständig kompromittiert wird.
Hdave
2

Standardmäßig dürfen Mitglieder der wheelGruppe sudojeden Befehl als root. Dies ist wahrscheinlich, wie Sie sudobisher verwenden.

Um einen anderen Benutzer zuzulassen, müssen Sie eine sudoersRegel erstellen . Zum Beispiel:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Kann der Benutzer mickey.mouseden Befehl auszuführen , /usr/local/bin/test.shwie , rootohne dass eine zusätzliche Passwortabfrage.

Sie sollten dieses Dokument lesen , um weitere Informationen zu erhalten.

Dan Carley
quelle
Debian / Ubuntu verwenden die Admin-Gruppe anstelle von Wheel. Es ist möglicherweise ein etwas genauerer Name.
David Pashley
Nennen Sie mich altmodisch, aber ..;)
Dan Carley
1
altmodisch: P
David Pashley
0

Verwenden Sie, chmod +s <filename>um das Suid-Bit zu sehen. Dies bedeutet, dass die Datei bei ihrer Ausführung mit den Berechtigungen des Eigentümers der Datei ausgeführt wird (also an root übergeben, damit sie so ausgeführt wird).

Dies kann jedoch bei so etwas wie Bash-Skripten SEHR gefährlich sein, da ein Benutzer einen Weg findet, dies zu ändern, und leicht eine Root-Shell erhalten kann. Stellen Sie sicher, dass niemand außer root darauf schreiben kann.

Unter Linux können Sie keine Skripte festlegen. Dazu müssen Sie es als Programm kompilieren. Stattdessen können Sie die sudoers-Datei (/ etc / sudoers) verwenden und eine Zeile wie diese hinzufügen.

<username> ALL = NOPASSWD: /path/to/script

Dentrasi
quelle
0

Eine andere Alternative: Sie können einen kleinen Setuid-C-Wrapper um dieses Skript erstellen

  • prüft auf eventuelle Einschränkungen, die Sie erzwingen möchten (Benutzerliste, Zeit, Systemlast, ...)
  • Protokolliert / überwacht die Ausführung, falls gewünscht
  • führt das Skript aus

Ein bisschen wie Ihre eigene Teilmenge der vielfältigen Fähigkeiten von sudo.

mpez0
quelle