linux - sandboxes - sandbox en programación
¿Manera segura de ejecutar el código de otras personas(sandbox) en mi servidor? (9)
- La ejecución bajo un usuario sin privilegios aún permite que un atacante local aproveche las vulnerabilidades para elevar los privilegios .
- Permitir ejecutar código en una máquina virtual puede ser inseguro también; El atacante puede obtener acceso al sistema host, como lo muestra el informe de vulnerabilidad reciente de VMWare .
En mi opinión, permitir la ejecución de 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 permitirles ejecutar código nativo , esto ciertamente reducirá el riesgo.
Quiero hacer un servicio web que ejecute el código de otras personas localmente ... Naturalmente, quiero limitar el acceso a su código a cierto directorio "sandbox", y que no puedan conectarse a otras partes de mi servidor (DB, main servidor web, etc)
Cuál es la mejor manera de hacerlo?
Ejecutar VMware / Virtualbox:
(+) Supongo que es tan seguro como es posible ... incluso si alguien se las arregla para "piratear" ... solo piratean la máquina invitada
(+) puede limitar la CPU y la memoria que utiliza el proceso
(+) fácil de configurar ... solo crea la VM
(-) más difícil de "conectar" el directorio de sandbox del host al huésped
(-) desperdiciando memoria extra y CPU para gestionar la máquina virtual
Ejecutar usuario sin privilegios:
(+) no desperdicia recursos extras
(+) el directorio sandbox es solo un directorio plano
(?) ¿no se puede limitar la CPU y la memoria?
(?) No sé si es lo suficientemente seguro ...
¿Cualquier otra forma?
Servidor que ejecuta Fedora Core 8, los "otros" códigos escritos en Java y C ++
Echa un vistazo a ulimit
y amigos para encontrar formas de limitar la capacidad de los usuarios menos privilegiados para DOS de la máquina.
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 empaquetan en la distribución predeterminada.
Esto será útil si sabe a qué cosas no debe tener acceso el código. 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 el tiempo de lo que usted podría desear.
Leer la página codepad.org/about puede darle algunas ideas geniales.
No estoy seguro de cuánto esfuerzo quieres poner en esta cosa, pero ¿podrías ejecutar Xen como los hosts web de VPS?
Esto permitiría el acceso total a la raíz en su pequeña parte del servidor sin comprometer a los otros usuarios o al sistema base.
Para limitar la CPU y la memoria, desea establecer límites para grupos de procesos (los límites de recursos POSIX solo se aplican a procesos individuales). Puedes hacer esto usando cgroups.
Por ejemplo, para limitar el inicio de memoria montando el sistema de archivos de memoria cgroups:
# mount cgroup -t cgroup -o memory /cgroups/memory
Luego, cree un nuevo subdirectorio para cada grupo, por ejemplo,
# mkdir /cgroups/memory/my-users
Coloque los procesos que desea restringido (procese con PID "1234" aquí) en este grupo:
# cd /cgroups/memory/my-users
# echo 1234 >> tasks
Establezca el límite de memoria total para el grupo:
# echo 1000000 > memory.limit_in_bytes
Si los procesos en el grupo bifurcan procesos, 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 le permiten restringir otras cosas, como el tiempo de CPU.
Puede poner el proceso de su servidor en el grupo (para que todo el sistema con todos sus usuarios caigan dentro de los límites) o hacer que el servidor ponga cada sesión nueva en un nuevo grupo.
Utilice la API de Ideone , la forma más sencilla.
intente usar lxc como un contenedor para su servidor apache
chroot
, jail , Container , VServer / OpenVZ / etc. son generalmente más seguros que ejecutarse como usuarios sin privilegios, pero más ligeros que la virtualización completa del sistema operativo.
Además, para Java, puede confiar en el sandbox integrado de la JVM, y para compilar C ++, NaCl pretende poder codificar el código x86.
Pero, como afirma la respuesta de Checkers, se ha demostrado que es posible causar daños maliciosos en casi cualquier "caja de arena" en el pasado, y esperaría que se encontraran más agujeros (y con suerte, se reparen) en el futuro. ¿ Realmente quieres estar ejecutando código no confiable?