Permitir cierto comportamiento arriesgado de un solo programa de forma segura en SELinux


8

Tengo un programa ejecutándose dentro de un contenedor Docker que carga un archivo .so que altera el comportamiento del programa a través del enganche y la manipulación de la memoria. SELinux bloquea este comportamiento con el siguiente mensaje en el registro de auditoría:

type = AVC msg = audit (1548166862.066: 2419): avc: deny {execheap} for pid = 11171 comm = "myProgram" scontext = system_u: system_r: container_t: s0: c426, c629 tcontext = system_u: system_r: container_t: s0: c426, c629 tclass = proceso permisivo = 0

Dudo mucho en ejecutar esto, audit2allowya que no quiero permitir este comportamiento específico en ningún otro lugar (ya que sería bastante arriesgado).

  • ¿Cómo puedo decirle a SELinux que permita este comportamiento específico de la manera más segura posible?
  • ¿Puedo hacer esto de una manera que me permita generar más contenedores Docker que ejecuten el mismo programa en el futuro?

Respuestas:


4

audit2allowprobablemente genera una regla para permitir execheapa container_tproceso tipo. Siempre puede generar primero el módulo e inspeccionarlo, antes de cargarlo.

Un posible problema es que ahora cualquier proceso con container_ttipo ahora tiene permitida la misma operación. Para evitar esto, posiblemente necesite crear su propio tipo personalizado (utilizando container_tcomo plantilla) y solo permitir execheapeste tipo especial.

Esta publicación de blog de Dan Walsh explica cómo escribir dicha política personalizada. También puede combinar esto con audit2allowpara generar las reglas reales. Los pasos esenciales son:

  1. Cree una política de contenedor básica, por ejemplo container_execheap:

    policy_module(container_execheap, 1.0)
    
    virt_sandbox_domain_template(container_execheap_t)
    

    virt_sandbox_domain_templateLa macro crea el nuevo tipo container_execheap_ty crea las reglas necesarias para la operación de acoplamiento que el nuevo tipo se puede utilizar como dominio contenedor.

  2. Compile y cargue el módulo de política (el selinux-policy-develpaquete debe proporcionar los archivos de desarrollo necesarios, incluido el archivo MAKE ):

    make -f /usr/selinux/devel/Makefile container_execheap.pp
    semodule -i container_execheap.pp
    

    El nuevo tipo se puede configurar para ser un dominio permisivo:

    semanage permissive -a container_execheap_t
    

    Para dominios permisivos, las denegaciones AVC se registran pero no se aplican las reglas . De esta manera, es fácil generar las reglas que faltan más tarde usando audit2allow.

  3. Ejecute su contenedor en este nuevo contexto, algo así como docker run ... --security-opt label:type:container_execheap_t ...

  4. Generar errores esperados. Luego, ejecute audit2allowpara generar reglas que permitan esas operaciones container_execheap_t. Puede actualizar el mismo .tearchivo de módulo (recuerde aumentar el número de versión) con las nuevas reglas. Compile e instale el módulo actualizado.

  5. Cuando no se generen más errores, vuelva a poner el tipo de contenedor personalizado en modo obligatorio semanage -d container_execheap.


Su respuesta parece ser el camino a seguir, desafortunadamente aunque yo no tengo experiencia en la creación de políticas de SELinux. Esto es lo que se me ocurrió al mirar a través de la publicación del blog que vinculó y otra documentación. Tengo la sensación de que no lo estoy haciendo bien ... ¿podrías ayudarme señalándome en la dirección correcta? ¿Mi política tiene algún sentido?
Thomas

¡Gracias, ahora tengo algo que parece funcionar! Esto es con lo que terminé. Sin embargo, recibí un montón de errores con respecto a los duplicados durante el tiempo de compilación, ¿supongo que es un problema en las políticas incluidas en lugar de las mías? Tampoco estoy muy seguro de por qué la cadena dentro de la declaración gen_require debe terminarse con un 'en lugar de un' (este último arrojó un error). De todos modos, gracias de nuevo por la ayuda!
Thomas

Creo que es seguro ignorar esos errores específicos, ver bugzilla . Citar usando '' es cómo funciona en el lenguaje M4 , que se utiliza para escribir módulos de políticas de referencia. Puede verificar (usando, ps axZetc.) que su contenedor se ejecuta en el contexto correcto si desea verificar dos veces después de instalar y configurar su política personalizada.
sebasth el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.