Red Hat Training

A Red Hat training course is available for RHEL 8

11.5. Arquitectura de medición de la integridad y módulo de verificación ampliado

La arquitectura de medición de integridad (IMA) y el módulo de verificación extendido (EVM) pertenecen al subsistema de integridad del kernel y mejoran la seguridad del sistema de varias maneras. La siguiente sección describe cómo activar y configurar IMA y EVM para mejorar la seguridad del sistema operativo.

Requisitos previos

  • Compruebe que el sistema de archivos securityfs está montado en el directorio /sys/kernel/security/ y que el directorio /sys/kernel/security/integrity/ima/ existe.

    # mount
    …​
    securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
    …​
  • Compruebe que el gestor de servicios systemd ya está parcheado para soportar IMA y EVM en el momento del arranque:

    # dmesg | grep -i -e EVM -e IMA
    [    0.000000] Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet
    [    0.000000] kvm-clock: cpu 0, msr 23601001, primary cpu clock
    [    0.000000] Using crashkernel=auto, the size chosen is a best effort estimation.
    [    0.000000] Kernel command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet
    [    0.911527] ima: No TPM chip found, activating TPM-bypass!
    [    0.911538] ima: Allocated hash algorithm: sha1
    [    0.911580] evm: Initialising EVM extended attributes:
    [    0.911581] evm: security.selinux
    [    0.911581] evm: security.ima
    [    0.911582] evm: security.capability
    [    0.911582] evm: HMAC attrs: 0x1
    [    1.715151] systemd[1]: systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy)
    [    3.824198] fbcon: qxldrmfb (fb0) is primary device
    [    4.673457] PM: Image not found (code -22)
    [    6.549966] systemd[1]: systemd 239 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy)

Procedimiento

  1. Añade los siguientes parámetros de la línea de comandos del kernel:

    # grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="ima_policy=appraise_tcb ima_appraise=fix evm=fix"

    El comando habilita IMA y EVM en el modo fix para la entrada de arranque actual y permite a los usuarios recopilar y actualizar las mediciones de IMA.

    El parámetro de la línea de comandos del kernel ima_policy=appraise_tcb garantiza que el kernel utilice la política de medición predeterminada de Trusted Computing Base (TCB) y el paso de evaluación. La parte de evaluación prohíbe el acceso a los archivos cuyas medidas anteriores y actuales no coinciden.

  2. Reinicie para que los cambios surtan efecto.
  3. Opcionalmente, verifique que los parámetros han sido añadidos a la línea de comandos del kernel:

    # cat /proc/cmdline
    BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-167.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet ima_policy=appraise_tcb ima_appraise=fix evm=fix
  4. Crear una clave maestra del núcleo para proteger la clave EVM:

    # keyctl add user kmk dd if=/dev/urandom bs=1 count=32 2> /dev/null @u
    748544121

    La clave maestra del kernel (kmk) se mantiene enteramente en la memoria del espacio del kernel. El valor de 32 bytes de longitud de la clave maestra del núcleo kmk se genera a partir de bytes aleatorios del archivo /dev/urandom y se coloca en el llavero del usuario (@u). El número de serie de la llave está en la segunda línea de la salida anterior.

  5. Crear una clave EVM encriptada basada en la clave kmk:

    # keyctl add encrypted evm-key "new user:kmk 64" @u
    641780271

    El comando utiliza kmk para generar y cifrar una clave de usuario de 64 bytes de longitud (llamada evm-key) y la coloca en el llavero del usuario (@u). El número de serie de la clave está en la segunda línea de la salida anterior.

    Importante

    Es necesario nombrar la clave de usuario como evm-key porque ese es el nombre que espera el subsistema EVM y con el que trabaja.

  6. Crear un directorio para las claves exportadas:

    # mkdir -p /etc/keys/
  7. Busque la clave kmk y exporte su valor a un archivo:

    # keyctl pipe keyctl search @u user kmk > /etc/keys/kmk *

    El comando coloca el valor no encriptado de la llave maestra del kernel (kmk) en un archivo de ubicación previamente definida (/etc/keys/).

  8. Busque la clave de usuario evm-key y exporte su valor a un archivo:

    # keyctl pipe keyctl search @u encrypted evm-key > /etc/keys/evm-key

    El comando coloca el valor encriptado de la clave del usuario evm-key en un archivo de ubicación arbitraria. El evm-key ha sido encriptado por la llave maestra del kernel anteriormente.

  9. Opcionalmente, puede ver las llaves recién creadas:

    # keyctl show
    Session Keyring
    974575405   --alswrv     0        0      keyring: ses 299489774 --alswrv 0 65534 \ keyring: uid.0 748544121 --alswrv 0 0 \ user: kmk
    641780271   --alswrv     0        0           \_ encrypted: evm-key

    Debería poder ver una salida similar.

  10. Activar el EVM:

    # echo 1 > /sys/kernel/security/evm
  11. Opcionalmente, verifique que el EVM ha sido inicializado:

    # dmesg | tail -1
    […​] evm: key initialized

Recursos adicionales