|
| 1 | +# CleanCloud |
| 2 | + |
| 3 | + |
| 4 | + |
| 5 | + |
| 6 | +[](https://github.com/cleancloud-io/cleancloud/actions/workflows/security-scan.yml) |
| 7 | + |
| 8 | + |
| 9 | +**Languages / Langues :** |
| 10 | +🇬🇧 [English](README.md) | 🇫🇷 [Français](README.fr.md) |
| 11 | + |
| 12 | +--- |
| 13 | + |
| 14 | +**Trivy pour le gaspillage cloud. Un scanner qui détecte les ressources orphelines et applique l'hygiène en CI.** |
| 15 | + |
| 16 | +Comme `tfsec` pour Terraform ou `trivy` pour les conteneurs — CleanCloud scanne votre environnement cloud et rapporte ce qui gaspille de l'argent. Exécutez-le une fois pour un audit ponctuel, planifiez-le, ou intégrez-le en CI/CD pour bloquer les builds sur des violations de politique. |
| 17 | + |
| 18 | +- **20 règles de détection haut signal :** volumes orphelins, bases de données inactives, load balancers vides, et plus |
| 19 | +- **Gaspillage mensuel estimé :** par finding et en agrégat |
| 20 | +- **Application de politique CI/CD (opt-in) :** `--fail-on-confidence HIGH` ou `--fail-on-cost 100` gate votre pipeline |
| 21 | +- **Formats de sortie multiples :** lisible, JSON, CSV, et markdown (à coller dans vos PRs GitHub ou Slack) |
| 22 | +- **Lecture seule par conception :** aucune suppression, aucune modification de tags, aucune mutation — jamais |
| 23 | +- **Aucun agent. Zéro télémétrie. Pas de SaaS.** S'exécute dans votre environnement, les données ne quittent jamais votre périmètre |
| 24 | + |
| 25 | +**Cas d'usage :** |
| 26 | +- Audit ponctuel de gaspillage cloud — exécutez dans CloudShell, findings visibles en 60 secondes |
| 27 | +- Analyses d'hygiène planifiées — cron ou CI hebdomadaire pour détecter la dérive |
| 28 | +- Gate CI/CD — bloquer un build si le gaspillage dépasse votre seuil |
| 29 | + |
| 30 | +``` |
| 31 | +6 problèmes d'hygiène détectés : |
| 32 | +
|
| 33 | +1. [AWS] Volume EBS non attaché — $40/mois |
| 34 | +2. [AWS] NAT Gateway inactive — $32.40/mois |
| 35 | +3. [AWS] Elastic IP non attachée — $0/mois |
| 36 | +... |
| 37 | +
|
| 38 | +Gaspillage mensuel estimé : ~$147 |
| 39 | +Régions scannées : us-east-1, us-west-2, eu-west-1 |
| 40 | +``` |
| 41 | + |
| 42 | +## Ce qu'en disent les utilisateurs |
| 43 | + |
| 44 | +> "Outil de découverte solide qui remonte les économies potentielles. Facile à installer et à utiliser !" |
| 45 | +> — [Utilisateur Reddit](https://www.reddit.com/r/AZURE/comments/1rm7an5/comment/o8zfv6a/) |
| 46 | +
|
| 47 | +--- |
| 48 | + |
| 49 | +## Démarrage |
| 50 | + |
| 51 | +```bash |
| 52 | +pipx install cleancloud |
| 53 | +pipx ensurepath # ajoute cleancloud au PATH — relancez votre shell après |
| 54 | +cleancloud demo # visualisez des findings sans aucun credential cloud |
| 55 | +``` |
| 56 | + |
| 57 | +Prêt à scanner votre vrai environnement : |
| 58 | + |
| 59 | +```bash |
| 60 | +cleancloud scan --provider aws --all-regions |
| 61 | +cleancloud scan --provider azure |
| 62 | +``` |
| 63 | + |
| 64 | +### Sans installation — essayez dans votre cloud shell |
| 65 | + |
| 66 | +Vous avez un compte AWS ou Azure ? Lancez un vrai scan en quelques secondes, sans installation locale. |
| 67 | + |
| 68 | +**AWS — [AWS CloudShell](https://console.aws.amazon.com/cloudshell) :** |
| 69 | +```bash |
| 70 | +pip install --upgrade cleancloud |
| 71 | +cleancloud doctor --provider aws # vérifiez les permissions de votre session |
| 72 | +cleancloud scan --provider aws --all-regions |
| 73 | +``` |
| 74 | + |
| 75 | +**Azure — [Azure Cloud Shell](https://shell.azure.com) :** |
| 76 | +```bash |
| 77 | +pip install --upgrade --user cleancloud |
| 78 | +export PATH="$HOME/.local/bin:$PATH" |
| 79 | +cleancloud doctor --provider azure # vérifiez les permissions de votre session |
| 80 | +cleancloud scan --provider azure |
| 81 | +``` |
| 82 | + |
| 83 | +Les deux shells s'authentifient via votre session du portail — aucune credential séparée n'est requise. |
| 84 | + |
| 85 | +Les permissions varient selon les comptes ; `doctor` vous indique exactement ce qui est disponible avant de scanner. Si des permissions sont manquantes, CleanCloud ignore les règles concernées et indique lesquelles ont été ignorées. |
| 86 | + |
| 87 | +<details> |
| 88 | +<summary>Problèmes d'installation</summary> |
| 89 | + |
| 90 | +**macOS :** `brew install pipx && pipx install cleancloud` |
| 91 | + |
| 92 | +**Linux :** `sudo apt install pipx && pipx install cleancloud` |
| 93 | + |
| 94 | +**Windows :** `python3 -m pip install --user pipx && python3 -m pipx ensurepath && pipx install cleancloud` |
| 95 | + |
| 96 | +**Command not found: cleancloud** — Exécutez `pipx ensurepath` puis relancez votre shell. |
| 97 | + |
| 98 | +**externally-managed-environment** — Utilisez `pipx` à la place de `pip`. |
| 99 | + |
| 100 | +**Mise à jour depuis un `pip install` existant** — supprimez-le d'abord pour éviter les conflits : |
| 101 | +```bash |
| 102 | +pip uninstall cleancloud && pipx install cleancloud && pipx ensurepath |
| 103 | +``` |
| 104 | + |
| 105 | +**Mauvaise version après installation** — Exécutez `which cleancloud` ; un ancien `pip install` masque peut-être le pipx. |
| 106 | + |
| 107 | +**Version minimale recommandée : v1.6.3** — les versions antérieures ont des problèmes de setup. Exécutez `cleancloud --version` pour vérifier. |
| 108 | + |
| 109 | +</details> |
| 110 | + |
| 111 | +--- |
| 112 | + |
| 113 | +## Exemple de résultat détaillé |
| 114 | + |
| 115 | +``` |
| 116 | +6 problèmes d'hygiène détectés : |
| 117 | +
|
| 118 | +1. [AWS] Volume EBS non attaché |
| 119 | + Risque : Faible |
| 120 | + Confiance : High |
| 121 | + Ressource : aws.ebs.volume → vol-0a1b2c3d4e5f67890 |
| 122 | + Région : us-east-1 |
| 123 | + Règle : aws.ebs.volume.unattached |
| 124 | + Raison : Volume non attaché depuis 47 jours |
| 125 | + Détails : |
| 126 | + - size_gb: 500 |
| 127 | + - state: available |
| 128 | + - tags: {"Project": "legacy-api", "Owner": "platform"} |
| 129 | +
|
| 130 | +2. [AWS] NAT Gateway inactive |
| 131 | + Risque : Moyen |
| 132 | + Confiance : Medium |
| 133 | + Ressource : aws.ec2.nat_gateway → nat-0abcdef1234567890 |
| 134 | + Région : us-west-2 |
| 135 | + Règle : aws.ec2.nat_gateway.idle |
| 136 | + Raison : Aucun trafic détecté depuis 21 jours |
| 137 | + Détails : |
| 138 | + - name: staging-nat |
| 139 | + - total_bytes_out: 0 |
| 140 | + - estimated_monthly_cost_usd: 32.40 |
| 141 | +
|
| 142 | +3. [AWS] Elastic IP non attachée |
| 143 | + Risque : Faible |
| 144 | + Confiance : High |
| 145 | + Ressource : aws.ec2.elastic_ip → eipalloc-0a1b2c3d4e5f6 |
| 146 | + Région : eu-west-1 |
| 147 | + Règle : aws.ec2.elastic_ip.unattached |
| 148 | + Raison : Elastic IP non associée à aucune instance ou ENI (ancienneté : 92 jours) |
| 149 | +
|
| 150 | +--- Résumé du scan --- |
| 151 | +Total findings : 6 |
| 152 | +Par risque : faible: 5 moyen: 1 |
| 153 | +Par confiance : high: 2 medium: 4 |
| 154 | +Gaspillage minimum estimé : ~$147/mois |
| 155 | +(4 findings sur 6 chiffrés) |
| 156 | +Régions scannées : us-east-1, us-west-2, eu-west-1 (auto-détectées) |
| 157 | +``` |
| 158 | + |
| 159 | +Pas encore de compte cloud ? `cleancloud demo` affiche un exemple de sortie sans aucun credential. |
| 160 | + |
| 161 | +### Rapport markdown partageable |
| 162 | + |
| 163 | +```bash |
| 164 | +cleancloud scan --provider aws --all-regions --output markdown |
| 165 | +``` |
| 166 | + |
| 167 | +Produit un résumé groupé que vous pouvez coller directement dans un commentaire de PR GitHub, un message Slack, ou une issue : |
| 168 | + |
| 169 | +```markdown |
| 170 | +## Résultats du scan CleanCloud |
| 171 | + |
| 172 | +**Provider :** AWS |
| 173 | +**Régions :** us-east-1, us-west-2, eu-west-1 |
| 174 | +**Scanné le :** 2026-03-07 |
| 175 | +**Gaspillage mensuel estimé :** ~$147 |
| 176 | + |
| 177 | +**Total des findings :** 6 |
| 178 | + |
| 179 | +| Finding | Nombre | Coût mensuel estimé | |
| 180 | +|---------|-------:|--------------------:| |
| 181 | +| Volume EBS non attaché | 2 | ~$115 | |
| 182 | +| NAT Gateway inactive | 1 | ~$32 | |
| 183 | +| Elastic IP non attachée | 1 | ~$0 | |
| 184 | +| ENI détachée | 1 | — | |
| 185 | +| CloudWatch Log Group : rétention infinie | 1 | — | |
| 186 | + |
| 187 | +**Confiance :** high: 3 · medium: 3 |
| 188 | + |
| 189 | +> Généré par [CleanCloud](https://github.com/cleancloud-io/cleancloud) — scanner d'hygiène cloud lecture seule pour AWS et Azure. |
| 190 | +``` |
| 191 | + |
| 192 | +Sauvegardez dans un fichier avec `--output-file results.md`. Sans `--output-file`, la sortie s'affiche dans stdout. |
| 193 | + |
| 194 | +Pour des exemples de sortie complets incluant `doctor`, JSON, CSV et markdown : [`docs/example-outputs.md`](docs/example-outputs.md) |
| 195 | + |
| 196 | +--- |
| 197 | + |
| 198 | +## Ce que CleanCloud détecte |
| 199 | + |
| 200 | +20 règles pour AWS et Azure — conservatives, haut signal, conçues pour éviter les faux positifs en environnements IaC. |
| 201 | + |
| 202 | +**AWS :** |
| 203 | +- Volumes EBS non attachés (HIGH) |
| 204 | +- Anciens snapshots EBS |
| 205 | +- Logs CloudWatch à rétention infinie |
| 206 | +- Elastic IPs non attachées (HIGH) |
| 207 | +- ENI détachées |
| 208 | +- Ressources sans tags |
| 209 | +- Anciennes AMIs |
| 210 | +- NAT Gateways inactives |
| 211 | +- Instances RDS inactives (HIGH) |
| 212 | +- Load Balancers inactifs (HIGH) |
| 213 | + |
| 214 | +**Azure :** |
| 215 | +- Disques managés non attachés |
| 216 | +- Anciens snapshots |
| 217 | +- Adresses IP publiques inutilisées (HIGH) |
| 218 | +- Load Balancers vides (HIGH) |
| 219 | +- App Gateways vides (HIGH) |
| 220 | +- App Service Plans vides (HIGH) |
| 221 | +- VNet Gateways inactives |
| 222 | +- VMs arrêtées (non désallouées) (HIGH) |
| 223 | +- Bases de données SQL inactives (HIGH) |
| 224 | +- Ressources sans tags |
| 225 | + |
| 226 | +Les règles sans marqueur de confiance sont MEDIUM — elles utilisent des heuristiques temporelles ou des signaux multiples. Commencez par `--fail-on-confidence HIGH` pour les gaspillages évidents, puis resserrez au fil de la validation par votre équipe. |
| 227 | + |
| 228 | +**Détails complets des règles, signaux et preuves :** [`docs/rules.md`](docs/rules.md) |
| 229 | + |
| 230 | +--- |
| 231 | + |
| 232 | +## Application de politique CI/CD |
| 233 | + |
| 234 | +Les scans se terminent avec `0` par défaut. Activez l'application de politique : |
| 235 | + |
| 236 | +| Flag | Comportement | Code de sortie | |
| 237 | +|------|-------------|----------------| |
| 238 | +| *(aucun)* | Rapport uniquement, jamais d'échec | `0` | |
| 239 | +| `--fail-on-confidence HIGH` | Échec sur les findings HIGH | `2` | |
| 240 | +| `--fail-on-confidence MEDIUM` | Échec sur MEDIUM ou supérieur | `2` | |
| 241 | +| `--fail-on-cost 50` | Échec si gaspillage mensuel estimé >= 50$ | `2` | |
| 242 | +| `--fail-on-findings` | Échec sur n'importe quel finding | `2` | |
| 243 | + |
| 244 | +### GitHub Actions — AWS (OIDC) |
| 245 | + |
| 246 | +```yaml |
| 247 | +- uses: aws-actions/configure-aws-credentials@v4 |
| 248 | + with: |
| 249 | + role-to-assume: arn:aws:iam::${{ vars.AWS_ACCOUNT_ID }}:role/CleanCloudCIReadOnly |
| 250 | + aws-region: us-east-1 |
| 251 | + |
| 252 | +- run: pip install cleancloud |
| 253 | + |
| 254 | +- run: | |
| 255 | + cleancloud scan --provider aws --all-regions \ |
| 256 | + --fail-on-confidence HIGH \ |
| 257 | + --output json --output-file scan.json |
| 258 | +``` |
| 259 | +
|
| 260 | +### GitHub Actions — Azure (Workload Identity) |
| 261 | +
|
| 262 | +```yaml |
| 263 | +- uses: azure/login@v2 |
| 264 | + with: |
| 265 | + client-id: ${{ secrets.AZURE_CLIENT_ID }} |
| 266 | + tenant-id: ${{ secrets.AZURE_TENANT_ID }} |
| 267 | + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} |
| 268 | + |
| 269 | +- run: pip install cleancloud |
| 270 | + |
| 271 | +- run: | |
| 272 | + cleancloud scan --provider azure \ |
| 273 | + --fail-on-confidence MEDIUM \ |
| 274 | + --output json --output-file scan.json |
| 275 | +``` |
| 276 | +
|
| 277 | +**Guide CI/CD complet :** [`docs/ci.md`](docs/ci.md) — configuration OIDC, patterns d'application, formats de sortie. |
| 278 | +Guides de configuration : [AWS](docs/aws.md) · [Azure](docs/azure.md) |
| 279 | + |
| 280 | +> Les snippets CI/CD ci-dessus utilisent `pip install` — correct pour les runners éphémères où l'isolation pipx n'est pas nécessaire. |
| 281 | + |
| 282 | +--- |
| 283 | + |
| 284 | +## Feuille de route |
| 285 | + |
| 286 | +- Règles AWS supplémentaires (cycle de vie S3, instances EC2 arrêtées) |
| 287 | +- Policy-as-code dans `cleancloud.yaml` (`fail_on_confidence`, `fail_on_cost` en config) |
| 288 | +- Filtrage de règles (flag `--rules`) |
| 289 | +- Scan multi-comptes (AWS Organizations) |
| 290 | + |
| 291 | +--- |
| 292 | + |
| 293 | +## Documentation |
| 294 | + |
| 295 | +- [`docs/rules.md`](docs/rules.md) — Règles de détection, signaux et preuves |
| 296 | +- [`docs/aws.md`](docs/aws.md) — Politique IAM AWS et configuration OIDC |
| 297 | +- [`docs/azure.md`](docs/azure.md) — RBAC Azure et configuration Workload Identity |
| 298 | +- [`docs/ci.md`](docs/ci.md) — Guide d'intégration CI/CD |
| 299 | +- [`docs/example-outputs.md`](docs/example-outputs.md) — Exemples de sortie complets |
| 300 | +- [`SECURITY.md`](SECURITY.md) — Politique de sécurité et modèle de menace |
| 301 | +- [`docs/infosec-readiness.md`](docs/infosec-readiness.md) — IAM Proof Pack, modèle de menace |
| 302 | + |
| 303 | +--- |
| 304 | + |
| 305 | +**Vous avez trouvé un bug ?** [Ouvrez une issue](https://github.com/cleancloud-io/cleancloud/issues) |
| 306 | + |
| 307 | +**Demande de fonctionnalité ?** [Démarrez une discussion](https://github.com/cleancloud-io/cleancloud/discussions) |
| 308 | + |
| 309 | +**Questions ?** suresh@getcleancloud.com |
| 310 | + |
| 311 | +[Licence MIT](LICENSE) |
0 commit comments