Ich schreibe einen Webserver auf Python-Basis, der "Plugins" ausführen kann, damit die Funktionalität einfach erweitert werden kann.Python: Sicherung nicht vertrauenswürdiger Skripts/Subprozesse mit Chroot und Chjail?
Dafür habe ich den Ansatz, eine Reihe von Ordnern (eine für jedes Plugin) und eine Reihe von Shell/Python-Skripte in dort benannt nach vordefinierten Namen für verschiedene Ereignisse, die auftreten können.
Ein Beispiel ist eine on_pdf_uploaded.py
Datei, die ausgeführt wird, wenn ein PDF auf den Server hochgeladen wird. Um dies zu tun, würde ich Pythons Subprozess Werkzeuge verwenden.
Für Bequemlichkeit und Sicherheit, würde dies erlauben mir Unix-Umgebungsvariablen zu verwenden, um weitere Informationen zu geben und das Arbeitsverzeichnis (cwd) des Prozesses festzulegen, so dass es auf die richtigen Dateien zugreifen kann, ohne ihren Standort zu finden.
Da der Plugin-Code von einer nicht vertrauenswürdigen Quelle stammt, möchte ich es so sicher wie möglich machen. Meine Idee war, den Code in einem Subprozess auszuführen, ihn aber in ein chroot-Gefängnis mit einem anderen Benutzer zu legen, so dass er nicht auf andere Ressourcen auf dem Server zugreifen kann.
Leider konnte ich nichts darüber finden, und ich würde mich nicht auf das nicht vertrauenswürdige Skript verlassen wollen, um sich selbst ins Gefängnis zu bringen.
Desweiteren kann ich den main/calling-Prozess auch nicht in ein chroot-Gefängnis stellen, da Plugin-Code in mehreren Prozessen zur gleichen Zeit ausgeführt werden kann, während der Server andere Anfragen beantwortet.
Hier ist die Frage: Wie kann ich Subprozesse/Skripte in einem Chroot-Gefängnis mit minimalen Berechtigungen ausführen, um den Rest des Servers vor fehlerhaftem, nicht vertrauenswürdigem Code zu schützen?
Vielen Dank!
Ist das wirklich dein Job? Sollten sie nicht wissen, welchen Code sie ausführen? Was auch immer ... Hilft das? [os.chroot()] (http://docs.python.org/library/os.html#os.chroot). Plus, "os" hat gute Sachen, um mit der uid usw. zu verwirren. Also, erstelle einen neuen Prozess, (os.fork()?) Dann os.setuid dann os.excle(). – Logan