2016-08-08 22 views
3

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.

Antwort

Verwandte Themen