Red Hat Training

A Red Hat training course is available for RHEL 8

3.12. Firma de módulos del kernel para el arranque seguro

Puede mejorar la seguridad de su sistema utilizando módulos del kernel firmados. Las siguientes secciones describen cómo autofirmar los módulos del kernel construidos de forma privada para su uso con RHEL 8 en sistemas de construcción basados en UEFI en los que está habilitado el arranque seguro. Estas secciones también proporcionan una visión general de las opciones disponibles para importar su clave pública en un sistema de destino en el que desee desplegar sus módulos del kernel.

Para firmar y cargar los módulos del kernel, es necesario:

Si el Arranque Seguro está habilitado, los cargadores de arranque del sistema operativo UEFI, el kernel de Red Hat Enterprise Linux y todos los módulos del kernel tienen que ser firmados con una clave privada y autenticados con la clave pública correspondiente. Si no están firmados y autenticados, el sistema no podrá terminar el proceso de arranque.

La distribución RHEL 8 incluye:

  • Cargadores de arranque firmados
  • Granos firmados
  • Módulos del kernel firmados

Además, el cargador de arranque de primera etapa firmado y el kernel firmado incluyen claves públicas de Red Hat incrustadas. Estos binarios ejecutables firmados y las claves incrustadas permiten que RHEL 8 se instale, arranque y ejecute con las claves de la Autoridad de Certificación de Arranque Seguro de Microsoft UEFI que son proporcionadas por el firmware UEFI en los sistemas que soportan el Arranque Seguro UEFI. Tenga en cuenta que no todos los sistemas basados en UEFI incluyen soporte para Secure Boot.

Requisitos previos

Para poder firmar módulos del kernel construidos externamente, instale en el sistema de compilación las utilidades que se indican en la siguiente tabla.

Tabla 3.1. Servicios públicos necesarios

UtilidadProporcionado por el paqueteUtilizado enPropósito

openssl

openssl

Sistema de construcción

Genera un par de claves X.509 públicas y privadas

sign-file

kernel-devel

Sistema de construcción

Archivo ejecutable utilizado para firmar un módulo del kernel con la clave privada

mokutil

mokutil

Sistema objetivo

Utilidad opcional utilizada para inscribir manualmente la clave pública

keyctl

keyutils

Sistema objetivo

Utilidad opcional utilizada para mostrar las claves públicas en el llavero del sistema

Nota

El sistema de compilación, donde se construye y firma el módulo del kernel, no necesita tener habilitado el arranque seguro de UEFI y ni siquiera necesita ser un sistema basado en UEFI.

3.12.1. Autenticación de módulos del núcleo con claves X.509

En RHEL 8, cuando se carga un módulo del núcleo, éste comprueba la firma del módulo con las claves públicas X.509 del llavero del sistema del núcleo (.builtin_trusted_keys) y del llavero de la plataforma del núcleo (.platform). El llavero .platform contiene claves de proveedores de plataforma de terceros y claves públicas personalizadas. Las claves del llavero del sistema del kernel .blacklist están excluidas de la verificación. Las siguientes secciones ofrecen una visión general de las fuentes de claves, los llaveros y ejemplos de claves cargadas de diferentes fuentes en el sistema. Además, puedes ver cómo autenticar un módulo del kernel.

3.12.1.1. Requisitos de autentificación

Es necesario cumplir ciertas condiciones para cargar módulos del kernel en sistemas con la funcionalidad UEFI Secure Boot activada.

Si el arranque seguro de UEFI está activado o si se ha especificado el parámetro de kernel module.sig_enforce:

  • Sólo puede cargar aquellos módulos del kernel firmados cuyas firmas fueron autenticadas contra claves del llavero del sistema (.builtin_trusted_keys) y del llavero de la plataforma (.platform).
  • La clave pública no debe estar en el llavero de claves revocadas del sistema (.blacklist).

Si el arranque seguro de UEFI está desactivado y no se ha especificado el parámetro de kernel module.sig_enforce:

  • Puedes cargar módulos del núcleo sin firmar y módulos del núcleo firmados sin clave pública.

Si el sistema no está basado en UEFI o si el arranque seguro de UEFI está desactivado:

  • En .builtin_trusted_keys y .platform sólo se cargan las claves incrustadas en el núcleo.
  • No se puede aumentar ese conjunto de claves sin reconstruir el núcleo.

Tabla 3.2. Requisitos de autentificación del módulo del kernel para la carga

Módulo firmadoClave pública encontrada y firma válidaEstado de arranque seguro UEFIsig_enforceCarga del móduloNúcleo contaminado

Sin firma

-

No habilitado

No habilitado

Tiene éxito

No habilitado

Activado

Falla

-

Activado

-

Falla

-

Firmado

