Estoy tratando de crear un juego de programación en el que los programas suministrados por el usuario compitan en simulaciones de batalla, para ser utilizados como una herramienta para enseñar y practicar la programación. (Probablemente será una simulación de robot por turnos, pero para los propósitos de esta pregunta, podría haber sido ajedrez o juego de damas). Un componente importante de la implementación de este juego será proporcionar un mecanismo para ejecutar los juegos generados por los usuarios. código contra los datos del juego para determinar los movimientos de su bot.
Sé que el consejo típico es: "Siempre que sea posible, no ejecute código que no sea de confianza", y entiendo de dónde proviene. En mi caso actual, sin embargo, sería la funcionalidad principal de la aplicación que me gustaría crear, si es posible. Sé que tendré que tomar algunas precauciones para garantizar que el código proporcionado por el usuario no cause daños. La configuración ideal, por lo que puedo decir, haría cumplir eso:
- El código de usuario lee el estado del juego desde STDIN
- El código de usuario escribe el movimiento generado a STDOUT
- El código de usuario está aislado del sistema host
- El código de usuario está aislado unos de otros
- El código de usuario está limitado en los recursos que puede consumir (CPU, memoria, disco)
- El código de usuario no puede acceder a la red
Mi caso de uso no parece único. En todo caso, me imagino que cualquiera de los siguientes tipos de aplicaciones tienen requisitos similares:
- la mayoría de los juegos de programación
- juez de programación competitiva en línea
- "Prueba el lenguaje de programación X"
- competiciones de juegos de inteligencia artificial
Sin embargo, miré a mi alrededor en Google, pero no pude encontrar ninguna implementación de referencia que pareciera confiable. La mayoría de los tipos de aplicaciones anteriores son de código cerrado, y quizás por una buena razón.
Dados los requisitos, me imagino que necesitaría algún tipo de solución de aislamiento / virtualización / contenedorización, aunque honestamente no estoy seguro de cuál proporcionaría las garantías necesarias.
¿Cuáles son las mejores prácticas actuales en relación con el sandbox para el código proporcionado por el usuario? ¿Alguien tiene alguna información o referencias a fuentes confiables?