Ist es möglich, ein Bash-Skript in einer Art Sandbox auszuführen?

13

Unser Produkt muss ein unbekanntes Bash-Skript auf einem heiklen Server ausführen, um ein bestimmtes Ziel zu erreichen. Dieses Bash-Skript wird vom Benutzer bereitgestellt. Wir möchten sicherstellen, dass nur bestimmte Befehle zulässig sind und alle anderen nicht. Außerdem müssen wir einige Befehle durch andere ersetzen.

So möchten wir beispielsweise das Skript ausführen und die folgenden Befehle zulassen: echo cat awk

Erlaube aber keinen anderen Befehl (wir wollen hier keine spezifische Liste angeben).

Wenn das Skript außerdem den Befehl cp enthält, möchten wir ihn erfassen und zu einem anderen Befehl umleiten (dies kann mithilfe eines Alias ​​erfolgen).

Irgendeine Idee, wie das gemacht wird?

Yon
quelle

Antworten:

9

Am einfachsten ist es, ein Chroot-Jail zu verwenden, das nur die Befehle enthält, die das Skript ausführen kann. Anschließend führen Sie das Skript über einen Wrapper aus, der chrootdas Verzeichnis aufruft und dann das Skript ausführt.

Ignacio Vazquez-Abrams
quelle
17

Es gibt keine 100% sichere Möglichkeit, das Skript in einer virtuellen Maschine auszuführen, was vermutlich verhindern würde, dass das Skript sein Ziel erreicht. Es gibt jedoch zwei Funktionen, die Ihnen helfen können. Wenn Sie befürchten, dass das Skript von einer böswilligen Person geschrieben wurde, reichen diese Funktionen nicht aus. Wenn Sie jedoch nur befürchten, dass das Skript Ihrem System schadet, weil es von einem nachlässigen Programmierer geschrieben wurde oder unterschiedliche Ziele verfolgt, sorgt eine dieser beiden Funktionen für eine anständige Sandbox-Umgebung.

  • Sie können eine eingeschränkte Shell ausführen, indem Sie bash as aufrufen bash -r. Ich verweise Sie auf das Bash-Handbuch für eine detaillierte Beschreibung; Die Grundidee ist, dass das Skript keine Befehle aufrufen kann, die sich nicht in einer Datei befinden $PATH, nicht geändert $PATHwerden können, nicht zu einer Datei umgeleitet werden können oder von einer Datei umgeleitet werden können, und einige weitere Einschränkungen. Dies ist recht einfach einzurichten, aber wenn das unbekannte Skript zu kompliziert ist, um es zu überprüfen, werden wahrscheinlich viele Dinge verwendet, die in einer eingeschränkten Shell verboten sind.

  • Sie können ein Chroot- Gefängnis einrichten . Die Idee ist, einen Verzeichnisbaum einzurichten /some/rootund das Skript in einer Umgebung auszuführen, in der angenommen wird, dass /some/rootes sich um das gesamte Dateisystem handelt ( chrootkurz für change root). Sobald der Verzeichnisbaum eingerichtet ist, führen Sie das Skript (kopiert nach /some/root/myscript) als aus chroot /some/root /bin/bash /myscript. Beispielsweise würden Sie ein Verzeichnis /some/root/binmit den Befehlen einrichten, die Sie zulassen möchten, und das Chroot-Programm würde dieses Verzeichnis als sehen /bin. Sie müssen alles, was für die Ausführung des Programms erforderlich ist, in die Chroot kopieren: Bibliotheken, Datendateien bash, das Skript selbst usw. Möglicherweise muss das Skript /procin die Chroot eingebunden werden. Sie können dies mit einem Befehl wie mount -t proc proc /proc.

    Wenn Sie dem Skript einen vollständigen Verzeichnisbaum zur Verfügung stellen möchten /var/example, haben Sie beispielsweise mehrere Möglichkeiten. Sie können eine Kopie unter erstellen /some/root. Sie können feste Links erstellen (wenn diese für Ihre Anwendung funktionieren und sich die Chroot im selben Dateisystem befindet). Unter Linux können Sie in der Chroot mount --bind /var/example /some/root/var/example"pfropfen" /var/example. Beachten Sie, dass eine symbolische Verknüpfung nicht funktioniert, da das Ziel der Verknüpfung in der Chroot bestimmt wird.

    Beachten Sie, dass Chroot keine absolute Sicherheit bietet, insbesondere gegenüber Prozessen, die als Root ausgeführt werden. Ein Root-Prozess könnte beispielsweise eine Gerätedatei in der Chroot erstellen und über diese auf die gesamte Festplatte zugreifen. Ein Chroot-Prozess kann weiterhin Netzwerkverbindungen herstellen (Sie können dies verbieten, indem Sie kein Netzwerkprogramm in die Chroot aufnehmen und sicherstellen, dass das nicht vertrauenswürdige Programm keine Datei erstellen und sie ausführbar machen oder eine vorhandene ausführbare Datei überschreiben kann).

Gilles
quelle
Sie müssen alles Notwendige kopieren . Kann ich symbolische oder harte Links erstellen anstatt zu kopieren?
kyb
1
@kyb Harter Link: ja. Symbolische Verknüpfung: Nein, eine symbolische Verknüpfung kann nur auf eine Datei verweisen, die Sie sehen können. Sie lässt Sie nicht aus einer Chroot entkommen. Harte Links sind schwer zu benutzen und fummelig: Sie brechen, wenn Sie die Datei ersetzen, und machen die Originalkopie sichtbar, falls sie in der Chroot beschreibbar ist. Wenn Sie einen ganzen Baum verfügbar machen möchten, kopieren Sie ihn oder führen Sie ein schreibgeschütztes Bindungs-Mount durch.
Gilles
Ich muss zur Verfügung häufig verwendete Befehle wie machen grep, awk, unitsetc. Muss ich jede bin - Datei und alle Abhängigkeiten manuell kopieren oder es gibt einige handliche Hack explizit zu sagen , was utils sollte in chroot arbeiten?
kyb