2009-04-27 12 views
17

Quiero hacer un servicio web que ejecute código de otras personas localmente ... Naturalmente, quiero limitar su código de acceso a cierto directorio "sandbox", y que no podrán conectarse a otras partes de mi servidor (DB, servidor web principal, etc.)¿Manera segura de ejecutar el código de otras personas (sandbox) en mi servidor?

¿Cuál es la mejor manera de hacerlo?

Ejecutar VMware/VirtualBox:

(+) supongo que es tan seguro como se pone .. incluso si alguien logra "hackear" .. sólo hackear la máquina de invitados

(+) puede limitar la memoria CPU & el proceso utiliza

(+) fácil de configurar .. acaba de crear la máquina virtual

(-) más difícil de "conectar" directorio recinto del anfitrión al huésped

(-) perder la memoria adicional y la CPU para la gestión de la máquina virtual

Run usuario no privilegiados:

(+) de residuos duerma recursos adicionales

directorio recinto (+) es sólo una llanura directorio

(?) ¿no puede limitar la CPU y la memoria?

(?) No sé si es lo suficientemente seguro ...

Cualquier otra forma?

Server que se ejecuta Fedora Core 8, los "otros" códigos escritos en Java & C++

+0

Más sobre el tema en: http://security.stackexchange.com/questions/32375/how-to-run-clients-code-on-server- de manera segura –

Respuesta

2
  1. Correr bajo un usuario sin privilegios aún permite un atacante local to exploit vulnerabilities to elevate privileges.
  2. Permitir la ejecución de código en una VM también puede ser inseguro; el atacante puede obtener acceso al sistema host, como se muestra en el reciente VMWare vulnerability report.

En mi opinión, permitir el funcionamiento del código nativo en su sistema en primer lugar no es una buena idea desde el punto de vista de la seguridad. Tal vez debería reconsiderar el permitirles ejecutar código nativo, esto sin duda reducirá el riesgo.

+4

bien ... por supuesto que no es una buena idea desde el punto de vista de la seguridad, pero tengo que hacerlo, así que tengo que comprometerme. Sé que no hay 100% de seguridad si dejo que otras personas ejecuten código (no hay 100% de seguridad en ninguna parte). No es un sitio bancario donde la gente tiene una gran motivación para "piratear" ... solo quiero obtener tanto " Costo-beneficio "como puedo". – amitkaz

+1

Usa alguna forma de sandboxing, pero considera no permitir el funcionamiento del código nativo. es posible? –

+18

Podríamos extender este argumento a * "hay vulnerabilidades en los servidores web, por lo que no debe ejecutar un sitio web." * De hecho, * "hay vulnerabilidades en los navegadores web, por lo que no debe navegar por Internet!" * –

1

Salida ulimit y amigos para formas de limitar la capacidad del usuario desfavorecidos a la máquina DOS.

5

chroot, jail, container, VServer/OpenVZ/etc., Son generalmente más segura que se ejecuta como un usuario sin privilegios, pero más ligero de peso que la virtualización OS completo.

Además, para Java, puede confiar en el sandboxing integrado de la JVM, y para compilar C++, NaCl afirma que puede codificar sandbox x86.

Pero como la respuesta de Checkers dice, se ha demostrado que es posible causar daño malicioso en casi cualquier "recinto" en el pasado, y esperaría que se encontraran más agujeros (y con suerte se corrijan) en el futuro. ¿Usted realmente quiere correr código que no es de confianza?

14

Para limitar la CPU y la memoria, que desea establecer límites para los grupos de procesos (límites de recursos POSIX sólo se aplican a los procesos individuales). Puedes hacer esto usando cgroups.

Por ejemplo, para límite de inicio de memoria mediante el montaje del sistema de archivos de memoria cgroups:

# mount cgroup -t cgroup -o memory /cgroups/memory

A continuación, cree un nuevo subdirectorio para cada grupo, por ejemplo,

# mkdir /cgroups/memory/my-users 

Ponga los procesos que desea constreñidos (proceso con PID "1234" aquí) en este grupo:

# cd /cgroups/memory/my-users 
# echo 1234 >> tasks 

Establecer el límite de memoria total para el grupo:

# echo 1000000 > memory.limit_in_bytes

Si los procesos en el grupo tenedor procesos secundarios, también estarán en el grupo.

El grupo anterior establece el límite de memoria residente (es decir, los procesos restringidos comenzarán a intercambiarse en lugar de usar más memoria). Otros cgroups te permiten restringir otras cosas, como el tiempo de CPU.

Puede poner su proceso de servidor en el grupo (para que todo el sistema con todos sus usuarios caiga por debajo de los límites) o hacer que el servidor ponga cada nueva sesión en un nuevo grupo.

0

No estoy seguro de cuánto esfuerzo desea poner en esta cosa, pero podría ejecutar Xen como los servidores web de VPS por ahí?

http://www.xen.org/

Esto permitiría el acceso root completo en su pequeño pedazo del servidor sin comprometer los demás usuarios o del sistema base.

1

Intente aprender un poco sobre la configuración de políticas para SELinux. Si está ejecutando un cuadro de Red Hat, está listo, ya que lo empaqueta en la distribución predeterminada.

Esto le será útil si conoce las cosas a las que el código no debería tener acceso. O puede hacer lo contrario y solo otorgar acceso a ciertas cosas.

Sin embargo, esas políticas son complicadas y pueden requerir más inversión en tiempo de lo que usted podría desear.

1

Utilice Ideone API - la manera más simple.

+2

Ideone API limita el número de solicitudes a 1000 por mes. Esa es una de las razones por las que quiero crear mi propio juez en línea. – SinnerShanky

+2

@SinnerShanky Si necesita un servicio de juez en línea, entonces hay muchos servicios listos. P.ej. [DOMjudge] (http://domjudge.sourceforge.net/) es el que puede instalar en su propio servidor. También puede usar [SPOJ] (http://spoj.com) que es el que permite establecer un concurso personalizable (y usa el mismo motor que ideone). BTW: Ideone permite más envíos en la opción cargada. – kuszi

2

intente utilizar lxc como un contenedor para el servidor Apache

Cuestiones relacionadas