¿Es posible ejecutar un script bash en una especie de sandbox?

13

Nuestro producto tiene la necesidad de ejecutar un script bash desconocido en un servidor delicado para lograr un objetivo determinado. Este script bash es proporcionado por el usuario. Estamos interesados ​​en garantizar que solo se permitan comandos específicos, y que todos los demás no lo estén. Además, necesitamos reemplazar algunos comandos con otros.

Entonces, por ejemplo, nos gustaría ejecutar el script y permitir los siguientes comandos: echo cat awk

Pero no permita ningún otro comando (no queremos proporcionar una lista específica aquí).

Además, si el script contiene el comando cp, nos gustaría capturarlo y redirigirlo a un comando diferente (que se puede hacer con un alias).

¿Alguna idea de cómo se hace esto?

A lo lejos
fuente

Respuestas:

9

La forma más fácil es usar una cárcel chroot que contenga solo los comandos que desea que el script pueda ejecutar. Luego ejecuta el script a través de un contenedor que llama chrootal directorio y luego ejecuta el script.

Ignacio Vazquez-Abrams
fuente
17

No hay un 100% seguro de ejecutar el script dentro de una máquina virtual, lo que probablemente evitaría que el script logre su objetivo. Pero hay dos características que pueden ayudarlo. Si le preocupa que el guión haya sido escrito por una persona malintencionada, estas características no son suficientes; pero si solo le preocupa que el script pueda hacer cosas malas a su sistema porque fue escrito por un programador descuidado o con objetivos diferentes en mente, cualquiera de estas dos características proporciona un entorno de sandboxing decente.

  • Puede ejecutar un shell restringido invocando bash como bash -r. Le remito al manual de bash para una descripción detallada; La idea básica es que el script no puede invocar comandos que no están en $PATH, no pueden cambiar $PATH, no pueden redirigir hacia o desde un archivo, y algunas restricciones más. Esto es bastante sencillo de configurar, pero si el script desconocido es demasiado complicado para que lo revise, es probable que use muchas cosas que están prohibidas en un shell restringido.

  • Puede configurar una cárcel chroot . La idea es configurar un árbol de directorios /some/rooty ejecutar el script en un entorno que crea que /some/rootes todo el sistema de archivos ( chrootes la abreviatura de cambio de raíz). Una vez que el árbol de directorios está configurado, ejecute el script (copiado en /some/root/myscript) como chroot /some/root /bin/bash /myscript. Por ejemplo, configuraría un directorio /some/root/bincon los comandos que desea permitir y el programa chrooteado vería este directorio como /bin. Deberá copiar todo lo necesario para la ejecución del programa dentro del chroot: bibliotecas, archivos de datos bash, el script en sí, etc. Es posible que el script necesite estar /procmontado dentro del chroot; puedes hacer esto con un comando como mount -t proc proc /proc.

    Si necesita tener un árbol de directorios completo disponible para el script, por ejemplo /var/example, tiene varias opciones. Podrías hacer una copia debajo /some/root. Puede crear enlaces duros (si funcionan para su aplicación y el chroot está en el mismo sistema de archivos). En Linux, puede hacer mount --bind /var/example /some/root/var/exampleun "injerto" /var/exampledentro del chroot. Tenga en cuenta que un enlace simbólico no puede funcionar ya que el objetivo del enlace se determina dentro del chroot.

    Tenga en cuenta que chroot no proporciona seguridad absoluta, particularmente contra procesos que se ejecutan como root. Por ejemplo, un proceso raíz podría crear un archivo de dispositivo dentro del chroot y acceder a todo el disco a través de él. Un proceso chrooteado aún puede hacer conexiones de red (puede prohibir esto al no incluir ningún programa de red dentro del chroot y asegurarse de que el programa no confiable no pueda crear un archivo y hacerlo ejecutable o sobrescribir un ejecutable existente).

Gilles 'SO- deja de ser malvado'
fuente
Deberá copiar todo lo necesario , ¿puedo hacer enlaces simbólicos o duros en lugar de copiar?
kyb
1
@kyb Enlace duro: sí. Enlace simbólico: no, un enlace simbólico solo puede apuntar a un archivo que puede ver, no le permite escapar de un chroot. Los enlaces duros son difíciles de usar para esto y son complicados: se rompen si reemplaza el archivo, exponen la copia original en caso de que se pueda escribir dentro del chroot. Si desea hacer que un árbol completo esté disponible, cópielo o realice un montaje de enlace de solo lectura.
Gilles 'SO- deja de ser malvado'
Necesito hacer comandos comunes disponibles, como grep, awk, units, etc ¿Es necesario copiar todos los archivos bin y todas las dependencias manualmente o hay algún artilugio útil para decirle explícitamente lo utils debería funcionar en chroot?
kyb