Wie kann ein Shell-Skript vor Unkontrolliertheit geschützt werden?

7

Ich habe kürzlich die Erfahrung gemacht, ein Shell-Skript zu schreiben, das einen Server zum Absturz brachte (und eine Partition beschädigte), indem alle Ressourcen verbraucht wurden. Es war an einen Cron-Job angeschlossen, und es scheint, dass es länger gedauert hat als das Intervall zwischen den Hinrichtungen, und im Laufe der Zeit ist der Schneeball außer Kontrolle geraten.

Jetzt habe ich es so geändert, dass es seinen Betriebszustand aufzeichnet und nicht mehr als einmal gleichzeitig ausgeführt wird. Meine Frage ist: Gibt es andere, einfache Möglichkeiten, ein Skript vor Schaden zu schützen? Gibt es eine Standardliste von Dingen, die ein Skript tun sollte, um sich richtig zu verhalten, nicht zu viele Ressourcen zu verbrauchen, ordnungsgemäß zu versagen, die richtigen Personen zu alarmieren usw.?

Grundsätzlich: Welche anderen Fallstricke sollte ich vermeiden?

Steve Bennett
quelle

Antworten:

4

Computer tun genau das, was ihnen gesagt wird. Die einzige Möglichkeit, um sicherzustellen, dass sich ein Skript "richtig verhält", besteht darin, es so zu schreiben, dass es sich unter allen Umständen richtig verhält.

Einige grundlegende Ratschläge:

  1. Implementieren Sie eine Art Überwachungssystem.
    Die Tatsache, dass Ihr System in die Luft gesprengt wurde, ohne dass Sie wussten, dass es kommen würde, zeigt mir, dass Sie entweder kein Überwachungssystem haben oder Ihr aktuelles System nicht gut genug ist.
    Investieren Sie etwas Zeit, um sicherzustellen, dass Ihre Server Ihnen mitteilen, dass ein Problem vorliegt, bevor sie umfallen.
  2. Schließen Sie geeignete Schutzmaßnahmen in Skripte ein, die von cron ausgeführt werden.
    Ihr Skript ist auf seinen eigenen Schwanz getreten. Das sollte nicht passieren.
    Sie haben auf die harte Tour gelernt, wie Sie sich vor solchen Dingen schützen müssen (und lassen sich vom System benachrichtigen, wenn dies passiert).
  3. Gründlicher entwerfen und testen.
    Bewerten Sie jedes Skript, das Sie bereitstellen möchten, sorgfältig, um sicherzustellen, dass keine unerwünschten Nebenwirkungen auftreten. Wenn Sie sich ein Fehlerszenario vorstellen können, testen Sie es (und behandeln Sie es richtig!).
    Nehmen Sie sich Zeit, um Fehler zu simulieren (entweder indem Sie die Bedingung in Ihrem Skript fest auf true codieren oder indem Sie die Umstände zum Testen Ihrer Erkennungslogik generieren.
voretaq7
quelle
Ok - aber meine Frage lautet "Welche Sicherheitsvorkehrungen sollte ich implementieren?" Und Ihre Antwort 2 lautet "Implementieren Sie geeignete Sicherheitsvorkehrungen". Gibt es eine Liste? Empfohlene Vorgehensweise? Muster?
Steve Bennett
Nein. Die entsprechenden Sicherheitsvorkehrungen hängen davon ab, was Sie tun. Es gibt keine einheitliche Lösung - Sie müssen Ihre spezielle Situation analysieren und entsprechend handeln. Die Bereitstellung einer vollständigen Liste würde die Lösung des Halteproblems erfordern .
voretaq7
0

Die Sicherheitsmaßnahmen, über die Sie sprechen, hängen davon ab, was Ihr Skript tut. Zum Beispiel ist es besser, einige wichtige Dateien zu sichern, bevor Sie sie automatisch ändern. Wenn das Skript auf irgendeine Weise fehlschlägt und diese wichtige Datei beschädigt, sind Sie sicher, da Sie über ein Backup usw. verfügen.

Eine wichtige Sache zu erwähnen ist das Protokollieren, Protokollieren und Protokollieren . Wenn Ihr Skript im Hintergrund ausgeführt wird, ohne dass eine Protokolldatei den Fortschritt und die Vorgänge anzeigt, haben Sie in naher oder ferner Zukunft keine Ahnung von potenziellen Problemen. Vergessen Sie nicht, den Zeitstempel jedes Protokolleintrags anzugeben und dem NTP-Dienst zu ermöglichen, genau zu wissen, zu welchem ​​Zeitpunkt dies geschehen ist.

Khaled
quelle
Das Problem, das ich bei der Protokollierung habe, ist ein massives, sehr ausführliches Protokoll, das sehr schwer zu überfliegen ist.
Steve Bennett
Sie können mehrere Protokollierungsstufen festlegen. Unter normalen Bedingungen sollten Sie nur die Fehler und Warnungen sowie einige Informationen protokollieren. Logrotate kann Ihnen auch bei der Verwaltung Ihrer Protokolle helfen, um sehr große Protokolldateien zu vermeiden.
Khaled
0

Am Ende führen wir das Skript jetzt in einer VM aus. Dies schränkt den Umfang des Schadens, der verursacht werden kann, erheblich ein.

Das Erschreckende an Linux (zumindest für mich) ist, dass kleinere Tippfehler oder Fehler verheerende Auswirkungen haben können. Sogar so etwas wie das Ausführen eines Befehls mit einem $ {VARIABLE} kann eine völlig andere (und destruktive) Bedeutung haben, wenn diese Variable leer ist oder ein Leerzeichen enthält.

Steve Bennett
quelle
1
Ich hasse es, es Ihnen zu brechen, aber Sie können Windows oder andere Betriebssysteme genauso leicht mit ein wenig nachlässiger Skripterstellung brechen wie der Administrator. Der Schlüssel besteht darin, die geringste Anzahl von Berechtigungen zu verwenden, die für die Ausführung des Auftrags erforderlich sind.
Magellan
Völlig plausibel - aber nicht relevant. Und eigentlich sollte ich oben "Linux" durch "Bash" ersetzen. Es sind das endlose Munging von Text, verschiedene Fluchtmechanismen, Ersetzungen usw., die so fehleranfällig sind.
Steve Bennett
Nun ja. Bash ist selbst an einem guten Tag viel mehr eine Kunst als eine Wissenschaft.
Magellan