En esta guía, se describe cómo verificar la integridad de la imagen de la máquina virtual (VM) de Compute Engine que usa Google Kubernetes Engine (GKE) para las VMs del plano de control. Esta guía está dirigida a un equipo de seguridad que supervisa los registros del control plano y desea verificar lo siguiente:
- La VM del plano de control se inició con firmware auténtico y otro software de inicio que se verificó criptográficamente mediante el inicio seguro y la supervisión de integridad.
- La VM del plano de control se inició desde una imagen auténtica del SO de GKE.
También puedes realizar esta verificación para las imágenes del SO y la integridad de inicio de tus nodos trabajadores.
En esta página, se describe una parte de un conjunto de funciones opcionales del plano de control en GKE que te permiten realizar tareas como verificar la postura de seguridad del plano de control o configurar la encriptación y la firma de credenciales en el plano de control con las claves que administras. Para obtener más información, consulta Acerca de la autoridad del plano de control de GKE.
De forma predeterminada, Google Cloud aplica varias medidas de seguridad al plano de control administrado. En esta página, se describen las funciones opcionales que te brindan más visibilidad o control sobre el plano de control de GKE.
Acerca de la verificación de integridad de la VM
De forma predeterminada, todas las instancias del plano de control de GKE son VM protegidas, que son VM endurecidas que usan funciones de seguridad, como el inicio medido y seguro, un módulo de plataforma confiable virtual (vTPM) y firmware UEFI. Todos los nodos de GKE también habilitan la supervisión de integridad, que valida la secuencia de inicio de cada VM protegida en función de una secuencia de inicio "correcta" de referencia. Esta validación muestra resultados de aprobación o rechazo para cada fase de la secuencia de inicio y los agrega a Cloud Logging. La supervisión de integridad está habilitada de forma predeterminada en todos los clústeres de GKE y valida las siguientes fases:
- Secuencia de inicio anticipado: Desde el momento en que se inicia el firmware UEFI hasta que el bootloader toma el control. Se agregó a los registros de la VM como
earlyBootReportEvent
. - Secuencia de inicio tardío: Desde el momento en que el bootloader toma el control hasta que lo hace el kernel del sistema operativo. Se agregó a los registros de la VM como
lateBootReportEvent
.
GKE también agrega registros de creación de VM del plano de control a Logging. Estos registros contienen metadatos que identifican la máquina y que incluyen detalles sobre la imagen de la VM y la secuencia de inicio. Google Cloud publica una certificación de resumen de verificación (VSA) para cada imagen de VM del plano de control de GKE en el repositorio gke-vsa en GitHub. La VSA usa el marco de trabajo in-toto para las certificaciones. Puedes validar los registros de VM del plano de control de tus clústeres con los VSAs correspondientes para verificar que los nodos del plano de control se hayan iniciado como se esperaba.
Realizar estas validaciones puede ayudarte a alcanzar los siguientes objetivos:
- Asegúrate de que el software del plano de control esté protegido por el inicio seguro y la supervisión de integridad, coincida con el código fuente previsto y sea exactamente el mismo que la imagen que usan otros clientes de Google Cloud .
- Mejora tu confianza en la forma en que GKE protege el plano de control.
Precios
Esta función se ofrece sin costo adicional en GKE.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta
gcloud components update
para obtener la versión más reciente.
-
Enable the Cloud Logging API.
- Asegúrate de tener un clúster en modo GKE Autopilot o Standard que ejecute la versión 1.29 o posterior.
Roles obligatorios
Para obtener los permisos que necesitas para verificar la integridad de la VM del plano de control, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Crear clústeres y, luego, interactuar con ellos: Administrador de clústeres de Kubernetes Engine (
roles/container.clusterAdmin
) -
Acceder a los registros y procesarlos: Visualizador de registros (
roles/logging.viewer
)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.
Verifica si hay fases de secuencia de inicio fallidas
La supervisión de integridad agrega un registro a Logging si una VM del plano de control falla o completa correctamente una fase de la secuencia de inicio. Para ver los eventos de inicio fallidos, ejecuta los siguientes comandos:
En la consola de Google Cloud , ve a la página Explorador de registros:
En el campo Consulta, ingresa la siguiente consulta:
jsonPayload.@type="type.googleapis.com/cloud_integrity.IntegrityEvent" jsonPayload.earlyBootReportEvent.policyEvaluationPassed="false" OR jsonPayload.lateBootReportEvent.policyEvaluationPassed="false" jsonPayload.metadata.isKubernetesControlPlaneVM="true"
También puedes verificar si hay eventos de inicio correctos reemplazando
false
portrue
en esta consulta.Haz clic en Ejecutar consulta. Si no ves resultados, significa que las VMs del plano de control aprobaron todas las verificaciones de supervisión de integridad. Si ves un resultado, continúa con el siguiente paso para identificar el clúster correspondiente.
En el registro de integridad de inicio fallido, copia el valor del campo
resource.labels.instance_id
.En el campo Consulta, ingresa la siguiente consulta:
protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog" protoPayload.metadata.isKubernetesControlPlaneVM="true" resource.labels.instance_id="INSTANCE_ID" protoPayload.methodName="v1.compute.instances.insert"
Reemplaza
INSTANCE_ID
por el valor del campoinstance_id
del paso anterior.Haz clic en Ejecutar consulta. El valor en el campo
protoPayload.metadata.parentResource.parentResourceId
es el ID del clúster de GKE.Busca el nombre del clúster de GKE:
gcloud asset query \ --organization=ORGANIZATION_ID \ --statement="SELECT name FROM container_googleapis_com_Cluster WHERE resource.data.id='CLUSTER_ID';"
Reemplaza lo siguiente:
ORGANIZATION_ID
: Es el ID numérico de tu organización deGoogle Cloud .CLUSTER_ID
: El valor del campoprotoPayload.metadata.parentResource.parentResourceId
del paso anterior.
El resultado es similar a este:
# lines omitted for clarity //container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME
Este resultado tiene los siguientes campos:
PROJECT_ID
: El ID de tu proyecto de Google Cloud .LOCATION
: Es la ubicación del clúster.CLUSTER_NAME
: el nombre del clúster
Busca y, luego, inspecciona los registros de la VM del plano de control
Los registros de creación de VMs de Compute Engine que corresponden a los clústeres de GKE se almacenan en el bucket de registro _Default
.
Para encontrar los registros de creación de las VMs del plano de control de tu clúster y recuperar estos metadatos, haz lo siguiente:
En la consola de Google Cloud , ve a la página Explorador de registros:
En el campo Consulta, ingresa la siguiente consulta:
resource.type="gce_instance" protoPayload.methodName="v1.compute.instances.insert" protoPayload.metadata.isKubernetesControlPlaneVM="true"
Haz clic en Ejecutar consulta. Si no ves resultados, verifica que cumplas con todos los requisitos de la sección Antes de comenzar.
En los resultados de la consulta, verifica el campo
metadata
. El resultado es similar a lo siguiente:# fields omitted for clarity "metadata": { "usedResources": { "attachedDisks": [ { "sourceImageId": "9046093115864736653", "sourceImage": "https://www.googleapis.com/compute/v1/projects/1234567890/global/images/gke-1302-gke1627000-cos-113-18244-85-49-c-pre", "isBootDisk": true } # fields omitted for clarity
El campo
metadata
incluye la siguiente información:usedResources
: Es la lista de recursos que se usan para crear la VM.attachedDisks
: Es el disco de arranque de la VM.sourceImageId
: El ID único de la imagen de la VM.sourceImage
: Es la URL de la imagen de la VM de origen. La sintaxis del valor en este campo eshttps://www.googleapis.com/compute/v1/projects/PROJECT_NUMBER/global/images/IMAGE_NAME
, dondePROJECT_NUMBER
es el número del proyecto deGoogle Cloudque aloja las VMs del plano de control yIMAGE_NAME
es el nombre de la imagen que se usó para iniciar la VM.isBootDisk
: Es un identificador booleano que indica si este disco se usó como disco de arranque de la VM.
Busca y verifica la VSA para las imágenes de VM del plano de control
En esta sección, encontrarás el VSA que corresponde a la imagen de VM de tu plano de control en el repositorio gke-vsa de GitHub. Luego, usa una herramienta llamada slsa-verifier
que proporciona el framework de niveles de cadena de suministro para artefactos de software (SLSA) para verificar la VSA. Necesitas los siguientes datos del registro de creación de la VM del plano de control:
- El ID de la imagen de la VM
- El número de proyecto del proyecto de Google Cloudque aloja las VMs
- El nombre de la imagen de SO que se usó para iniciar la VM
El archivo que corresponde a tu VM de plano de control tiene el siguiente formato de nombre de archivo:
IMAGE_NAME:IMAGE_ID.intoto.jsonl
Reemplaza lo siguiente:
IMAGE_NAME
: Es el nombre de la imagen de la VM, que es la cadena después de/images/
en el campoattachedDisks.sourceImage
del registro de auditoría de la VM de la sección anterior. Por ejemplo,gke-1302-gke1627000-cos-113-18244-85-49-c-pre
IMAGE_ID
: El ID de la imagen de la VM, que es el valor del campoattachedDisks.sourceImageId
en el registro de auditoría de la VM de la sección anterior. Por ejemplo,9046093115864736653
.
Para encontrar y verificar el VSA cuando conoces el nombre del archivo, sigue estos pasos:
- Abre el
repositorio de GitHub de
gke-vsa
. - En el directorio "gke-master-images", busca el archivo que corresponde a la imagen de la VM. Por ejemplo:
https://github.com/GoogleCloudPlatform/gke-vsa/blob/main/gke-master-images:78064567238/IMAGE_NAME:IMAGE_ID.intoto.jsonl
- Descarga el archivo VSA.
- Instala la herramienta de
slsa-verifier
. Guarda la clave pública para verificar la VSA en un archivo llamado
vsa_signing_public_key
:Verifica el VSA:
slsa-verifier verify-vsa \ --attestation-path=PATH_TO_VSA_FILE \ --resource-uri=gce_image://gke-master-images:IMAGE_NAME \ --subject-digest=gce_image_id:IMAGE_ID\ --verifier-id=https://bcid.corp.google.com/verifier/bcid_package_enforcer/v0.1 \ --verified-level=BCID_L1 \ --verified-level=SLSA_BUILD_LEVEL_2 \ --public-key-path=PATH_TO_PUBLIC_KEY_FILE \ --public-key-id=keystore://76574:prod:vsa_signing_public_key
Reemplaza lo siguiente:
PATH_TO_VSA_FILE
: Es la ruta de acceso al archivo VSA que descargaste.IMAGE_NAME
: Es el nombre de la imagen de la VM, comogke-1302-gke1627000-cos-113-18244-85-49-c-pre
.IMAGE_ID
: El ID de la imagen de la VM, como9046093115864736653
.
Si la VSA pasa las verificaciones, el resultado es el siguiente:
Verifying VSA: PASSED PASSED: SLSA verification passed