Perfiles de AppArmor en Docker / LXC

11

Tengo un contenedor Docker (LXC) que ejecuta MySQL. Dado que la idea detrás de Docker es generalmente "un proceso en ejecución por contenedor", si defino los perfiles de AppArmor dirigidos al binario MySQL, ¿se aplicarán? ¿Hay alguna forma de probar esto?

Naftuli Kay
fuente
¿Por qué quieres usar apparmor dentro del contenedor?
c4f4t0r
3
En caso de que se ejecute un exploit de día cero u otro en la base de datos para evitar que acceda a cualquier otra cosa . Confío en Linux cgroups, pero no tanto . Es mejor prevenir que curar, prefiero tener MySQL bloqueado que tener un día cero de MySQL para encontrar la manera de salir de un cgroup.
Naftuli Kay

Respuestas:

8

Primero, los cgroups no se usan para aislar una aplicación de otras en un sistema. Se utilizan para administrar el uso de recursos y el acceso a dispositivos. Son los diversos espacios de nombres (PID, UTS, montaje, usuario ...) los que proporcionan cierto aislamiento (limitado).

Además, un proceso lanzado dentro de un contenedor Docker probablemente no podrá administrar el perfil de AppArmor con el que se está ejecutando. El enfoque actualmente adoptado es configurar un perfil específico de AppArmor antes de iniciar el contenedor.

Parece que el controlador de ejecución libcontainer en Docker admite la configuración de perfiles de AppArmor para contenedores , pero no puedo encontrar ningún ejemplo o referencia en el documento.

Aparentemente, AppArmor también es compatible con LXC en Ubuntu .

Debe escribir un perfil de AppArmor para su aplicación y asegurarse de que LXC / libcontainer / Docker / ... lo cargue antes de iniciar los procesos dentro del contenedor.

Los perfiles utilizados de esta manera deben aplicarse, y para probarlo debe probar un acceso ilegal y asegurarse de que falla.

No hay ningún vínculo entre el binario y el perfil realmente aplicado en este caso. Debe decirle explícitamente a Docker / LXC que use este perfil para su contenedor. Escribir un perfil para el binario MySQL solo lo impondrá en el host, no en el contenedor.

Siosmo
fuente
Esta ha sido mi experiencia (limitada) hasta ahora. He tenido problemas para generar un perfil desde un contenedor Docker, pero si un perfil se generara fuera del contenedor y luego se copiara, debería funcionar ™, siempre que inicie AppArmor en el contenedor antes de ejecutar el ejecutable.
Naftuli Kay
@Siosm: LCX! = Libcontainer. La pregunta era sobre el controlador LXC.
0xC0000022L
@ 0xC0000022L: El modelo de aplicación de perfil de AppArmor es el mismo para cualquier herramienta utilizada para confinar procesos en contenedores.
Siosm
3

La respuesta es muy probable: no.

El tema de la guía de Ubuntu Server LXC discute más o menos tu pregunta exacta y hace la siguiente declaración:

Los programas en un contenedor no pueden limitarse más, por ejemplo, MySQL se ejecuta bajo el perfil del contenedor (protegiendo el host) pero no podrá ingresar al perfil de MySQL (para proteger el contenedor).

Una mejor opción para exploits evitar tener efectos no deseados es la de limitar el usuario que ejecuta los contenedores de espacio de usuario LXC de contenedores y el uso que aprovechan la característica del kernel. Sin embargo, dockeractualmente, que yo sepa, no es compatible userns.

En tal caso, MySQL podría, desde la perspectiva de los hosts, ejecutarse como usuario sin privilegios, mientras que dentro del contenedor podría ejecutarse como root. Luego puede usar iptablespara vincular MySQL a un puerto externo del host, si es necesario.

0xC0000022L
fuente