CloudQuery - Inventario de Activos en la Nube como SQL
CloudQuery es un marco de movimiento de datos basado en complementos de código abierto que extrae configuraciones de proveedores de nube y APIs de SaaS (AWS, GCP, Azure, Kubernetes, GitHub, y más) y las carga en un destino — generalmente PostgreSQL — para que puedas consultar toda tu infraestructura con SQL. Los equipos de seguridad y plataforma lo utilizan para inventario de activos, gestión de postura, evidencia de conformidad, y responder a “¿qué realmente tenemos ejecutándose?” con una consulta en lugar de navegación manual.
Arquitectura
| Componente | Función |
|---|
| Complemento de origen | Extrae datos de una API (aws, gcp, azure, k8s, github, …) |
| Complemento de destino | Escribe datos en un almacén (postgresql, bigquery, sqlite, file, …) |
| Sincronización | Una ejecución que extrae de orígenes y carga a destinos |
| Configuración | Archivos YAML describiendo orígenes y destinos |
Instalación
| Método | Comando |
|---|
| Homebrew | brew install cloudquery/tap/cloudquery |
| Script | curl -L https://github.com/cloudquery/cloudquery/releases/latest/download/cloudquery_linux_amd64 -o cloudquery && chmod +x cloudquery |
| Docker | docker run ghcr.io/cloudquery/cloudquery:latest |
| Verificar | cloudquery --version |
Configuración
# aws-to-postgres.yaml
kind: source
spec:
name: aws
path: cloudquery/aws
version: "VERSION"
destinations: ["postgresql"]
tables: ["aws_ec2_instances", "aws_s3_buckets", "aws_iam_*"]
---
kind: destination
spec:
name: postgresql
path: cloudquery/postgresql
version: "VERSION"
spec:
connection_string: "postgresql://user:pass@localhost:5432/cq"
Comandos Principales
| Comando | Descripción |
|---|
cloudquery sync config.yaml | Ejecuta una sincronización (extrae → carga) |
cloudquery sync aws.yaml pg.yaml | Combina múltiples archivos de configuración |
cloudquery init --source aws --destination postgresql | Genera una configuración automática |
cloudquery tables config.yaml | Lista las tablas que proporciona un origen |
cloudquery migrate config.yaml | Aplica solo migraciones de esquema |
cloudquery plugin install config.yaml | Preinstala complementos |
cloudquery --log-level debug sync ... | Registro detallado |
Consultar el Inventario
Una vez sincronizado, consulta con SQL plano:
-- Cubos S3 públicos
SELECT name, region FROM aws_s3_buckets
WHERE block_public_acls = false;
-- Instancias EC2 sin una etiqueta requerida
SELECT instance_id, region FROM aws_ec2_instances
WHERE tags->>'Owner' IS NULL;
-- Usuarios de IAM sin MFA
SELECT user_name FROM aws_iam_users
WHERE mfa_active = false;
-- Entre nubes: contar compute por proveedor
SELECT 'aws' AS cloud, count(*) FROM aws_ec2_instances
UNION ALL SELECT 'gcp', count(*) FROM gcp_compute_instances;
Complementos de Origen Comunes
| Complemento | Cubre |
|---|
cloudquery/aws | EC2, S3, IAM, VPC, RDS, Lambda, … |
cloudquery/gcp | Compute, Storage, IAM, GKE, … |
cloudquery/azure | VMs, Storage, AAD, … |
cloudquery/k8s | Pods, Deployments, RBAC, … |
cloudquery/github | Repos, members, branch protection |
cloudquery/cloudflare, okta, gcp… | Postura de SaaS |
Programación e IC
| Enfoque | Cómo |
|---|
| Cron | Ejecuta cloudquery sync según un cronograma |
| Canalización de IC | Sincroniza luego ejecuta verificaciones de políticas SQL, falla en violaciones |
| Incremental | Muchas tablas soportan sincronizaciones incrementales para reducir costos |
| Políticas | Empareja con consultas SQL como controles de conformidad |
Flujos de Trabajo Comunes
# Actualización de inventario nocturno a Postgres
cloudquery sync aws.yaml gcp.yaml azure.yaml postgres.yaml
# Exploración local rápida en SQLite (sin servidor BD)
cloudquery sync aws.yaml sqlite.yaml
sqlite3 cq.db "SELECT name FROM aws_s3_buckets"
# Lista qué expone un origen AWS antes de sincronizar
cloudquery tables aws.yaml
CloudQuery vs Otros Enfoques
| Aspecto | CloudQuery | Steampipe | CLIs Nativos |
|---|
| Modelo | Sincroniza a una BD, luego SQL | SQL activo sobre APIs | Imperativo por llamada |
| Mejor para | Inventario, historial, uniones a escala | Consultas activas ad-hoc | Búsquedas puntuales |
| Persistencia | Sí (tu base de datos) | En tiempo de consulta | Ninguna |
| Uniones entre nubes | Sí | Sí | Manual |
Recursos