|
2 | 2 |
|
3 | 3 |  |
4 | 4 |  |
5 | | - |
6 | 5 |  |
7 | | -[](https://github.com/cleancloud-io/cleancloud/actions/workflows/security-scan.yml) |
8 | | - |
9 | 6 |
|
10 | 7 | **Languages / Langues :** |
11 | 8 | 🇬🇧 [English](README.md) | 🇫🇷 [Français](README.fr.md) |
@@ -33,7 +30,7 @@ C'est CleanCloud. Scannez vos environnements AWS, Azure et GCP, obtenez des find |
33 | 30 | | Hygiène multi-comptes / multi-abonnements / multi-projets | ❌ | ✅ | ✅ | |
34 | 31 | | Application planifiée et CI/CD (codes de sortie) | ❌ | ❌ | ✅ | |
35 | 32 |
|
36 | | -- **30 règles de détection sélectives et haut signal :** volumes orphelins, bases de données inactives, instances arrêtées, registres inutilisés, et plus — conçues pour éviter les faux positifs en environnements IaC, chacune avec une estimation de coût déterministe |
| 33 | +- **31 règles de détection sélectives et haut signal :** volumes orphelins, bases de données inactives, instances arrêtées, registres inutilisés, et plus — conçues pour éviter les faux positifs en environnements IaC, chacune avec une estimation de coût déterministe. Les règles IA/ML (SageMaker) sont opt-in via `--category ai` |
37 | 34 | - **Gouvernance et application de politique (opt-in) :** `--fail-on-confidence HIGH` ou `--fail-on-cost 100` — appliquer des seuils de gaspillage sur un planning, géré par les équipes platform ou FinOps |
38 | 35 | - **Scan multi-comptes (AWS) :** scannez des AWS Organizations entières en une exécution — fichier de config, IDs inline, ou auto-découverte via `--org` |
39 | 36 | - **Scan multi-abonnements (Azure) :** scannez tous les abonnements Azure en parallèle — auto-découverte via Management Group, détail des coûts par abonnement inclus |
@@ -63,18 +60,88 @@ Toutes les opérations sont en lecture seule. Sûr pour les comptes de productio |
63 | 60 | - Gouvernance d'hygiène planifiée — job hebdomadaire qui détecte les nouveaux gaspillages et applique les seuils sur tous les comptes |
64 | 61 | - Rapports pré-revue — exportez les findings en markdown avant une revue trimestrielle des coûts ou un board meeting |
65 | 62 |
|
| 63 | +## Exemple de résultat détaillé |
| 64 | + |
66 | 65 | ``` |
67 | | -6 problèmes d'hygiène détectés : |
| 66 | +6 problèmes détectés : |
| 67 | +
|
| 68 | +1. [AWS] Instance RDS inactive (aucune connexion depuis 21 jours) |
| 69 | + Risque : Élevé |
| 70 | + Confiance : High |
| 71 | + Ressource : aws.rds.instance → db-prod-analytics |
| 72 | + Région : us-east-1 |
| 73 | + Règle : aws.rds.instance.idle |
| 74 | + Raison : Instance RDS sans connexion depuis 21 jours |
| 75 | + Détails : |
| 76 | + - instance_class: db.r5.large |
| 77 | + - engine: postgres 15.4 |
| 78 | + - estimated_monthly_cost: ~$380/mois |
| 79 | +
|
| 80 | +2. [AWS] Volume EBS non attaché |
| 81 | + Risque : Faible |
| 82 | + Confiance : High |
| 83 | + Ressource : aws.ebs.volume → vol-0a1b2c3d4e5f67890 |
| 84 | + Région : us-east-1 |
| 85 | + Règle : aws.ebs.volume.unattached |
| 86 | + Raison : Volume non attaché depuis 47 jours |
| 87 | + Détails : |
| 88 | + - size_gb: 500 |
| 89 | + - state: available |
| 90 | + - tags: {"Project": "legacy-api", "Owner": "platform"} |
| 91 | +
|
| 92 | +3. [AWS] NAT Gateway inactive |
| 93 | + Risque : Moyen |
| 94 | + Confiance : Medium |
| 95 | + Ressource : aws.ec2.nat_gateway → nat-0abcdef1234567890 |
| 96 | + Région : us-west-2 |
| 97 | + Règle : aws.ec2.nat_gateway.idle |
| 98 | + Raison : Aucun trafic détecté depuis 21 jours |
| 99 | + Détails : |
| 100 | + - name: staging-nat |
| 101 | + - total_bytes_out: 0 |
| 102 | + - estimated_monthly_cost: ~$32/mois |
| 103 | +
|
| 104 | +4. [AWS] Load Balancer inactif (aucune cible saine) |
| 105 | + Risque : Moyen |
| 106 | + Confiance : High |
| 107 | + Ressource : aws.elbv2.load_balancer → alb-staging-api |
| 108 | + Région : us-east-1 |
| 109 | + Règle : aws.elbv2.load_balancer.idle |
| 110 | + Raison : Load balancer sans cible saine depuis 30 jours |
| 111 | + Détails : |
| 112 | + - type: application |
| 113 | + - estimated_monthly_cost: ~$18/mois |
| 114 | +
|
| 115 | +5. [AWS] Elastic IP non attachée |
| 116 | + Risque : Faible |
| 117 | + Confiance : High |
| 118 | + Ressource : aws.ec2.elastic_ip → eipalloc-0a1b2c3d4e5f6 |
| 119 | + Région : eu-west-1 |
| 120 | + Règle : aws.ec2.elastic_ip.unattached |
| 121 | + Raison : Elastic IP non associée à aucune instance ou ENI (ancienneté : 92 jours) |
68 | 122 |
|
69 | | -1. [AWS] Volume EBS non attaché — $40/mois |
70 | | -2. [AWS] NAT Gateway inactive — $32.40/mois |
71 | | -3. [AWS] Elastic IP non attachée — $0/mois |
72 | | -... |
| 123 | +6. [AWS] Ancien snapshot EBS (438 jours) |
| 124 | + Risque : Faible |
| 125 | + Confiance : High |
| 126 | + Ressource : aws.ebs.snapshot → snap-0a1b2c3d4e5f67890 |
| 127 | + Région : us-west-2 |
| 128 | + Règle : aws.ebs.snapshot.old |
| 129 | + Raison : Snapshot âgé de 438 jours sans activité récente |
| 130 | + Détails : |
| 131 | + - size_gb: 200 |
| 132 | + - estimated_monthly_cost: ~$10/mois |
73 | 133 |
|
74 | | -Gaspillage mensuel estimé : ~$147 |
75 | | -Régions scannées : us-east-1, us-west-2, eu-west-1 |
| 134 | +--- Résumé du scan --- |
| 135 | +Total findings : 6 |
| 136 | +Par risque : faible: 3 moyen: 2 élevé: 1 |
| 137 | +Par confiance : high: 5 medium: 1 |
| 138 | +Gaspillage minimum estimé : ~$480/mois |
| 139 | +(5 findings sur 6 chiffrés) |
| 140 | +Régions scannées : us-east-1, us-west-2, eu-west-1 (auto-détectées) |
76 | 141 | ``` |
77 | 142 |
|
| 143 | +Pas encore de compte cloud ? `cleancloud demo` affiche un exemple de sortie sans aucun credential. |
| 144 | + |
78 | 145 | ## Mentionné dans la presse |
79 | 146 |
|
80 | 147 | - [Korben](https://korben.info/cleancloud-nettoyeur-cloud-aws-azure.html) 🇫🇷 — Grand média tech français |
@@ -104,6 +171,7 @@ Régions scannées : us-east-1, us-west-2, eu-west-1 |
104 | 171 | | Flag | Fonction | |
105 | 172 | |---|---| |
106 | 173 | | `--provider aws\|azure\|gcp` | Fournisseur cloud à scanner *(obligatoire)* | |
| 174 | +| `--category hygiene\|ai\|all` | Catégorie de règles : `hygiene` (défaut), `ai` (SageMaker, AWS uniquement) ou `all` (hygiene + IA) | |
107 | 175 | | `--region REGION` | Scanner une seule région | |
108 | 176 | | `--all-regions` | Toutes les régions actives — AWS/Azure uniquement | |
109 | 177 | | **AWS multi-comptes** | | |
@@ -221,54 +289,6 @@ pip uninstall cleancloud && pipx install cleancloud && pipx ensurepath |
221 | 289 |
|
222 | 290 | --- |
223 | 291 |
|
224 | | -## Exemple de résultat détaillé |
225 | | - |
226 | | -``` |
227 | | -6 problèmes d'hygiène détectés : |
228 | | -
|
229 | | -1. [AWS] Volume EBS non attaché |
230 | | - Risque : Faible |
231 | | - Confiance : High |
232 | | - Ressource : aws.ebs.volume → vol-0a1b2c3d4e5f67890 |
233 | | - Région : us-east-1 |
234 | | - Règle : aws.ebs.volume.unattached |
235 | | - Raison : Volume non attaché depuis 47 jours |
236 | | - Détails : |
237 | | - - size_gb: 500 |
238 | | - - state: available |
239 | | - - tags: {"Project": "legacy-api", "Owner": "platform"} |
240 | | -
|
241 | | -2. [AWS] NAT Gateway inactive |
242 | | - Risque : Moyen |
243 | | - Confiance : Medium |
244 | | - Ressource : aws.ec2.nat_gateway → nat-0abcdef1234567890 |
245 | | - Région : us-west-2 |
246 | | - Règle : aws.ec2.nat_gateway.idle |
247 | | - Raison : Aucun trafic détecté depuis 21 jours |
248 | | - Détails : |
249 | | - - name: staging-nat |
250 | | - - total_bytes_out: 0 |
251 | | - - estimated_monthly_cost_usd: 32.40 |
252 | | -
|
253 | | -3. [AWS] Elastic IP non attachée |
254 | | - Risque : Faible |
255 | | - Confiance : High |
256 | | - Ressource : aws.ec2.elastic_ip → eipalloc-0a1b2c3d4e5f6 |
257 | | - Région : eu-west-1 |
258 | | - Règle : aws.ec2.elastic_ip.unattached |
259 | | - Raison : Elastic IP non associée à aucune instance ou ENI (ancienneté : 92 jours) |
260 | | -
|
261 | | ---- Résumé du scan --- |
262 | | -Total findings : 6 |
263 | | -Par risque : faible: 5 moyen: 1 |
264 | | -Par confiance : high: 2 medium: 4 |
265 | | -Gaspillage minimum estimé : ~$147/mois |
266 | | -(4 findings sur 6 chiffrés) |
267 | | -Régions scannées : us-east-1, us-west-2, eu-west-1 (auto-détectées) |
268 | | -``` |
269 | | - |
270 | | -Pas encore de compte cloud ? `cleancloud demo` affiche un exemple de sortie sans aucun credential. |
271 | | - |
272 | 292 | ### Rapport markdown partageable |
273 | 293 |
|
274 | 294 | ```bash |
@@ -317,6 +337,7 @@ Pour des exemples de sortie complets incluant `doctor`, JSON, CSV et markdown : |
317 | 337 | - Plateforme : instances RDS inactives (HIGH) |
318 | 338 | - Observabilité : logs CloudWatch à rétention infinie |
319 | 339 | - Gouvernance : ressources sans tags, security groups inutilisés |
| 340 | +- IA/ML *(opt-in : `--category ai`)* : endpoints SageMaker inactifs avec zéro invocations depuis 14+ jours — endpoints GPU flaggés risque HIGH ($500–$23K/mois) |
320 | 341 |
|
321 | 342 | **Azure :** |
322 | 343 | - Compute : VMs arrêtées (non désallouées) (HIGH) |
@@ -562,7 +583,9 @@ Guide complet : [Configuration GCP →](docs/gcp.md) |
562 | 583 |
|
563 | 584 | **Policy-as-code** — `cleancloud.yaml` avec packs de règles, exceptions par équipe, et seuils de coût en config — la principale demande de gouvernance FinOps pour 2025/2026 |
564 | 585 |
|
565 | | -**Plus de règles AWS** — lacunes de cycle de vie S3, gaspillage IA/GPU (endpoints SageMaker inactifs, instances GPU orphelines), Redshift inactif |
| 586 | +**Plus de règles IA/ML** — clusters de calcul Azure ML inactifs, endpoints Vertex AI inactifs, instances de notebook SageMaker inutilisées, artefacts d'entraînement orphelins |
| 587 | + |
| 588 | +**Plus de règles AWS** — lacunes de cycle de vie S3, Redshift inactif, fuite de coût NAT Gateway (services internes routant via NAT au lieu de VPC endpoints — S3, DynamoDB, ECR, SSM), VPC endpoints inutilisés |
566 | 589 |
|
567 | 590 | **Plus de règles Azure** — Azure Firewall inactif, pools de nœuds AKS inactifs, pools Azure Batch inutilisés |
568 | 591 |
|
|
0 commit comments