En esta página, se enumeran las consultas de SQL de ejemplo para analizar los datos de tus elementos después de exportarlos a BigQuery. Consulta la Sintaxis de consultas de SQL estándar para obtener más información.
Consulta directamente en las columnas disponibles
Para encontrar la cantidad de cada tipo de recurso, ejecuta la siguiente consulta:
SELECT asset_type, COUNT(*) AS asset_count FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` GROUP BY asset_type ORDER BY asset_count DESC
Consulta en campos repetidos
Para buscar políticas de administración de identidades y accesos (IAM) que contengan cuentas de Gmail como miembro, ejecuta la siguiente consulta: BigQuery usa UNNEST
para compactar campos repetidos en una tabla que puedes consultar directamente:
SELECT name, asset_type, bindings.role FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` JOIN UNNEST(iam_policy.bindings) AS bindings JOIN UNNEST(bindings.members) AS members WHERE members like "%@gmail.com"
Para encontrar una organización, una carpeta o un proyecto que permita crear mediante una IP pública, ejecuta la siguiente consulta: Esta consulta es útil porque permite que las IP públicas con instancias de Cloud SQL puedan introducir vulnerabilidades, a menos que se configure SSL o un proxy:
SELECT name FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` JOIN UNNEST(org_policy) AS op WHERE op.constraint = "constraints/sql.restrictPublicIp" AND (op.boolean_policy IS NULL OR op.boolean_policy.enforced = FALSE);
Para buscar una organización, una carpeta o un proyecto dentro del mismo perímetro de servicio de Controles del servicio de VPC de un proyecto, ejecuta la siguiente consulta:
SELECT service_perimeter.title, service_perimeter.status.resources FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` CROSS JOIN UNNEST(service_perimeter.status.resources) as resource WHERE resource = "projects/PROJECT_NUMBER";
Consulta en la string JSON extraída
Para encontrar reglas de firewall abiertas, ejecuta la siguiente consulta. Obtén más información sobre las funciones JSON que se usan en BigQuery.
CREATE TEMP FUNCTION json2array(json STRING) RETURNS ARRAY<STRING> LANGUAGE js AS """ return JSON.parse(json).map(x=>JSON.stringify(x)); """; SELECT firewall.name, firewall.resource.parent, JSON_EXTRACT(firewall.resource.data, '$.sourceRanges') AS sourceRanges FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` AS firewall JOIN UNNEST(json2array(JSON_EXTRACT(firewall.resource.data, '$.sourceRanges'))) AS source_ranges WHERE asset_type="compute.googleapis.com/Firewall" AND JSON_EXTRACT(firewall.resource.data, '$.sourceRanges') IS NOT NULL AND JSON_EXTRACT_SCALAR(source_ranges, '$') = "0.0.0.0/0"
Mediante la separación de tablas por tipo de recurso, podemos encontrar reglas de firewall abiertas con una consulta más fácil y rápida.
SELECT firewall.name, firewall.resource.parent, sourceRanges FROM `PROJECT_ID.DATASET_ID.STRUCTURED_INSTANCE_TABLE_NAME` AS firewall JOIN UNNEST(firewall.resource.data.sourceRanges) AS sourceRanges WHERE sourceRanges = "0.0.0.0/0";
Consulta en los tipos de recursos unidos
Para unir tablas de diferentes tipos de recursos, ejecuta la siguiente consulta: En el siguiente ejemplo, se muestra cómo encontrar todas las subredes que no tienen una VM conectada.
Primero, la consulta encuentra todas las subredes. Luego, en esa lista, selecciona las subredes cuyo selfLinks
no está presente.
SELECT name, JSON_EXTRACT(subnetwork.resource.data, '$.selfLink') AS selflink FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` AS subnetwork WHERE asset_type = "compute.googleapis.com/Subnetwork" AND (JSON_EXTRACT(subnetwork.resource.data, '$.selfLink') NOT IN (SELECT DISTINCT JSON_EXTRACT(network_interfaces, '$.subnetwork') FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` as instance JOIN UNNEST(json2array(JSON_EXTRACT(instance.resource.data, '$.networkInterfaces'))) AS network_interfaces WHERE asset_type ="compute.googleapis.com/Instance" AND JSON_EXTRACT(instance.resource.data, '$.networkInterfaces') IS NOT NULL )) IS NULL
Mediante la separación de tablas por tipo de recurso, podemos encontrar todas las subredes que no tienen una VM adjunta con una consulta más fácil y rápida.
SELECT name, subnetwork.resource.data.selfLink FROM `PROJECT_ID.DATASET_ID.STRUCTURED_SUBNETWORK_TABLE_NAME` AS subnetwork WHERE ( subnetwork.resource.data.selfLink NOT IN ( SELECT DISTINCT networkInterface.subnetwork FROM `PROJECT_ID.DATASET_ID.STRUCTURED_INSTANCE_TABLE_NAME` as instance JOIN UNNEST(instance.resource.data.networkInterfaces) AS networkInterface WHERE networkInterface IS NOT NULL ) ) IS NULL;