Crear imágenes blindadas personalizadas

En este tema se describe cómo preparar el disco, generar certificados de seguridad y habilitar las funciones necesarias del sistema operativo para crear una imagen protegida personalizada.

De forma predeterminada, Máquina virtual protegida admite Container-Optimized OS, varias distribuciones de Linux y varias versiones de Windows Server. Sin embargo, si necesitas imágenes personalizadas para tu aplicación, puedes seguir aprovechando las ventajas de las máquinas virtuales protegidas.

Preparar el disco

Las VMs blindadas se basan en el firmware compatible con la interfaz de firmware extensible unificada (UEFI) para admitir funciones como el arranque seguro. VM blindada requiere un esquema de tabla de particiones GUID (GPT); no se admite el registro de arranque maestro (MBR).

El disco debe tener al menos dos particiones:

  • Partición del sistema EFI (ESP): 100 megabytes (MB) es suficiente para esta partición, y es solo una sugerencia. Puedes crear una partición más grande si es necesario. El único requisito de la ESP es que debe estar formateada con un sistema de archivos de tabla de asignación de archivos (FAT).
  • Partición del SO: el resto del disco. Esta partición contiene el SO de arranque (Linux o Windows). No hay ninguna restricción en el tamaño de esta partición.

Puede crear más particiones de datos según sea necesario.

Copia del SO en la partición del SO

Una vez que el disco se haya formateado y particionado correctamente, copia los archivos del SO en la partición del SO. El SO tiene un gestor de arranque que debe estar ubicado en una ruta válida en la partición del sistema EFI, tal como se especifica en la especificación UEFI: \EFI\Boot\bootx64.efi. Ten en cuenta que puede que sea necesario copiar el gestor de arranque del SO en la ubicación indicada.

En Windows, hay un comando llamado bcdboot que se puede usar para copiar el gestor de arranque del SO en la ubicación correcta, además de otras acciones que requiere Windows (como copiar el almacén BCD). Para obtener más información, consulta las opciones de línea de comandos de BCDBoot en el Centro de Desarrollo de Hardware de Microsoft.

Si usas imágenes de VM blindada, también puedes aprovechar dos funciones de seguridad adicionales: el módulo de plataforma segura virtual (vTPM) y la supervisión de integridad. En las siguientes secciones se describen las ventajas de estas funciones y los requisitos del SO.

Módulo de plataforma segura virtual

Un módulo de plataforma segura es un dispositivo especializado que protege los objetos con los que autenticas el acceso a tu sistema, como claves y certificados. En las imágenes de máquinas virtuales protegidas, se usan versiones virtualizadas de dispositivos TPM para habilitar el arranque medido. En resumen, el arranque medido asegura la integridad de la ruta de carga crítica de los controladores de arranque y del kernel. El vTPM y el arranque medido se explican con más detalle en la documentación de las máquinas virtuales blindadas.

Para aprovechar las ventajas del vTPM y del arranque medido, se necesita un controlador. Las versiones mínimas del SO que admiten TPM 2.0 son las siguientes:

  • Windows Server 2012
  • Versión 3.20 de Linux
  • Red Hat Enterprise Linux 7.3

Monitorización de integridad

La supervisión de integridad te permite consultar el estado de tus instancias de máquina virtual y hacer los cambios que consideres oportunos. Monitoring usa los datos generados por Measured Boot para generar informes sobre la instancia de VM. En la documentación de VM blindadas se incluye más información sobre la monitorización de la integridad y la automatización de respuestas a fallos de validación de integridad.

Para admitir la función de monitorización de integridad de las VMs blindadas, la imagen debe generar señales de integridad:

  • Windows genera señales de integridad de forma predeterminada.
  • Linux debe tener instalado y habilitado el módulo de arquitectura de medición de integridad (IMA). El módulo debe tener el valor CONFIG_IMA_MEASURE_PCR_IDX definido en 10. Este es el valor predeterminado del módulo IMA.

Importar la imagen de disco a Compute Engine

Una vez que la imagen esté preparada, tendrás que subirla a Compute Engine. Para ver los pasos necesarios para subir la imagen aGoogle Cloud, consulta Importar imágenes de disco de arranque a Compute Engine.

Configurar certificados para el arranque seguro

