En este documento, se describe cómo usar VM Manager, Cloud Asset Inventory y BigQuery para ver los informes de vulnerabilidades de las instancias de Compute Engine en tu organización.
Si exportas datos de Cloud Asset Inventory a BigQuery, puedes ejecutar consultas avanzadas para identificar parches pendientes y obtener información sobre vulnerabilidades en toda tu organización.
Antes de comenzar
- Configura VM Manager.
- Habilita la API de Cloud Asset Inventory.
- Crea un conjunto de datos de BigQuery para almacenar los datos exportados.
- Verifica que tengas los permisos necesarios para ver los informes de vulnerabilidades.
-
Si aún no lo hiciste, configura la autenticación.
La autenticación verifica tu identidad para acceder a los servicios y las APIs de Google Cloud . Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:
Selecciona la pestaña que corresponda a la forma en que planeas usar las muestras de esta página:
Console
Cuando usas la consola de Google Cloud para acceder a los servicios y las APIs de Google Cloud , no necesitas configurar la autenticación.
gcloud
-
Instala Google Cloud CLI. Después de la instalación, inicializa Google Cloud CLI con el siguiente comando:
gcloud initSi usas un proveedor de identidad externo (IdP), primero debes acceder a la gcloud CLI con tu identidad federada.
-
- Configura una región y una zona predeterminadas.
Roles obligatorios
Para obtener los permisos que necesitas para exportar datos de recursos a BigQuery, pídele a tu administrador que te otorgue los siguientes roles de IAM en el proyecto, la carpeta o la organización:
-
Visualizador de recursos de Cloud (
roles/cloudasset.viewer) -
Editor de datos de BigQuery (
roles/bigquery.dataEditor) -
Usuario de trabajo de BigQuery (
roles/bigquery.jobUser)
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
Estos roles predefinidos contienen los permisos necesarios para exportar datos de recursos a BigQuery. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:
Permisos necesarios
Se requieren los siguientes permisos para exportar datos de recursos a BigQuery:
-
cloudasset.assets.exportOSInventories -
cloudasset.assets.exportResource -
bigquery.datasets.get -
bigquery.tables.create -
bigquery.tables.update -
bigquery.tables.get -
bigquery.jobs.create
También puedes obtener estos permisos con roles personalizados o con otros roles predefinidos.
Exporta datos de VM Manager a BigQuery
Para exportar datos de recursos y de inventario del SO a BigQuery, haz lo siguiente:
Identifica el ID de tu organización:
gcloud projects get-ancestors PROJECT_IDReemplaza
PROJECT_IDpor el ID de tu proyecto:Exporta los datos del inventario del SO recopilados por VM Manager desde las instancias de VM:
gcloud asset export \ --content-type=os-inventory \ --organization=ORGANIZATION_ID \ --per-asset-type \ --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/os"Reemplaza lo siguiente:
ORGANIZATION_ID: Es el ID de tu organización.BQ_PROJECT_ID: Es el ID del proyecto en el que se encuentra tu conjunto de datos de BigQuery.DATASET_ID: Es el nombre de tu conjunto de datos de BigQuery.
Exporta los metadatos del recurso a una tabla de BigQuery:
gcloud asset export \ --content-type=resource \ --organization=ORGANIZATION_ID \ --per-asset-type \ --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/res"Reemplaza lo siguiente:
ORGANIZATION_ID: Es el ID de tu organización.BQ_PROJECT_ID: Es el ID del proyecto en el que se encuentra tu conjunto de datos de BigQuery.DATASET_ID: El ID de tu conjunto de datos de BigQuery
Para obtener información sobre cómo exportar instantáneas del inventario del SO, consulta Exportar una instantánea de activo.
Genera un informe de vulnerabilidades para tu organización
Después de exportar los datos del inventario, puedes ejecutar una consulta en SQL en BigQuery para generar un informe de vulnerabilidades. En este informe, se proporciona la siguiente información:
- Es una lista completa de los parches pendientes en toda la organización.
- Es un resumen de los parches pendientes por instancia de Compute Engine.
- Es un resumen de los parches pendientes por proyecto.
Para generar el informe, sigue estos pasos:
En la consola de Google Cloud , ve a la página BigQuery.
En el editor de consultas, pega la siguiente secuencia de comandos SQL:
WITH UPDATES_GRANULAR_DATA AS ( SELECT project, instance, os, available_update, vuln.cve AS vuln_cve, vuln.severity AS linux_vuln_severity, windows_categories FROM ( SELECT SPLIT(inv.name, '/')[OFFSET(4)] AS project, SPLIT(inv.name, '/')[OFFSET(8)] AS instance, inv.os_inventory.os_Info.long_Name AS os, inv_item.key AS available_update, ( SELECT ARRAY_AGG(c.name) windows_cat_names FROM UNNEST(inv_item.value.available_Package.wua_Package.categories) c ) AS windows_categories FROM DATASET_ID.os_compute_googleapis_com_Instance AS inv CROSS JOIN UNNEST(inv.os_inventory.items) AS inv_item WHERE inv.name NOT LIKE '%/locations/%' AND inv_item.value.type = 2 --"AVAILABLE_PACKAGE" UNION ALL SELECT project, instance, os, NULL AS available_update, NULL AS windows_categories FROM ( SELECT SPLIT(name, '/')[OFFSET(4)] AS project, SPLIT(name, '/')[OFFSET(8)] AS instance, os_Inventory.os_Info.long_Name AS os, ( SELECT COUNT(*) FROM UNNEST(os_Inventory.items) WHERE value.type = 2 --"AVAILABLE_PACKAGE" ) AS count_available_updates FROM DATASET_ID.os_compute_googleapis_com_Instance WHERE name NOT LIKE '%/locations/%' ) WHERE count_available_updates = 0 ) LEFT JOIN ( SELECT inv_item, v.details.severity AS severity, v.details.cve AS cve FROM DATASET_ID.res_osconfig_googleapis_com_VulnerabilityReport CROSS JOIN UNNEST(resource.data.vulnerabilities) AS v CROSS JOIN UNNEST(v.availableInventoryItemIds) AS inv_item WHERE ARRAY_LENGTH(resource.data.vulnerabilities)>0 AND ARRAY_LENGTH(v.availableInventoryItemIds)>0 ) AS vuln ON vuln.inv_item = available_update ), REPORT_WITH_WINDOWS_CATEGORIES_VERBOSE AS ( SELECT project, instance, os, COUNTIF(available_update IS NOT NULL) as updates_pending, IF( COUNTIF(available_update IS NOT NULL)>0 AND ARRAY_LENGTH(ARRAY_CONCAT_AGG(windows_categories)) IS NULL, IF( ARRAY_LENGTH(ARRAY_AGG(DISTINCT(linux_vuln_severity) IGNORE NULLS)) > 0, IF( CONTAINS_SUBSTR(ARRAY_TO_STRING(ARRAY_AGG(DISTINCT(linux_vuln_severity) IGNORE NULLS),""), "CRITICAL"), "CRITICAL", IF( CONTAINS_SUBSTR(ARRAY_TO_STRING(ARRAY_AGG(DISTINCT(linux_vuln_severity) IGNORE NULLS),""), "HIGH"), "HIGH", IF( CONTAINS_SUBSTR(ARRAY_TO_STRING(ARRAY_AGG(DISTINCT(linux_vuln_severity) IGNORE NULLS),""), "MEDIUM"), "MEDIUM", IF( CONTAINS_SUBSTR(ARRAY_TO_STRING(ARRAY_AGG(DISTINCT(linux_vuln_severity) IGNORE NULLS),""), "LOW"), "LOW", "SEVERITY_UNSPECIFIED" ) ) ) ), "UNKNOWN" ), NULL ) as linux_vuln_severity, ARRAY_CONCAT_AGG(windows_categories) as windows_categories_agg FROM UPDATES_GRANULAR_DATA GROUP BY project, instance, os ORDER BY project, instance, os ), REPORT_BY_VM AS ( SELECT project, instance, os, updates_pending, linux_vuln_severity, IF( ARRAY_LENGTH(windows_categories_agg) > 0, IF( CONTAINS_SUBSTR(ARRAY_TO_STRING(ARRAY(SELECT DISTINCT(a) as n FROM UNNEST(windows_categories_agg) a ORDER BY n ASC),","), "Security Updates"), "SECURITY UPDATES", IF( CONTAINS_SUBSTR(ARRAY_TO_STRING(ARRAY(SELECT DISTINCT(a) as n FROM UNNEST(windows_categories_agg) a ORDER BY n ASC),","), "Update Rollups"), "UPDATE ROLLUPS", "OTHER UPDATES" ) ), NULL ) as windows_category FROM REPORT_WITH_WINDOWS_CATEGORIES_VERBOSE ), REPORT_BY_PROJECT AS ( SELECT project, COUNT(*) as total_vms, COUNTIF(updates_pending=0) as vms_up_to_date, COUNTIF(updates_pending>0) as vms_with_updates_pending, COUNTIF(linux_vuln_severity = "CRITICAL") as linux_vms_critical, COUNTIF(linux_vuln_severity = "HIGH") as linux_vms_high, COUNTIF(linux_vuln_severity = "MEDIUM") as linux_vms_medium, COUNTIF(linux_vuln_severity = "LOW") as linux_vms_low, COUNTIF(linux_vuln_severity = "SEVERITY_UNSPECIFIED") as linux_vms_severity_unspecified, COUNTIF(linux_vuln_severity = "UNKNOWN") as linux_vms_unknown, COUNTIF(windows_category = "SECURITY UPDATES") as win_vms_security_updates, COUNTIF(windows_category = "UPDATE ROLLUPS") as win_vms_update_rollups, COUNTIF(windows_category = "OTHER UPDATES") as win_vms_other_updates FROM REPORT_BY_VM GROUP BY project ) -- To view the report, uncomment one of the following SELECT statements: -- 1. List of every pending update package across all VMs with associated vulnerability severity: -- SELECT * FROM UPDATES_GRANULAR_DATA -- 2. List of VMs and pending updates count: -- SELECT * FROM REPORT_BY_VM -- 3. Summary of projects, showing count of VMs up-to-date and with pending updates: SELECT * FROM REPORT_BY_PROJECTReemplaza
DATASET_IDpor el ID de tu conjunto de datos de BigQuery.Haz clic en Ejecutar.
Para obtener más información sobre la consulta de datos, consulta Cómo ejecutar consultas.
Después de generar el informe, puedes usar Data Studio para crear un panel personalizado. Para obtener más información, consulta Analiza datos con Data Studio.
¿Qué sigue?
- Obtén más información sobre el inventario del SO en VM Manager.
- Obtén información para exportar metadatos de recursos a BigQuery.
- Usa Data Studio para visualizar datos de BigQuery.