Red Hat Training

A Red Hat training course is available for RHEL 8

8.2. Creación y uso de una política SELinux para un contenedor personalizado

Para generar una política de seguridad SELinux para un contenedor personalizado, siga los pasos de este procedimiento.

Requisitos previos

  • La herramienta podman para la gestión de contenedores está instalada. Si no lo está, utilice el comando yum install podman.
  • Un contenedor Linux personalizado - ubi8 en este ejemplo.

Procedimiento

  1. Instale el paquete udica:

    # yum install -y udica

    Como alternativa, instale el módulo container-tools, que proporciona un conjunto de paquetes de software para contenedores, incluido udica:

    # yum module install -y container-tools
  2. Inicia el contenedor ubi8 que monta el directorio /home con permisos de sólo lectura y el directorio /var/spool con permisos de lectura y escritura. El contenedor expone el puerto 21.

    # podman run --env container=podman -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash

    Tenga en cuenta que ahora el contenedor se ejecuta con el tipo de SELinux container_t. Este tipo es un dominio genérico para todos los contenedores en la política de SELinux y podría ser demasiado estricto o demasiado flojo para su escenario.

  3. Introduzca el comando podman ps para obtener el ID del contenedor:

    # podman ps
    CONTAINER ID   IMAGE                                   COMMAND   CREATED          STATUS              PORTS   NAMES
    37a3635afb8f   registry.access.redhat.com/ubi8:latest  bash      15 minutes ago   Up 15 minutes ago           heuristic_lewin
  4. Cree un archivo JSON contenedor y utilice udica para crear un módulo de política basado en la información del archivo JSON:

    # podman inspect 37a3635afb8f > container.json
    # udica -j container.json my_container
    Policy my_container with container id 37a3635afb8f created!
    [...]

    Alternativamente:

    # podman inspect 37a3635afb8f | udica my_container
    Policy my_container with container id 37a3635afb8f created!
    
    Please load these modules using:
    # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
    
    Restart the container with: "--security-opt label=type:my_container.process" parameter
  5. Como sugiere la salida de udica en el paso anterior, cargue el módulo de política:

    # semodule -i my_container.cil /usr/share/udica/templates/{base_container.cil,net_container.cil,home_container.cil}
  6. Detenga el contenedor y vuelva a iniciarlo con la opción --security-opt label=type:my_container.process:

    # podman stop 37a3635afb8f
    # podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash

Pasos de verificación

  1. Compruebe que el contenedor funciona con el tipo my_container.process:

    # ps -efZ | grep my_container.process
    unconfined_u:system_r:container_runtime_t:s0-s0:c0.c1023 root 2275 434  1 13:49 pts/1 00:00:00 podman run --security-opt label=type:my_container.process -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash
    system_u:system_r:my_container.process:s0:c270,c963 root 2317 2305  0 13:49 pts/0 00:00:00 bash
  2. Compruebe que SELinux permite ahora el acceso a los puntos de montaje /home y /var/spool:

    [root@37a3635afb8f /]# cd /home
    [root@37a3635afb8f home]# ls
    username
    [root@37a3635afb8f ~]# cd /var/spool/
    [root@37a3635afb8f spool]# touch test
    [root@37a3635afb8f spool]#
  3. Compruebe que SELinux permite el enlace sólo con el puerto 21:

    [root@37a3635afb8f /]# yum install nmap-ncat
    [root@37a3635afb8f /]# nc -lvp 21
    Ncat: Version 7.60 ( https://nmap.org/ncat )
    Ncat: Generating a temporary 1024-bit RSA key. Use --ssl-key and --ssl-cert to use a permanent one.
    Ncat: SHA-1 fingerprint: 6EEC 102E 6666 5F96 CC4F E5FA A1BE 4A5E 6C76 B6DC
    Ncat: Listening on :::21
    Ncat: Listening on 0.0.0.0:21
    
    [root@37a3635afb8f /]# nc -lvp 80
    Ncat: Version 7.60 ( https://nmap.org/ncat )
    Ncat: Generating a temporary 1024-bit RSA key. Use --ssl-key and --ssl-cert to use a permanent one.
    Ncat: SHA-1 fingerprint: 6EEC 102E 6666 5F96 CC4F E5FA A1BE 4A5E 6C76 B6DC
    Ncat: bind to :::80: Permission denied. QUITTING.

Recursos adicionales

  • Para más información, consulte las páginas de manual udica(8) y podman(1).
  • Para obtener orientación sobre cómo empezar con los contenedores en RHEL y cómo trabajar con imágenes de contenedores, consulte el documento Construir, ejecutar y gestionar contenedores.