Estoy escribiendo un servidor web basado en Python que debería poder ejecutar "complementos" para que la funcionalidad se pueda extender fácilmente.Python: ¿Proteger los scripts/subprocesos no confiables con chroot y chjail?
Para esto consideré el enfoque para tener un número de carpetas (una para cada complemento) y un número de scripts de shell/python que llevan el nombre de nombres predefinidos para diferentes eventos que pueden ocurrir.
Un ejemplo es tener un archivo on_pdf_uploaded.py
que se ejecuta cuando se carga un PDF en el servidor. Para hacer esto, utilizaría las herramientas del subproceso de Python.
Para mayor comodidad y seguridad, esto me permitiría usar variables de entorno Unix para proporcionar más información y configurar el directorio de trabajo (cwd) del proceso para que pueda acceder a los archivos correctos sin tener que encontrar su ubicación.
Como el código del complemento procede de una fuente que no es de confianza, quiero que sea lo más seguro posible. Mi idea era ejecutar el código en un subproceso, pero ponerlo en una cárcel chroot con un usuario diferente, para que no pueda acceder a ningún otro recurso en el servidor.
Lamentablemente no pude encontrar nada al respecto, y no me gustaría confiar en la secuencia de comandos que no es de confianza para meterse en la cárcel.
Además, no puedo poner el proceso principal/de llamadas en una cárcel chroot, ya que el código del complemento puede ejecutarse en múltiples procesos al mismo tiempo mientras el servidor está respondiendo otras solicitudes.
Así que aquí está la pregunta: ¿Cómo puedo ejecutar subprocesos/scripts en una cárcel chroot con privilegios mínimos para proteger el resto del servidor de daños provocados por un código defectuoso que no es de confianza?
¡Gracias!
¿Es este realmente su trabajo? ¿No deberían saber qué código están ejecutando? Lo que sea ... ¿Esto ayuda? [os.chroot()] (http://docs.python.org/library/os.html#os.chroot). Además, 'os' tiene cosas buenas para meterse con el uid, etc. Entonces, cree un nuevo proceso, (os.fork()?) Luego os.setuid y luego os.execle(). – Logan