Dokumen ini menjelaskan cara menggunakan VM Manager, Cloud Asset Inventory, dan BigQuery untuk melihat laporan kerentanan untuk instance Compute Engine di organisasi Anda.
Dengan mengekspor data dari Cloud Asset Inventory ke BigQuery, Anda dapat menjalankan kueri lanjutan untuk mengidentifikasi patch yang tertunda dan informasi kerentanan di seluruh organisasi Anda.
Sebelum memulai
- Siapkan VM Manager.
- Aktifkan Cloud Asset Inventory API.
- Buat set data BigQuery untuk menyimpan data yang diekspor.
- Pastikan Anda memiliki izin yang diperlukan untuk melihat laporan kerentanan.
-
Siapkan autentikasi jika Anda belum melakukannya.
Autentikasi memverifikasi identitas Anda untuk mengakses Google Cloud layanan dan API. Untuk menjalankan
kode atau contoh dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke
Compute Engine dengan memilih salah satu opsi berikut:
Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:
Konsol
Saat menggunakan Google Cloud konsol untuk mengakses Google Cloud layanan dan API, Anda tidak perlu menyiapkan autentikasi.
gcloud
-
Instal Google Cloud CLI. Setelah penginstalan, inisialisasi Google Cloud CLI dengan menjalankan perintah berikut:
gcloud initJika Anda menggunakan penyedia identitas (IdP) eksternal, Anda harus login ke gcloud CLI dengan identitas gabungan Anda terlebih dahulu .
-
- Tetapkan region dan zona default.
Peran yang diperlukan
Untuk mendapatkan izin yang diperlukan untuk mengekspor data resource ke BigQuery, minta administrator Anda untuk memberi Anda peran IAM berikut di project, folder, atau organisasi:
-
Cloud Asset Viewer (
roles/cloudasset.viewer) -
BigQuery Data Editor (
roles/bigquery.dataEditor) -
BigQuery Job User (
roles/bigquery.jobUser)
Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.
Peran yang telah ditetapkan ini berisi izin yang diperlukan untuk mengekspor data resource ke BigQuery. Untuk melihat izin yang benar-benar diperlukan, perluas bagian Izin yang diperlukan:
Izin yang diperlukan
Izin berikut diperlukan untuk mengekspor data resource ke BigQuery:
-
cloudasset.assets.exportOSInventories -
cloudasset.assets.exportResource -
bigquery.datasets.get -
bigquery.tables.create -
bigquery.tables.update -
bigquery.tables.get -
bigquery.jobs.create
Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.
Mengekspor data VM Manager ke BigQuery
Untuk mengekspor data resource dan inventaris OS ke BigQuery, lakukan hal berikut:
Identifikasi ID organisasi Anda:
gcloud projects get-ancestors PROJECT_IDGanti
PROJECT_IDdengan project ID project Anda.Ekspor data inventaris OS yang dikumpulkan oleh VM Manager dari instance 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"Ganti kode berikut:
ORGANIZATION_ID: ID organisasi Anda.BQ_PROJECT_ID: project ID tempat set data BigQuery Anda berada.DATASET_ID: nama set data BigQuery Anda.
Ekspor metadata resource ke tabel BigQuery:
gcloud asset export \ --content-type=resource \ --organization=ORGANIZATION_ID \ --per-asset-type \ --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/res"Ganti kode berikut:
ORGANIZATION_ID: ID organisasi AndaBQ_PROJECT_ID: project ID tempat set data BigQuery Anda beradaDATASET_ID: ID set data BigQuery Anda
Untuk mempelajari cara mengekspor snapshot inventaris OS, lihat Mengekspor snapshot aset}.
Membuat laporan kerentanan untuk organisasi Anda
Setelah mengekspor data inventaris, Anda dapat menjalankan kueri SQL di BigQuery untuk membuat laporan kerentanan. Laporan ini memberikan informasi berikut:
- Daftar lengkap patch yang tertunda di seluruh organisasi.
- Ringkasan patch yang tertunda per instance Compute Engine.
- Ringkasan patch yang tertunda per project.
Untuk membuat laporan, lakukan langkah-langkah berikut:
Di Google Cloud konsol, buka halaman BigQuery.
Di editor kueri, tempel skrip SQL berikut:
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_PROJECTGanti
DATASET_IDdengan ID set data BigQuery Anda.Klik Run.
Untuk mengetahui informasi selengkapnya tentang membuat kueri data, lihat Menjalankan kueri.
Setelah membuat laporan, Anda dapat menggunakan Data Studio untuk membuat dasbor kustom. Untuk mengetahui informasi selengkapnya, lihat Menganalisis data dengan Data Studio.
Langkah berikutnya
- Pelajari inventaris OS di VM Manager lebih lanjut.
- Pelajari cara mengekspor metadata aset ke BigQuery.
- Gunakan Data Studio untuk memvisualisasikan data BigQuery.