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.
| Utilidad | Proporcionado por el paquete | Utilizado en | Propósito |
|---|---|---|---|
|
|
| Sistema de construcción | Genera un par de claves X.509 públicas y privadas |
|
|
| Sistema de construcción | Archivo ejecutable utilizado para firmar un módulo del kernel con la clave privada |
|
|
| Sistema objetivo | Utilidad opcional utilizada para inscribir manualmente la clave pública |
|
|
| Sistema objetivo | Utilidad opcional utilizada para mostrar las claves públicas en el llavero del sistema |
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 Copiar enlaceEnlace copiado en el portapapeles!
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 Copiar enlaceEnlace copiado en el portapapeles!
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_keysy.platformsólo se cargan las claves incrustadas en el núcleo. - No se puede aumentar ese conjunto de claves sin reconstruir el núcleo.
| Módulo firmado | Clave pública encontrada y firma válida | Estado de arranque seguro UEFI | sig_enforce | Carga del módulo | Núcleo contaminado |
|---|---|---|---|---|---|
| Sin firma | - | No habilitado | No habilitado | Tiene éxito | Sí |
| No habilitado | Activado | Falla | - | ||
| Activado | - | Falla | - | ||
| Firmado | No | No habilitado | No habilitado | Tiene éxito | Sí |
| No habilitado | Activado | Falla | - | ||
| Activado | - | Falla | - | ||
| Firmado | Sí | 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 Copiar enlaceEnlace copiado en el portapapeles!
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
.blacklistllavero
| Fuente de claves X.509 | El usuario puede añadir llaves | Estado de arranque seguro UEFI | Teclas cargadas durante el arranque |
|---|---|---|---|
| Integrado en el núcleo | No | - |
|
| UEFI Secure Boot "db" | Limitado | No habilitado | No |
| Activado |
| ||
|
Integrado en el cargador de arranque | No | No habilitado | No |
| Activado |
| ||
| Lista de claves del propietario de la máquina (MOK) | Sí | No habilitado | No |
| Activado |
|
.builtin_trusted_keys:
- un llavero que se construye en el arranque
- contiene claves públicas de confianza
-
los privilegios de
rootson 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
rootson necesarios para ver las claves
.blacklist
- un llavero con claves X.509 que han sido revocadas
-
un módulo firmado por una clave de
.blacklistfallará 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 Copiar enlaceEnlace copiado en el portapapeles!
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
Crear un archivo de configuración con parámetros para la generación de pares de claves:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 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
# 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.privCopy to Clipboard Copied! Toggle word wrap Toggle overflow La clave pública se escribirá en el archivo
my_signing_key_pub.dery la clave privada se escribirá en el archivomy_signing_key.privarchivo.ImportanteEn 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.
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>
# 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 GMTCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Registre su clave pública en todos los sistemas en los que desee autenticarse y cargue su módulo del kernel.
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
-
Para más información sobre la utilidad
openssl, consulte la página del manualopenssl(1). -
Para más información sobre el uso de
openssl, consulte el RHEL Security Guide - Para más detalles sobre la inscripción de claves públicas en los sistemas de destino, consulte Sección 3.12.3.2, “Añadir manualmente la clave pública a la lista MOK”.