Ich brauche eine frische Idee von Ihnen, jede Hilfe wird geschätzt.Python-Skript-Zugriff auf os-Funktionen beschränken
Ich implementiere ein System, wo der Benutzer in der Lage wäre, seine eigenen Python-Skripte hochzuladen und sie auf einem der Server auszuführen.
Ich hüte mich über die Sicherheitsprobleme. Ich möchte den Zugriff auf das Betriebssystem von diesem Skript aus einschränken.
Zunächst einmal das Skript erhalten mit dem ast
Parser überprüft den Zugriff auf wie exec
viele naheliegendste Stichworte, um nicht zuzulassen, import
, open
usw.
Benutzer kann allerdings Verwendung einiger Bibliotheken erklären. Eine der wichtigen ist pandas
Bibliothek (auch ich muss matplotlib
, numpy
und andere zur Verfügung stellen). Ich habe "Proxy" -Objekte implementiert, die Module nachahmen, aber nur einen begrenzten Satz von Attributen bereitstellen. Zum Beispiel kann ich ein Proxy-Objekt json
bereitstellen, aber der Zugriff auf die Funktionen loads
oder dumps
ist nicht erlaubt.
Die meisten offensichtlichen Versuche, ein Attribut von einem beliebigen Objekt mit den Namen os
, sys
usw. zu erhalten, sind ebenfalls nicht erlaubt. Auf diese Weise versuche ich, ein Loch zu schließen, wenn ein Benutzer versucht, auf os
Modul mit json.os
zuzugreifen oder wie folgt.
Dies kann funktionieren, aber es ist eine einfache Abschirmung. Ich kann alle Module überprüfen und den Zugriff auf die meisten gefährlichen Funktionen verbieten, aber selbst ein Fehler kann zu einem möglichen Schaden führen. Einige Module können auch auf eine knifflige Weise wie pandas.tools.util.pd
auf das ursprüngliche pandas
Modul zugegriffen werden. Ich werde ein Jahr lang alles zu schließen ..
Ich dachte über den Zugriff auf Dateisystemebene zu beschränken, sondern das Skript ausgeführt werden mit eval
Funktion im Hauptprozess (celery
-Basis) und verfügt über die gleichen Berechtigungen (und gleichen Benutzer) als Hauptprozess. Theoretisch kann es alle Quellen lesen und sie an den Benutzer weitergeben.
Eine meiner Ideen ist, das Skript in einem separaten Prozess mit minimalen Mengen von Quellen und Berechtigungen auszuführen, und die Daten zu/von ihm mit Pipes übergeben. Aber das wird viel Code umgestalten müssen und die Stabilität ist nicht garantiert - ich brauche immer noch viel Code um es zum Laufen zu bringen.