In diesem Dokument wird beschrieben, wie Sie mit VM Manager, Cloud Asset Inventory und BigQuery Berichte zu Sicherheitslücken für Compute Engine-Instanzen in Ihrer Organisation aufrufen.
Wenn Sie Daten aus Cloud Asset Inventory nach BigQuery exportieren, können Sie erweiterte Abfragen ausführen, um ausstehende Patches und Informationen zu Sicherheitslücken in Ihrer gesamten Organisation zu ermitteln.
Hinweis
- VM Manager einrichten
- Aktivieren Sie die Cloud Asset Inventory API.
- Erstellen Sie ein BigQuery-Dataset zum Speichern der exportierten Daten.
- Prüfen Sie, ob Sie die erforderlichen Berechtigungen zum Aufrufen von Sicherheitslückenberichten haben.
-
Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben.
Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich so bei Compute Engine authentifizieren:
Wählen Sie den Tab aus, der Ihrer geplanten Verwendung der Beispiele auf dieser Seite entspricht:
Console
Wenn Sie über die Google Cloud Console auf Google Cloud Dienste und APIs zugreifen, müssen Sie die Authentifizierung nicht einrichten.
gcloud
-
Installieren Sie die Google Cloud CLI. Initialisieren Sie die Google Cloud CLI nach der Installation mit dem folgenden Befehl:
gcloud initWenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.
-
- Legen Sie eine Standardregion und -zone fest.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für das Projekt, den Ordner oder die Organisation zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Exportieren von Ressourcendaten nach BigQuery benötigen:
-
Cloud-Asset-Betrachter (
roles/cloudasset.viewer) -
BigQuery Data Editor (
roles/bigquery.dataEditor) -
BigQuery Job User (
roles/bigquery.jobUser)
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Diese vordefinierten Rollen enthalten die Berechtigungen, die zum Exportieren von Ressourcendaten nach BigQuery erforderlich sind. Maximieren Sie den Abschnitt Erforderliche Berechtigungen, um die notwendigen Berechtigungen anzuzeigen:
Erforderliche Berechtigungen
Die folgenden Berechtigungen sind erforderlich, um Ressourcendaten nach BigQuery zu exportieren:
-
cloudasset.assets.exportOSInventories -
cloudasset.assets.exportResource -
bigquery.datasets.get -
bigquery.tables.create -
bigquery.tables.update -
bigquery.tables.get -
bigquery.jobs.create
Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.
VM-Manager-Daten nach BigQuery exportieren
So exportieren Sie Inventar- und Ressourcendaten des Betriebssystems nach BigQuery:
So ermitteln Sie Ihre Organisations-ID:
gcloud projects get-ancestors PROJECT_IDErsetzen Sie dabei
PROJECT_IDdurch die Projekt-ID Ihres Zielprojekts.Exportieren Sie die von VM Manager erfassten Betriebssysteminventardaten aus den VM-Instanzen:
gcloud asset export \ --content-type=os-inventory \ --organization=ORGANIZATION_ID \ --per-asset-type \ --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/os"Ersetzen Sie Folgendes:
ORGANIZATION_ID: Ihre Organisations-ID.BQ_PROJECT_ID: die Projekt-ID, in der sich Ihr BigQuery-Dataset befindet.DATASET_ID: der Name Ihres BigQuery-Datasets.
Ressourcenmetadaten in eine BigQuery-Tabelle exportieren:
gcloud asset export \ --content-type=resource \ --organization=ORGANIZATION_ID \ --per-asset-type \ --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/res"Ersetzen Sie Folgendes:
ORGANIZATION_ID: Ihre Organisations-ID.BQ_PROJECT_ID: die Projekt-ID, in der sich Ihr BigQuery-Dataset befindetDATASET_ID: die ID Ihres BigQuery-Datasets
Informationen zum Exportieren von OS Inventory-Snapshots finden Sie unter Asset-Snapshot exportieren.
Sicherheitslückenbericht für Ihre Organisation erstellen
Nachdem Sie die Inventardaten exportiert haben, können Sie in BigQuery eine SQL-Abfrage ausführen, um einen Sicherheitslückenbericht zu erstellen. Dieser Bericht enthält die folgenden Informationen:
- Eine vollständige Liste der ausstehenden Patches in der gesamten Organisation.
- Eine Zusammenfassung der ausstehenden Patches pro Compute Engine-Instanz.
- Eine Zusammenfassung der ausstehenden Patches pro Projekt.
So generieren Sie den Bericht:
Rufen Sie in der Google Cloud Console die Seite BigQuery auf.
Fügen Sie das folgende SQL-Skript in den Abfrageeditor ein:
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_PROJECTErsetzen Sie
DATASET_IDdurch die ID Ihres BigQuery-Datasets.Klicken Sie auf Ausführen.
Weitere Informationen zum Abfragen von Daten finden Sie unter Abfragen ausführen.
Nachdem Sie den Bericht erstellt haben, können Sie mit Data Studio ein benutzerdefiniertes Dashboard erstellen. Weitere Informationen finden Sie unter Daten mit Data Studio analysieren.
Nächste Schritte
- Weitere Informationen zum OS-Inventar im VM Manager
- Asset-Metadaten nach BigQuery exportieren
- BigQuery-Daten mit Data Studio visualisieren