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

58404
HappyDeveloper

Wie lässt sich ein Skript als root ausführen, unabhängig davon, wer es ausführt?

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

Ich verwende Linux, Ubuntu 12.04 LTS.

27
Auf welcher Linux-Distribution arbeiten Sie? Oder sogar Unix? slhck vor 11 Jahren 0
@slhck Linux, Ubuntu 12 HappyDeveloper vor 11 Jahren 0
`setuid` funktioniert nicht mit Skripten - es ist heutzutage aus Sicherheitsgründen für die meisten * nix-Distributionen deaktiviert. Sie können es einstellen, aber es wird ignoriert. Vielleicht können Sie mehr über Ihr aktuelles Problem erklären, damit wir Ihnen stattdessen helfen können, dieses Problem zu lösen. Welches Skript ist das? Warum muss es als root ausgeführt werden? Ist "sudo" eine Alternative? slhck vor 11 Jahren 3
Haben Sie "sudo -s" ausprobiert? Nam Phung vor 11 Jahren 0

2 Antworten auf die Frage

29
speakr

Seien Sie sehr vorsichtig: Mit setuid kombinierte Skripte sind gefährlich!

Bitte schauen Sie sich zuerst diese Frage / Antworten an, insbesondere diese Antwort und Sicherheitswarnung .

Wenn Sie Ihr Skript weiterhin 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 Schreibzugriff (und möglicherweise andere) 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, indem Sie z. B. die Zugriffsrechte des übergeordneten Ordners ändern :

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

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

    Weitere Details zu den Einstellungen (z. B. Beschrä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 Verwendung der Wrapper / Setuid-Lösung oben.

Die spezifischen Gefahren sind nicht sehr offensichtlich, aber sie drehen sich stark um die Umgebung. Im Gegensatz zu den meisten Programmen kann das Verhalten eines Shell-Skripts durch Dutzende von Umgebungsvariablen erheblich geändert werden, so dass ein solches Skript ohne umfangreiche Sicherheitsmaßnahmen leicht zur Ausführung von beliebigem Code herangezogen werden kann. Stephanie vor 11 Jahren 3
Sie sollten vor dem Systemaufruf in diesem Wrapper einen Aufruf zu clearenv () hinzufügen, der die Umgebung vollständig wegbläst, sodass keine bösen Einstellungen vorhanden sind, um das Skript zu manipulieren. http://www.kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html Stephanie vor 11 Jahren 1
@Stephanie Danke, das habe ich hinzugefügt. speakr vor 11 Jahren 0
@ Stepman Ich muss etwas falsch machen, weil das alles für eine gewöhnliche Aufgabe zu verrückt aussieht. Dies versuche ich zu tun: http://serverfault.com/questions/401405/how-to-activate-iptables-after-connecting-to-vpn HappyDeveloper vor 11 Jahren 0
@HappyDeveloper Nicht zu verrückt für ein setuid-Skript, da ein schlecht gesichertes Skript einen Pfad zum Root-Pfad für alle Benutzer darstellt, die es ausführen können. Stephanie vor 11 Jahren 0
Mit sudo können alle Benutzer Zugriff auf ein bestimmtes Programm (oder Skript) erhalten. In diesem Sinne fungiert es als extravaganter Setuid-Wrapper. Es scheint, als wäre dies normalerweise die bessere Wahl, als den eigenen setuid-Wrapper zu schreiben. jjlin vor 11 Jahren 4
Ich habe die erste Lösung (setuid) verwendet, weil ich sie nach dem Einloggen automatisch ausführen muss, ohne nach einem Passwort zu fragen. Und ich mag es nicht, das Passwort von sudo zu entfernen. Möglicherweise muss das Skript auch von Nicht-Sudoern ausgeführt werden HappyDeveloper vor 11 Jahren 0
@HappyDeveloper Sie entfernen nur das Sudo-Kennwort, wenn Sie es mit _das spezifische Skript_ verwenden. Andere Befehle sind nicht betroffen. Sie können auch _ALL_ als Benutzeralias angeben, um allen Benutzern den Zugriff auf das Skript zu ermöglichen. Ich habe meine Antwort entsprechend geändert. speakr vor 11 Jahren 0
@speakr Oh ich verstehe, danke HappyDeveloper vor 11 Jahren 0
4
Tadas

Die einfachste und sicherste Methode ist die Verwendung von SETUID-Bits in Dateiberechtigungen. Auf diese Weise werden Befehlsberechtigungen auf Berechtigungen für Dateibesitzer erhöht.

Um zu verhindern, dass das Skript aus der Edition kommt, setzen Sie das Schreiben nicht für alle Bits.