No

No habilitado

No habilitado

Tiene éxito

No habilitado

Activado

Falla

-

Activado

-

Falla

-

Firmado

No habilitado

No habilitado

Tiene éxito

No

No habilitado

Activado

Tiene éxito

No

Activado

-

Tiene éxito

No

3.12.1.2. Fuentes de claves públicas

Durante el arranque, el kernel carga claves X.509 de un conjunto de almacenes de claves persistentes en los siguientes llaveros:

  • El llavero del sistema (.builtin_trusted_keys)
  • El llavero .platform
  • El sistema .blacklist llavero

Tabla 3.3. Fuentes de los llaveros del sistema

Fuente de claves X.509El usuario puede añadir llavesEstado de arranque seguro UEFITeclas cargadas durante el arranque

Integrado en el núcleo

No

-

.builtin_trusted_keys

UEFI Secure Boot "db"

Limitado

No habilitado

No

Activado

.platform

Integrado en el cargador de arranque shim.efi

No

No habilitado

No

Activado

.builtin_trusted_keys

Lista de claves del propietario de la máquina (MOK)

No habilitado

No

Activado

.platform

.builtin_trusted_keys:

  • un llavero que se construye en el arranque
  • contiene claves públicas de confianza
  • los privilegios de root son necesarios para ver las claves

.platform:

  • un llavero que se construye en el arranque
  • contiene claves de proveedores de plataformas de terceros y claves públicas personalizadas
  • los privilegios de root son necesarios para ver las claves

.blacklist

  • un llavero con claves X.509 que han sido revocadas
  • un módulo firmado por una clave de .blacklist fallará la autenticación incluso si su clave pública está en .builtin_trusted_keys

UEFI Secure Boot db:

  • una base de datos de firmas
  • almacena las claves (hashes) de las aplicaciones UEFI, los controladores UEFI y los cargadores de arranque
  • las llaves se pueden cargar en la máquina

UEFI Secure Boot dbx:

  • una base de datos de firmas revocadas
  • impide que se carguen las llaves
  • las claves revocadas de esta base de datos se añaden al llavero .blacklist

3.12.1.3. Generar un par de claves públicas y privadas

Necesita generar un par de claves X.509 públicas y privadas para tener éxito en sus esfuerzos de utilizar módulos del kernel en un sistema habilitado para el Arranque Seguro. Más tarde utilizará la clave privada para firmar el módulo del kernel. También tendrá que añadir la clave pública correspondiente a la Clave del Propietario de la Máquina (MOK) para el Arranque Seguro para validar el módulo firmado.

Algunos de los parámetros para esta generación de pares de claves se especifican mejor con un archivo de configuración.

Procedimiento

  1. Crear un archivo de configuración con parámetros para la generación de pares de claves:

    # cat << EOF > configuration_file.config
    [ req ]
    default_bits = 4096
    distinguished_name = req_distinguished_name
    prompt = no
    string_mask = utf8only
    x509_extensions = myexts
    
    [ req_distinguished_name ]
    O = Organization
    CN = Organization signing key
    emailAddress = E-mail address
    
    [ myexts ]
    basicConstraints=critical,CA:FALSE
    keyUsage=digitalSignature
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid
    EOF
  2. Cree un par de claves públicas y privadas X.509 como se muestra en el siguiente ejemplo:

    # openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 \
    -batch -config configuration_file.config -outform DER \
    -out my_signing_key_pub.der \
    -keyout my_signing_key.priv

    La clave pública se escribirá en el archivo my_signing_key_pub.der y la clave privada se escribirá en el archivo my_signing_key.priv archivo.

    Importante

    En RHEL 8, las fechas de validez del par de claves son importantes. La clave no caduca, pero el módulo del núcleo debe ser firmado dentro del período de validez de su clave de firma. Por ejemplo, una clave que sólo es válida en 2019 puede utilizarse para autenticar un módulo del núcleo firmado en 2019 con esa clave. Sin embargo, los usuarios no pueden utilizar esa clave para firmar un módulo del núcleo en 2020.

  3. Opcionalmente, puede revisar las fechas de validez de sus claves públicas como en el ejemplo siguiente:

    # openssl x509 -inform der -text -noout -in <my_signing_key_pub.der>
    
    Validity
                Not Before: Feb 14 16:34:37 2019 GMT
                Not After : Feb 11 16:34:37 2029 GMT
  4. Registre su clave pública en todos los sistemas en los que desee autenticarse y cargue su módulo del kernel.
Aviso

Aplique fuertes medidas de seguridad y políticas de acceso para proteger el contenido de su clave privada. En las manos equivocadas, la clave podría utilizarse para comprometer cualquier sistema que esté autenticado por la clave pública correspondiente.

Recursos adicionales