2012-05-14 5 views
8

Ich habe eine Reihe von Python-Projekten mit nicht vertrauenswürdigen WSGI-Anwendungen in ihnen. Ich muss sie simultan und sicher führen. Also brauche ich Einschränkungen für den Verzeichniszugriff, Python-Modul-Nutzung und Einschränkungen für CPU und Speicher.Python Code ins Gefängnis

Ich halte zwei Ansätze:

  1. Import über imp-Modul WSGI-Objekt aus definierten Datei, und es mit pysandbox läuft. Jetzt habe ich SandboxError: Read only object wenn tun:

    self.config = SandboxConfig('stdout') 
    self.sandbox = Sandbox(self.config) 
    self.s = imp.get_suffixes() 
    wsgi_obj = imp.load_module("run", open(path+"/run.py", "r"), path, self.s[2]).app 
    … 
    return self.sandbox.call(wsgi_obj, environ, start_response) 
    
  2. Ändern Python-Interpreter, ausschließen potenziell riskante Module, in parallelen Prozessen ablaufen, kommunizieren über ZMQ/Unix-Sockets. Ich weiß überhaupt nicht, wo ich anfangen soll.

Was können Sie empfehlen?

+0

Prozesstrennung ist definitiv eine gute Idee. Noch besser wäre es, Virtualisierung zu nutzen. Ich weiß nichts über pysandbox, aber ich habe gehört, dass die vorhandenen Lösungen für Sandbox-Python-Code nicht besonders gut sind. –

+1

Sandboxing in CPython ist nicht sehr gut, aber andere Python-Interpreter, insbesondere PyPy, haben eine umfassendere Sandboxing-Unterstützung. –

+0

Ich habe versucht PyPy Sandboxing. Es ist zu kompliziert. – sashab

Antwort

3

Ich würde Ihre Anwendungen mit Gunicorn ausführen, mit einem separaten Prozess und Konfiguration für jede App und mit Berechtigungen auf Benutzerebene (jede nicht vertrauenswürdige App auf einem anderen Benutzer). Jede gunicorn-Instanz würde auf einem Benutzerbereich-Port auf localhost ausgeführt werden, und nginx oder ein anderer Webserver könnte sich mit ihnen verbinden, um sie an das Web zu routen und zu bedienen.

Heroku geht einen Schritt weiter und Sandkasten jede Gunicorn-Instanz (oder Einhorn oder Apache oder beliebige andere Server) in einer virtuellen Maschine. Dies ist wahrscheinlich die sicherste Möglichkeit, Dinge zu tun, und definitiv die beste Option, um die CPU- und Speichernutzung zuverlässig zu begrenzen, aber Sie müssen nicht so weit gehen, je nach Ihren Anforderungen.

Einer der Vorteile dieses Ansatzes besteht darin, dass jede Anwendung bei Bedarf auf einer anderen Version von Python ausgeführt werden kann. Mit der Sandbox der virtuellen Maschine können sie sogar auf verschiedenen Betriebssystemen laufen.

Bearbeiten: Um die Speichernutzung zu beschränken, ohne einen VM-Sandbox-Ansatz zu verwenden, siehe this question. Um die CPU-Auslastung zu begrenzen, optimieren Sie die Gunicorn-Einstellungen. Starten Sie einen Gevent-ähnlichen Worker pro Kern, den eine Anwendung verwenden darf.

Noch einmal bearbeiten: Ein völlig anderer Ansatz wäre die Verwendung von PyPy's sandboxing mechanism, die viel sicherer sein sollte als CPython und ein Sandbox-Modul. Allerdings würde ich die Guincorn oder Gunicorn + virtuelle Maschine Ansatz bevorzugen.

+0

Was können Sie als Lösung für das Routing empfehlen? Es sollte schnell und asynchron sein, und wegen einiger zusätzlicher Logik ist nginx keine Lösung. Tornado? – sashab

+0

Hmmmm, ich bin nicht sicher, ich benutze Nginx als Front für Gunicorn und habe nicht viel mit diesem Teil des Stacks experimentiert. Erfordert die zusätzliche Logik, dass Sie benutzerdefinierten Code schreiben? In diesem Fall wäre Tornado vielleicht der Beste. Gunicorn hat eine Art Tornado-Unterstützung, aber ich glaube, es ist für einen anderen Zweck als das, was Sie im Sinn haben. –

+0

Nun, ich muss Subdomain im Grunde zu App routen, und tun Sie es dynamisch (Anzahl der Apps. Könnte sich ändern). – sashab