¿Qué técnicas se pueden usar para ejecutar de forma segura procesos no confiables en Linux?

Hay una amplia gama de formas de abordar este problema. Realmente, la pregunta es “¿Cómo puedo controlar las llamadas de CPU, memoria, archivo, IO de usuario, red y sistema de una aplicación determinada?

Algunos pensamientos, aunque no exhaustivos:

  • CPU: UNIX moderno tiene muchas formas de limitar el uso de CPU. viene a la mente el ajuste del programador ulimit y kernel.
  • Memoria: Linux tiene algunas llamadas al sistema para controlar el uso de la memoria de un proceso secundario, viene a la mente setrlimit (). Además, cualquier lenguaje que se me ocurra que admita un PaaS tiene la capacidad de configurar la memoria máxima asignada para un usuario / proceso / sesión.
  • Acceso a archivos: con SELinux, Linux moderno tiene mucho más control que los permisos estándar UNIX de lectura / escritura / ejecución en un archivo. En cuanto a los recursos, es bastante fácil limitar el tamaño máximo de carga / descarga, el espacio de disco máximo utilizado o las operaciones de E / S máximas por segundo.
  • Red: tienes todo tipo de trucos en la pila de red para controlar el uso. la pila TCP se puede ajustar, las etiquetas de calidad de servicio se pueden aplicar a tráfico específico, el tráfico se puede filtrar a través de un firewall (capa básica 3 o capa 6 como un WAF), y puede ejecutar el tráfico a través de un IDS o IPS con reglas para alerta o bloqueo cuando se ve actividad maliciosa.
  • Llamadas del sistema: nuevamente, SELinux y Linux Audit Daemon proporcionan una amplia variedad de controles sobre lo que está haciendo un proceso aquí. En el peor de los casos, la mayoría de estas plataformas se basan en proyectos de código abierto: una empresa motivada podría modificar la fuente para colocar controles adicionales sobre llamadas específicas del sistema o eliminar por completo la capacidad de una aplicación para llamarlas.

Lo que es más importante, puede recopilar estadísticas sobre todo lo anterior y controlar lo que está haciendo un proceso, y luego reducirlo o expulsarlo cuando se ve un mal comportamiento.

Entonces, como ve todo esto, la primera pregunta que puede hacer es “bueno, ¿por qué hay tantos sistemas comprometidos?” La gente es perezosa, muy rara vez los sistemas se fortalecen correctamente y la seguridad se gestiona correctamente con el tiempo. Creo que los proveedores de PaaS probablemente estén al tanto de esto, aunque en el pasado al menos AppEngine era bastante fácil para DOS.

Aviso, no mencioné la virtualización. La virtualización en sí misma no es realmente una solución de seguridad … la mayoría de los diseños de virtualización se realizan teniendo en cuenta la seguridad, y se pueden usar con las cosas que mencioné para proporcionar un contenedor seguro para ejecutar una aplicación. Si le doy una máquina virtual simple para ejecutar una aplicación de la que no está seguro, lo más probable es que todavía tenga que ejecutar la lista anterior.

Realmente, si diseña el entorno con el supuesto de que la aplicación intentará hacer cualquier cosa desagradable que pueda, el entorno puede diseñarse e implementarse para minimizar la mayoría del riesgo.

para ejecutar de forma segura procesos no confiables cerca de otros procesos confiables o no confiables que puede usar:

  • chroot
  • contenedores: vservers, openVZ

Estas soluciones no impiden que el código ejecute DOS, por ejemplo.