2012-05-14 11 views
8

Tengo un montón de proyectos de python con aplicaciones WSGI que no son de confianza dentro de ellos. Necesito ejecutarlos de forma simulada y segura. Por lo tanto, necesito restricciones para el acceso al directorio, el uso del módulo python y las limitaciones para CPU y memoria.código de Python encarcelamiento

considero dos enfoques:

  1. de importación a través de imp-módulo WSGI a objetos de archivo definido, y ejecutarlo con pysandbox. Ahora tengo SandboxError: Read only object cuando se hace:

    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. Modificar intérprete de Python, excluir a los módulos de riesgo potencial, se ejecutan en procesos paralelos, comunicarse a través de tomas ZMQ/Unix. Incluso no sé por dónde empezar aquí.

¿Qué podrías recomendar?

+0

La separación del proceso es definitivamente una buena idea. Aún mejor sería usar la virtualización. No sé sobre pysandbox, pero escuché que las soluciones existentes para el código de sandboxing Python no son especialmente buenas. –

+1

El espacio aislado en CPython no es muy bueno, pero otros intérpretes de Python, particularmente PyPy, tienen un soporte de espacio aislado más completo. –

+0

Probé el sandboxing PyPy. Es muy complicado. – sashab

Respuesta

3

Me gustaría ejecutar sus aplicaciones con gunicorn, con un proceso y configuración por separado para cada aplicación, y con permisos de nivel de usuario (cada aplicación que no es de confianza en un usuario diferente). Cada instancia de gunicorn serviría en localhost en un puerto de rango de usuario, y nginx u otro servidor web podría conectarse a ellos para enrutarlos y enviarlos a la web.

Heroku lleva esto un paso más allá y pone a salvo cada instancia de gunicornio (o unicornio o apache o cualquier otro servidor arbitrario) en una máquina virtual. Esta es probablemente la forma más segura posible de hacer las cosas, y definitivamente es la mejor opción para limitar de manera confiable el uso de la CPU y la memoria, pero es posible que no necesite ir tan lejos según sus requisitos.

Una de las ventajas de este tipo de enfoque es que cada aplicación puede ejecutarse en una versión diferente de Python si corresponde; con el entorno limitado de la máquina virtual, incluso pueden ejecutarse por completo en diferentes sistemas operativos.

Editar: Para limitar el uso de la memoria sin utilizar un enfoque de entorno aislado de máquina virtual, consulte this question. Para limitar el uso de la CPU, ajuste la configuración de gunicornio: haga girar un trabajador de estilo gevent por núcleo que una aplicación puede usar.

Editar de nuevo: Un enfoque completamente diferente sería usar PyPy's sandboxing mechanism que debería ser mucho más seguro que CPython más un módulo de espacio aislado. Sin embargo, preferiría el enfoque guinchorn o gunicorn + máquina virtual.

+0

¿Qué podría recomendar como solución para el enrutamiento? Debería ser rápido y asíncrono, y debido a alguna lógica adicional, nginx no es la solución. ¿Tornado? – sashab

+0

Hmmmm, no estoy seguro, utilizo nginx como frontal para gunicornio y no he experimentado mucho con esa parte de la pila. ¿La lógica adicional requiere que escriba código personalizado? En ese caso, quizás Tornado sería el mejor. Gunicorn tiene algún tipo de apoyo de Tornado, pero creo que es para un propósito diferente al que tienes en mente. –

+0

Bueno, básicamente necesito enrutar el subdominio a la aplicación, y hacerlo dinámicamente (el número de aplicaciones podría cambiar). – sashab