Kann ich ein Skript immer als root ausführen lassen?

27

Wie kann man ein Skript als root ausführen lassen, egal wer es ausführt?

Ich habe über setuid gelesen, bin mir aber nicht sicher, wie ich das machen soll.

Ich benutze Linux, Ubuntu 12.04 LTS.

HappyDeveloper
quelle
Auf welcher Linux-Distribution arbeiten Sie? Oder sogar Unix?
Slhck
@slhck Linux, Ubuntu 12
HappyDeveloper
3
setuidfunktioniert nicht mit Skripten - aus Sicherheitsgründen ist es heutzutage auf den meisten * nix-Distributionen deaktiviert. Sie können es einstellen, aber es wird ignoriert. Vielleicht können Sie mehr über Ihr tatsächliches Problem erklären, damit wir Ihnen bei der Lösung dieses Problems helfen können? Um welches Drehbuch handelt es sich? Warum muss es als root ausgeführt werden? Verwenden Sie sudoeine Alternative?
Slhck
Hast du es versucht sudo -s?
Nam Phung

Antworten:

29

Seien Sie sehr vorsichtig: Skripte in Kombination mit setuid sind gefährlich!

Schauen Sie sich zunächst diese Frage / Antwort an , insbesondere diese Antwort und die Sicherheitswarnung .

Wenn Sie Ihr Skript trotzdem mit setuidset ausführen möchten, können Sie ein kurzes C-Programm als Wrapper schreiben und das setuidBit in der kompilierten Binärdatei setzen.

Wrapper-Beispiel:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Eine andere Lösung mit sudo( hier erwähnt ):

  1. Verhindern Sie als Root den schreibenden (und möglicherweise anderen) Zugriff auf Ihr Skript:

    chown root /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Stellen Sie sicher, dass niemand außer root das Skript ersetzen kann , z. B. indem Sie die Zugriffsrechte des übergeordneten Ordners ändern :

    chown root / absolute / Pfad / zu / Ihrem /
    chmod 755 / absolut / pfad / zu / deinem /
    
  3. Ändern Sie die sudo-Zugriffsrechte /etc/sudoersmit visudo:

    ALL ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    Weitere Details zu den Einstellungen (z. B. Einschränkung des Zugriffs auf bestimmte Benutzer oder Gruppen) finden Sie in der sudoers-Manpage.

Danach können alle Benutzer das Skript als root ohne Passwort ausführen:

sudo /absolute/path/to/your/script.sh

Dies ähnelt der oben beschriebenen Wrapper / Setuid-Lösung.

speakr
quelle
3
Die spezifischen Gefahren sind nicht sehr offensichtlich, aber sie drehen sich stark um die Umwelt. Im Gegensatz zu den meisten Programmen kann das Verhalten eines Shell-Skripts durch Dutzende von Umgebungsvariablen erheblich geändert werden, sodass ein solches Skript ohne umfangreiche Sicherheitsmaßnahmen leicht dazu gebracht werden kann, beliebigen Code auszuführen.
Stephanie
1
Sie sollten clearenv () vor dem Systemaufruf in diesem Wrapper einen Aufruf hinzufügen, der die Umgebung vollständig zerstört, damit keine bösen Einstellungen zur Manipulation des Skripts vorhanden sind. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie
@Stephanie Ich muss etwas falsch machen, denn all das sieht zu verrückt für eine gemeinsame Aufgabe aus. Folgendes
HappyDeveloper
@HappyDeveloper Nicht allzu verrückt nach einem Setuid-Skript, da ein schlecht abgesichertes ein Root-Pfad für jeden ist, der es schafft, es auszuführen.
Stephanie
4
sudokann verwendet werden, um allen Benutzern Zugriff auf ein bestimmtes Programm (oder Skript) zu gewähren. In diesem Sinne fungiert es als ausgefallener Setuid-Wrapper. Es scheint, als wäre dies in der Regel die bessere Wahl, als einen eigenen Setuid-Wrapper zu schreiben.
JJLIN
4

Am einfachsten und sichersten ist es, SETUID-Bits in Dateiberechtigungen zu verwenden. Auf diese Weise werden die Befehlsberechtigungen auf die Dateieignerberechtigungen erhöht.

Um zu verhindern, dass das Skript in der Edition ausgeführt wird, setzen Sie das Schreiben nicht für alle Bits.

Tadas
quelle
0

Ich weiß nicht, ob dies nützlich sein kann, aber um das Skript nur als root auszuführen, können Sie diesen Befehl in der ersten Zeile des Skripts verwenden:

#!/bin/su root
alexandre1985
quelle