Einsperren von Python-Code

8

Ich habe eine Menge Python-Projekte mit nicht vertrauenswürdigen WSGI-Apps 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 Arbeitsspeicher.

Ich betrachte zwei Ansätze:

  1. Importieren Sie über das imp-Modul WSGI-Objekt aus einer definierten Datei und führen Sie es mit pysandbox aus. Jetzt habe ich SandboxError: Read only object wenn:

    %Vor%
  2. Ändern Sie den Python-Interpreter, schließen Sie potenziell riskante Module aus, führen Sie parallele Prozesse aus, kommunizieren Sie über ZMQ / Unix-Sockets. Ich weiß nicht einmal, wo ich anfangen soll.

Was können Sie empfehlen?

    
sashab 14.05.2012, 17:07
quelle

1 Antwort

3

Ich würde Ihre Anwendungen mit gunicorn ausführen, mit einem separaten Prozess und einer separaten Konfiguration für jede App und mit Berechtigungen auf Benutzerebene (jede nicht vertrauenswürdige App für einen 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 leiten und bereitzustellen.

Heroku geht einen Schritt weiter und packt jede Gunicorn-Instanz (oder Einhorn oder Apache oder einen beliebigen anderen Server) in eine virtuelle 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 möglicherweise 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 diese Frage . Um die CPU-Auslastung zu begrenzen, optimieren Sie die Gunicorn-Einstellungen. Aktivieren Sie einen gevent-artigen Worker pro Kern, den eine Anwendung verwenden darf.

Noch einmal bearbeiten: Ein völlig anderer Ansatz wäre der PyPy-Sandboxing-Mechanismus , der viel mehr sein sollte sicherer als CPython und ein Sandbox-Modul. Allerdings würde ich die Guincorn oder Gunicorn + virtuelle Maschine Ansatz bevorzugen.

    
Andrew Gorcester 14.05.2012, 17:25
quelle