CloudQuery - Cheatsheet Cloud Asset Inventory as SQL
CloudQuery è un framework open-source basato su plugin che estrae la configurazione da provider cloud e API SaaS (AWS, GCP, Azure, Kubernetes, GitHub e altri) e la carica in una destinazione — più comunemente PostgreSQL — per interrogare l”intera infrastruttura con SQL. I team di sicurezza e platform lo utilizzano per inventario di asset, postura management, evidenza di compliance e per rispondere a “cosa stiamo effettivamente eseguendo?” con una query invece di un click nella console.
Architettura
| Componente | Ruolo |
|---|
| Source plugin | Estrae dati da un”API (aws, gcp, azure, k8s, github, …) |
| Destination plugin | Scrive dati in un archivio (postgresql, bigquery, sqlite, file, …) |
| Sync | Un”esecuzione che estrae da sorgenti e carica a destinazioni |
| Config | File YAML che descrivono sorgenti e destinazioni |
Installazione
| Metodo | 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 |
| Verifica | cloudquery --version |
Configurazione
# 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"
Comandi Principali
| Comando | Descrizione |
|---|
cloudquery sync config.yaml | Esegui una sync (extract → load) |
cloudquery sync aws.yaml pg.yaml | Combina più file di configurazione |
cloudquery init --source aws --destination postgresql | Scaffolding di una config |
cloudquery tables config.yaml | Elenca le tabelle che una sorgente fornisce |
cloudquery migrate config.yaml | Applica solo migrazioni di schema |
cloudquery plugin install config.yaml | Pre-installa plugin |
cloudquery --log-level debug sync ... | Logging verbose |
Interrogazione dell”Inventario
Una volta sincronizzati, interroga con plain SQL:
-- S3 bucket pubblici
SELECT name, region FROM aws_s3_buckets
WHERE block_public_acls = false;
-- Istanze EC2 senza tag obbligatorio
SELECT instance_id, region FROM aws_ec2_instances
WHERE tags->>'Owner' IS NULL;
-- Utenti IAM senza MFA
SELECT user_name FROM aws_iam_users
WHERE mfa_active = false;
-- Cross-cloud: conta le compute per provider
SELECT 'aws' AS cloud, count(*) FROM aws_ec2_instances
UNION ALL SELECT 'gcp', count(*) FROM gcp_compute_instances;
Plugin Source Comuni
| Plugin | Copre |
|---|
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 SaaS |
Pianificazione & CI
| Approccio | Come |
|---|
| Cron | Esegui cloudquery sync su una pianificazione |
| CI pipeline | Sync poi esegui check di policy SQL, fallisce su violazioni |
| Incremental | Molte tabelle supportano sync incrementali per ridurre il costo |
| Policies | Accoppia con query SQL come controlli di compliance |
Flussi di Lavoro Comuni
# Aggiornamento inventario notturno in Postgres
cloudquery sync aws.yaml gcp.yaml azure.yaml postgres.yaml
# Esplorazione locale veloce in SQLite (nessun server DB)
cloudquery sync aws.yaml sqlite.yaml
sqlite3 cq.db "SELECT name FROM aws_s3_buckets"
# Elenca cosa una sorgente AWS espone prima di sincronizzare
cloudquery tables aws.yaml
CloudQuery vs Altri Approcci
| Aspetto | CloudQuery | Steampipe | CLI Nativi |
|---|
| Model | Sync in DB, poi SQL | SQL live su API | Imperativo per-call |
| Migliore per | Inventario, storia, join a scala | Query live ad-hoc | Ricerche estemporanee |
| Persistenza | Sì (il tuo database) | Query-time | Nessuna |
| Join cross-cloud | Sì | Sì | Manuale |
Risorse