Cuando se añade una imagen de VM blindada, se transfieren a Compute Engine un conjunto de certificados públicos y bases de datos de arranque seguro. Estos archivos se almacenan en las variables de UEFI correspondientes y se usan para establecer relaciones de confianza entre la plataforma, el firmware y el SO. Los certificados son certificados X.509 codificados con reglas de codificación distinguidas (DER). Las bases de datos pueden ser un certificado o un archivo binario sin formato. Hay cuatro valores en total:

  • Clave de plataforma (pk): clave que se usa para establecer la relación de confianza entre el propietario de la plataforma y el firmware. Solo puedes especificar una clave de plataforma, que debe ser un certificado X.509 válido.
  • Clave de intercambio de claves (kek): clave que se usa para establecer una relación de confianza entre el firmware y el SO. Puedes especificar varias claves para este valor.
  • Base de datos de claves prohibidas (dbx): base de datos de certificados que se han revocado y que provocará que el sistema deje de iniciarse si un archivo de inicio se firma con uno de ellos. Puede especificar uno o varios valores para este valor.
  • Base de datos de claves (db): base de datos de certificados de confianza que se pueden usar para firmar archivos de arranque. Puede especificar uno o varios valores para este valor.

La especificación UEFI contiene más información sobre estos valores y cómo funcionan.

En el siguiente ejemplo, se usa OpenSSL para crear las claves y los certificados de arranque seguro.

  • Generar un par de claves RSA de 2048 bits

    openssl genrsa -out secure-boot-key.rsa 2048
    
  • Generar un certificado X.509 autofirmado a partir de la clave en formato DER

    openssl req -new -x509 -sha256 \
        -subj '/CN=secure-boot' \
        -key secure-boot-key.rsa \
        -outform DER \
        -out secure-boot-cert.pem
    

Añadir la imagen protegida a Google Cloud

Con la imagen y los certificados subidos, ahora puedes añadir la imagen a Compute Engine. La imagen se puede añadir mediante la CLI de Google Cloud o la API de Compute Engine.

gcloud

Añade la imagen personalizada a Compute Engine:

gcloud compute images create [IMAGE_NAME] \
    --source-disk [SOURCE_DISK] \
    --source-disk-zone [ZONE] \
    --platform-key-file= \
    --key-exchange-key-file= \
    --signature-database-file=, \
    --forbidden-database-file= \
    --guest-os-features="UEFI_COMPATIBLE[,WINDOWS]"

donde:

  • [IMAGE_NAME] es el nombre de la nueva imagen.
  • [SOURCE_DISK] es el disco a partir del que quieres crear la nueva imagen.
  • [ZONE] es la zona en la que se encuentra el disco.

La opción WINDOWS de guest-os-features solo es obligatoria cuando se usa una imagen de Windows. Para obtener más información sobre cómo crear una imagen, consulta la referencia de gcloud create.

REST

Sigue las instrucciones para crear una imagen a partir de un disco persistente, pero especifica el initial_state_config en el cuerpo de la solicitud.

...
"sourceDisk": "/zones/[ZONE]/disks/[SOURCE_DISK]",

"initial_state_config": {
    "pk": {
        "content": [KEY],
        "fileType": [BIN,X509]
    },
    "keks": [
        {
            "content": [KEY],
            "fileType": [BIN,X509]
        },
        ...
    ],
    "dbxs": [
        {
            "content": [KEY],
            "fileType": [BIN,X509]
        },
        ...
    ],
    "dbs": [
        {
            "content": [KEY],
            "fileType": [BIN,X509]
        },
        ...
    ]
}

Certificados predeterminados

Ten en cuenta que pk, keks, dbxs y dbs son campos opcionales. Si proporcionas una configuración de estado inicial, es posible que algunos o todos estos campos no se definan. Cuando se crea una instancia a partir de la imagen, Google Cloud proporciona un valor predeterminado para PK, KEK, db y dbx, a menos que se haya definido un valor personalizado en algún campo sin definir. Si no proporcionas ninguna configuración de estado inicial (es decir, si falta la configuración, no solo si está vacía), la imagen tendrá la configuración de estado inicial de la imagen de origen.

Los valores predeterminados de estos campos son los siguientes:

  • PK: el certificado asociado a la clave privada predeterminada creada por Google.
  • KEK: el certificado KEK de Microsoft predeterminado. Descargar de Microsoft: MicCorKEKCA2011_2011-06-24.crt
  • dbx: la lista de revocación de DBX de Microsoft predeterminada. Descargar desde el foro de interfaz de firmware extensible unificada: archivo de lista de revocación de UEFI
  • db: los dos certificados siguientes:
    • Microsoft Windows Production PCA 2011 con un hash de certificado SHA-1 de 58 0a 6f 4c c4 e4 b6 69 b9 eb dc 1b 2b 3e 08 7b 80 d0 67 8d. Descargar de Microsoft: MicWinProPCA2011_2011-10-19.crt
    • Microsoft Corporation UEFI CA 2011 con un hash de certificado SHA-1 de 46 de f6 3b 5c e6 1c f8 ba 0d e2 e6 63 9c 10 19 d0 ed 14 f3. Descargar de Microsoft: MicCorUEFCA2011_2011-06-27.crt

Ten cuidado, ya que, si añades tus propios certificados, se sobrescribirán los predeterminados en lugar de combinarse con los que proporciones.