CloudQuery - Inventaire d”actifs cloud en SQL
CloudQuery est un framework de mouvement de données open-source basé sur des plugins qui extrait la configuration des fournisseurs cloud et des APIs SaaS (AWS, GCP, Azure, Kubernetes, GitHub, et plus) et la charge dans une destination — le plus souvent PostgreSQL — pour que vous puissiez interroger l”ensemble de votre infrastructure avec SQL. Les équipes de sécurité et de plateforme l”utilisent pour l”inventaire des actifs, la gestion de la posture, les preuves de conformité, et pour répondre à « qu”avons-nous réellement exécuté ? » avec une requête au lieu d”une série de clics sur la console.
Architecture
| Composant | Rôle |
|---|
| Plugin source | Récupère les données d”une API (aws, gcp, azure, k8s, github, …) |
| Plugin destination | Écrit les données dans un magasin (postgresql, bigquery, sqlite, file, …) |
| Sync | Une exécution qui extrait des sources et charge vers les destinations |
| Config | Fichiers YAML décrivant les sources et les destinations |
Installation
| Méthode | Commande |
|---|
| 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 |
| Vérifier | cloudquery --version |
Configuration
# 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"
Commandes principales
| Commande | Description |
|---|
cloudquery sync config.yaml | Exécuter une synchronisation (extract → load) |
cloudquery sync aws.yaml pg.yaml | Combiner plusieurs fichiers de configuration |
cloudquery init --source aws --destination postgresql | Générer une configuration |
cloudquery tables config.yaml | Lister les tableaux qu”une source fournit |
cloudquery migrate config.yaml | Appliquer uniquement les migrations de schéma |
cloudquery plugin install config.yaml | Pré-installer les plugins |
cloudquery --log-level debug sync ... | Journalisation détaillée |
Interrogation de l”inventaire
Une fois synchronisés, interrogez avec du SQL pur:
-- Compartiments S3 publics
SELECT name, region FROM aws_s3_buckets
WHERE block_public_acls = false;
-- Instances EC2 manquant une balise requise
SELECT instance_id, region FROM aws_ec2_instances
WHERE tags->>'Owner' IS NULL;
-- Utilisateurs IAM sans MFA
SELECT user_name FROM aws_iam_users
WHERE mfa_active = false;
-- Cross-cloud: compter la capacité de calcul par fournisseur
SELECT 'aws' AS cloud, count(*) FROM aws_ec2_instances
UNION ALL SELECT 'gcp', count(*) FROM gcp_compute_instances;
Plugins source courants
| Plugin | Couvre |
|---|
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, membres, protection des branches |
cloudquery/cloudflare, okta, gcp… | Posture SaaS |
Planification et CI
| Approche | Comment |
|---|
| Cron | Exécuter cloudquery sync selon un horaire |
| Pipeline CI | Synchroniser puis exécuter les vérifications de politique SQL, échouer en cas de violations |
| Incrémentiel | De nombreux tableaux supportent les synchronisations incrémentielles pour réduire les coûts |
| Politiques | Associer des requêtes SQL comme contrôles de conformité |
Flux de travail courants
# Actualisation d'inventaire nocturne vers Postgres
cloudquery sync aws.yaml gcp.yaml azure.yaml postgres.yaml
# Exploration locale rapide vers SQLite (pas de serveur BD)
cloudquery sync aws.yaml sqlite.yaml
sqlite3 cq.db "SELECT name FROM aws_s3_buckets"
# Lister ce qu''une source AWS expose avant de synchroniser
cloudquery tables aws.yaml
CloudQuery vs Autres approches
| Aspect | CloudQuery | Steampipe | CLIs natifs |
|---|
| Modèle | Synchroniser vers une BD, puis SQL | SQL live sur les APIs | Impératif par appel |
| Meilleur pour | Inventaire, historique, jointures à grande échelle | Requêtes live ad-hoc | Recherches ponctuelles |
| Persistance | Oui (votre base de données) | Au moment de la requête | Aucune |
| Jointures cross-cloud | Oui | Oui | Manuel |
Ressources