
Un bucket S3 public, un Security Group SSH ouvert au monde, un conteneur Kubernetes qui tourne en root… Ces erreurs de configuration sont à l’origine de la majorité des incidents de sécurité cloud. Le problème ? Elles passent souvent inaperçues jusqu’au déploiement — voire jusqu’à l’incident.
Checkov détecte ces problèmes avant qu’ils n’atteignent la production. Ce scanner open source analyse vos fichiers Terraform, Kubernetes, Dockerfile, Ansible et bien d’autres, en les comparant à plus de 800 règles de sécurité.
Qu’est-ce que Checkov ?
Section intitulée « Qu’est-ce que Checkov ? »Checkov est un analyseur de code statique (SAST) spécialisé dans l’Infrastructure as Code. Développé par Prisma Cloud (Palo Alto Networks) et disponible sous licence Apache 2.0, il analyse votre code avant le déploiement pour identifier les problèmes de sécurité potentiels.
Comment ça fonctionne ?
Section intitulée « Comment ça fonctionne ? »Checkov compare votre code à une base de +800 politiques de sécurité (appelées « checks »). Chaque check vérifie une bonne pratique spécifique :
| Exemple de check | Ce qu’il vérifie |
|---|---|
CKV_AWS_20 | Bucket S3 non accessible publiquement |
CKV_AWS_24 | Security Group n’autorise pas SSH depuis 0.0.0.0/0 |
CKV_K8S_1 | Conteneur Kubernetes ne partage pas le PID du host |
CKV_DOCKER_3 | Dockerfile définit un utilisateur non-root |
Chaque check possède un identifiant unique, une description, un niveau de sévérité (LOW, MEDIUM, HIGH, CRITICAL) et un guide de remédiation.
Frameworks supportés
Section intitulée « Frameworks supportés »Checkov analyse de nombreux formats d’Infrastructure as Code :
| Catégorie | Frameworks |
|---|---|
| Provisionnement cloud | Terraform, CloudFormation, Azure ARM, Bicep |
| Orchestration conteneurs | Kubernetes, Helm, Kustomize |
| Images conteneurs | Dockerfile, Docker Compose |
| Configuration | Ansible, Serverless Framework |
| Pipelines CI/CD | GitHub Actions, GitLab CI, Bitbucket Pipelines, CircleCI, Argo |
| API | OpenAPI / Swagger |
Fonctionnalités clés
Section intitulée « Fonctionnalités clés »Analyse contextuelle
Comprend les relations entre ressources grâce à une analyse en graphe
Détection de secrets
Identifie credentials, API keys et mots de passe dans le code
Politiques personnalisées
Exports multiples
Checkov permet également de gérer les faux positifs via des suppressions
inline ou CLI, et de créer des baselines pour ne signaler que les nouvelles
violations (--create-baseline et --baseline).
Installation
Section intitulée « Installation »L’installation de Checkov est simple et rapide. Il peut être installé directement depuis pip, le gestionnaire de paquets Python, avec la commande suivante :
pip install checkov# ou avec pipxpipx install checkovPour les utilisateurs de macOS, il est également possible de l’installer via Homebrew en utilisant la commande :
brew install checkovUtilisation
Section intitulée « Utilisation »L’utilisation de Checkov en ligne de commande est à la fois simple et flexible, permettant de vérifier rapidement vos fichiers d’Infrastructure as Code (IaC).
Analyses de base
Section intitulée « Analyses de base »Après l’installation, vous pouvez lancer des analyses sur différents types de fichiers et dossiers.
Pour analyser un répertoire Terraform :
checkov -d ./terraform/Pour vérifier un fichier spécifique (Kubernetes, Dockerfile, etc.) :
checkov -f deployment.yamlPour scanner uniquement un framework spécifique :
# Uniquement les secretscheckov -d . --framework secrets
# Uniquement Terraformcheckov -d . --framework terraformExclusion de fichiers et règles
Section intitulée « Exclusion de fichiers et règles »Lors de l’utilisation en ligne de commande, vous pouvez exclure certains fichiers ou désactiver des politiques de sécurité spécifiques :
# Exclure un chemincheckov -d ./projet --skip-path tests/
# Exclure une règle spécifiquecheckov -d ./projet --skip-check CKV_AWS_20
# Exclure plusieurs règlescheckov -d ./projet --skip-check CKV_AWS_20,CKV_AWS_21Comprendre les résultats : exemples par framework
Section intitulée « Comprendre les résultats : exemples par framework »Cette section présente des exemples concrets de scan avec Checkov. Pour chaque framework, nous analysons des fichiers contenant volontairement des failles de sécurité afin de comprendre comment Checkov les détecte et les signale.
Terraform (AWS, Azure, GCP)
Section intitulée « Terraform (AWS, Azure, GCP) »Terraform est le framework IaC le plus courant. Checkov vérifie des centaines de règles spécifiques à chaque provider cloud (AWS, Azure, GCP, OCI).
Exemple de code vulnérable
Section intitulée « Exemple de code vulnérable »Voici un extrait de code Terraform avec plusieurs problèmes de sécurité :
# ❌ Bucket S3 avec accès publicresource "aws_s3_bucket" "bad_bucket" { bucket = "my-public-bucket" acl = "public-read" # Problème : bucket accessible publiquement}
# ❌ Instance EC2 sans IMDSv2resource "aws_instance" "bad_instance" { ami = "ami-12345678" instance_type = "t3.micro" # Pas de metadata_options = IMDSv1 vulnérable aux attaques SSRF}
# ❌ Security Group SSH ouvert au monderesource "aws_security_group" "bad_sg" { name = "allow-all-ssh" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] # Problème : SSH ouvert à Internet }}
# ❌ RDS accessible publiquement avec mot de passe en clairresource "aws_db_instance" "bad_rds" { identifier = "mydb" engine = "mysql" instance_class = "db.t3.micro" username = "admin" password = "SuperSecret123!" # Problème : secret dans le code publicly_accessible = true # Problème : BDD exposée à Internet}Résultat du scan
Section intitulée « Résultat du scan »$ checkov -d terraform/ --compact
_ _ ___| |__ ___ ___| | _______ __ / __| '_ \ / _ \/ __| |/ / _ \ \ / / | (__| | | | __/ (__| < (_) \ V / \___|_| |_|\___|\___|_|\_\___/ \_/
By Prisma Cloud | version: 3.2.495
terraform scan results:
Passed checks: 11, Failed checks: 37, Skipped checks: 0
Check: CKV_AWS_24: "Ensure no security groups allow ingress from 0.0.0.0:0 to port 22" FAILED for resource: aws_security_group.bad_sg File: /main.tf:35-59 Guide: https://docs.prismacloud.io/en/.../networking-1-port-security
Check: CKV_AWS_17: "Ensure all data stored in RDS is not publicly accessible" FAILED for resource: aws_db_instance.bad_rds File: /main.tf:62-74 Guide: https://docs.prismacloud.io/en/.../public-2
Check: CKV_AWS_79: "Ensure Instance Metadata Service Version 1 is not enabled" FAILED for resource: aws_instance.bad_instance File: /main.tf:14-32 Guide: https://docs.prismacloud.io/en/.../bc-aws-general-31Comprendre les résultats Terraform
Section intitulée « Comprendre les résultats Terraform »Chaque ligne de résultat indique :
- Check ID (ex:
CKV_AWS_24) : identifiant unique de la règle - Description : ce que la règle vérifie en anglais
- FAILED/PASSED : résultat du test
- Resource : la ressource Terraform concernée (type.nom)
- File : emplacement dans le code (fichier:lignes)
- Guide : lien vers la documentation de remédiation
Checks AWS courants et leur signification :
| Check | Description | Risque | Comment corriger |
|---|---|---|---|
| CKV_AWS_24 | Security Group SSH ouvert (0.0.0.0/0) | Brute-force SSH, accès non autorisé | Restreindre aux IP connues |
| CKV_AWS_25 | Security Group RDP ouvert (0.0.0.0/0) | Attaques RDP, ransomware | Utiliser un VPN ou bastion |
| CKV_AWS_17 | RDS accessible publiquement | Exposition de la BDD | Mettre publicly_accessible = false |
| CKV_AWS_79 | IMDSv1 activé sur EC2 | Attaques SSRF (vol de credentials) | Forcer IMDSv2 dans metadata_options |
| CKV_AWS_8 | Volume EBS non chiffré | Données lisibles si disque volé | Activer le chiffrement EBS |
| CKV_AWS_19 | Bucket S3 non chiffré | Données non protégées au repos | Configurer SSE-S3 ou SSE-KMS |
Kubernetes
Section intitulée « Kubernetes »Kubernetes présente des risques de sécurité spécifiques liés à l’isolation des conteneurs et à leurs privilèges. Checkov vérifie plus de 150 règles Kubernetes.
Exemple de Deployment vulnérable
Section intitulée « Exemple de Deployment vulnérable »apiVersion: apps/v1kind: Deploymentmetadata: name: insecure-app namespace: default # ❌ Utiliser le namespace defaultspec: replicas: 1 selector: matchLabels: app: insecure-app template: metadata: labels: app: insecure-app spec: hostNetwork: true # ❌ Partage le réseau du host hostPID: true # ❌ Voit les processus du host containers: - name: app image: nginx:latest # ❌ Tag "latest" non reproductible securityContext: privileged: true # ❌ Conteneur privilégié = root sur le host env: - name: DB_PASSWORD value: "secret123" # ❌ Secret dans les variables d'env volumeMounts: - mountPath: /host name: host-volume volumes: - name: host-volume hostPath: path: / # ❌ Monte la racine du hostRésultat du scan
Section intitulée « Résultat du scan »$ checkov -f deployment.yaml --compact
kubernetes scan results:
Passed checks: 69, Failed checks: 21, Skipped checks: 0
Check: CKV_K8S_1: "Do not admit containers wishing to share the host process ID namespace" FAILED for resource: Deployment.default.insecure-app
Check: CKV_K8S_17: "Containers should not share the host network namespace" FAILED for resource: Deployment.default.insecure-app
Check: CKV_K8S_22: "Use read-only filesystem for containers where possible" FAILED for resource: Deployment.default.insecure-app
Check: CKV_K8S_28: "Minimize the admission of containers with the NET_RAW capability" FAILED for resource: Deployment.default.insecure-appComprendre les checks Kubernetes
Section intitulée « Comprendre les checks Kubernetes »Les checks Kubernetes suivent souvent les recommandations du CIS Kubernetes Benchmark et des Pod Security Standards (PSS).
| Check | Description | Pourquoi c’est un problème | Correction |
|---|---|---|---|
| CKV_K8S_1 | hostPID: true | Le conteneur voit tous les processus du nœud | Retirer hostPID |
| CKV_K8S_17 | hostNetwork: true | Le conteneur partage l’IP du nœud | Retirer hostNetwork |
| CKV_K8S_22 | Pas de readOnlyRootFilesystem | Un attaquant peut écrire des fichiers malveillants | Ajouter readOnlyRootFilesystem: true |
| CKV_K8S_28 | Pas de drop: [NET_RAW] | Permet des attaques réseau (ARP spoofing) | Dropper la capability |
| CKV_K8S_14 | Tag latest | Version non déterministe, difficile à auditer | Utiliser un tag versionné |
| CKV_K8S_35 | Secret dans env.value | Secret visible dans les logs, describe, etc. | Utiliser un Secret Kubernetes |
Dockerfile
Section intitulée « Dockerfile »Les Dockerfiles mal configurés peuvent créer des images vulnérables. Checkov vérifie les bonnes pratiques de sécurité pour la construction d’images.
Exemple de Dockerfile vulnérable
Section intitulée « Exemple de Dockerfile vulnérable »# ❌ Tag "latest" : version non reproductibleFROM python:latest
# ❌ MAINTAINER déprécié (utiliser LABEL)MAINTAINER dev@example.com
WORKDIR /app
# ❌ ADD peut extraire des archives et télécharger depuis Internet# Préférer COPY pour les fichiers locauxADD https://example.com/config.tar.gz /app/ADD . /app/
RUN pip install -r requirements.txt
# ❌ Expose le port SSH (risque d'accès distant non voulu)EXPOSE 22 80
# ❌ Secret dans une variable d'environnement (visible dans l'image)ENV API_KEY=sk-secret-12345
# ❌ Pas de USER : le conteneur s'exécute en root# ❌ Pas de HEALTHCHECK : impossible de savoir si l'app fonctionneCMD ["python", "app.py"]Résultat du scan
Section intitulée « Résultat du scan »$ checkov -f Dockerfile --compact
dockerfile scan results:
Passed checks: 47, Failed checks: 5, Skipped checks: 0
Check: CKV_DOCKER_7: "Ensure the base image uses a non latest version tag" FAILED for resource: Dockerfile.FROM File: /Dockerfile:4-4
Check: CKV_DOCKER_3: "Ensure that a user for the container has been created" FAILED for resource: Dockerfile. File: /Dockerfile:1-33
Check: CKV_DOCKER_2: "Ensure that HEALTHCHECK instructions have been added" FAILED for resource: Dockerfile. File: /Dockerfile:1-33
Check: CKV_DOCKER_1: "Ensure port 22 is not exposed" FAILED for resource: Dockerfile.EXPOSE File: /Dockerfile:29-29
Check: CKV_DOCKER_4: "Ensure that COPY is used instead of ADD" FAILED for resource: Dockerfile.ADD File: /Dockerfile:21-21Comprendre les checks Dockerfile
Section intitulée « Comprendre les checks Dockerfile »| Check | Description | Risque | Correction |
|---|---|---|---|
| CKV_DOCKER_7 | Tag latest dans FROM | Image peut changer sans préavis | Utiliser un tag versionné (ex: python:3.11-slim) |
| CKV_DOCKER_3 | Pas d’instruction USER | Conteneur s’exécute en root | Ajouter USER nonroot avant CMD |
| CKV_DOCKER_2 | Pas de HEALTHCHECK | Kubernetes/Docker ne peut pas vérifier la santé | Ajouter HEALTHCHECK CMD curl -f http://localhost/ |
| CKV_DOCKER_1 | Port 22 exposé | SSH dans un conteneur = mauvaise pratique | Retirer l’exposition du port 22 |
| CKV_DOCKER_4 | ADD au lieu de COPY | ADD peut télécharger/extraire automatiquement | Utiliser COPY pour les fichiers locaux |
| CKV2_DOCKER_1 | Utilisation de sudo | Indique un problème de gestion des privilèges | Configurer correctement USER |
Ansible présente des risques spécifiques liés à la gestion des secrets et aux modules qui peuvent désactiver la validation des certificats.
Exemple de playbook vulnérable
Section intitulée « Exemple de playbook vulnérable »---- name: Configuration serveur web hosts: webservers become: true vars: # ❌ Mot de passe en clair dans le code db_password: "SuperSecret123!" api_key: "sk-1234567890abcdef"
tasks: - name: Install packages with force ansible.builtin.apt: name: nginx state: present force: yes # ❌ Force peut contourner des vérifications de sécurité
- name: Download file ansible.builtin.get_url: url: https://example.com/config.tar.gz dest: /tmp/config.tar.gz validate_certs: no # ❌ Désactive la validation TLS = vulnérable MITM
- name: Set insecure permissions ansible.builtin.file: path: /etc/app/config mode: '0777' # ❌ Permissions trop permissivesRésultat du scan
Section intitulée « Résultat du scan »$ checkov -f playbook.yml --compact
ansible scan results:
Passed checks: 2, Failed checks: 2, Skipped checks: 0
Check: CKV_ANSIBLE_6: "Ensure that the force parameter is not used" FAILED for resource: tasks.ansible.builtin.apt.Install packages with force File: /playbook.yml:20-28
Check: CKV_ANSIBLE_2: "Ensure that certificate validation isn't disabled with get_url" FAILED for resource: tasks.ansible.builtin.get_url.Download file File: /playbook.yml:27-35
secrets scan results:
Passed checks: 0, Failed checks: 1, Skipped checks: 0
Check: CKV_SECRET_6: "Base64 High Entropy String" FAILED for resource: cbfdac6008f9cab4083784cbd1874f76618d2a97 File: /playbook.yml:12-13Comprendre les checks Ansible
Section intitulée « Comprendre les checks Ansible »| Check | Description | Risque | Correction |
|---|---|---|---|
| CKV_ANSIBLE_2 | validate_certs: no | Attaque Man-in-the-Middle possible | Garder la validation activée |
| CKV_ANSIBLE_6 | force: yes dans apt | Peut installer des paquets corrompus | Retirer force: yes |
| CKV_SECRET_6 | Secret détecté | Mot de passe/clé visible dans Git | Utiliser Ansible Vault |
Détection de secrets
Section intitulée « Détection de secrets »Checkov scanne automatiquement tous les fichiers pour détecter les secrets (credentials, API keys, tokens, mots de passe). Cette détection utilise des patterns d’entropie et des expressions régulières pour identifier les chaînes suspectes.
$ checkov -d . --framework secrets --compact
secrets scan results:
Passed checks: 0, Failed checks: 2, Skipped checks: 0
Check: CKV_SECRET_6: "Base64 High Entropy String" FAILED for resource: cbfdac6008f9cab4083784cbd1874f76618d2a97 File: /ansible/playbook.yml:12-13
Check: CKV_SECRET_6: "Base64 High Entropy String" FAILED for resource: cbfdac6008f9cab4083784cbd1874f76618d2a97 File: /terraform/main.tf:69-70Types de secrets détectés
Section intitulée « Types de secrets détectés »Checkov reconnaît automatiquement de nombreux types de secrets :
| Check ID | Type de secret | Exemple de pattern |
|---|---|---|
| CKV_SECRET_2 | AWS Access Key | AKIA... |
| CKV_SECRET_6 | Chaîne haute entropie Base64 | Mots de passe, tokens |
| CKV_SECRET_13 | Clé privée | -----BEGIN RSA PRIVATE KEY----- |
| CKV_SECRET_14 | Token Slack | xoxb-..., xoxp-... |
| CKV_SECRET_17 | Clé Stripe | sk_live_..., rk_live_... |
| CKV_SECRET_19 | Chaîne haute entropie Hex | Tokens hexadécimaux |
Pour chaque mauvaise pratique détectée, Checkov indique comment la corriger et fournit un lien vers la documentation détaillée.

Génération de rapports
Section intitulée « Génération de rapports »Une fois l’analyse effectuée avec Checkov, les résultats sont présentés sous forme de rapports détaillés. Ces rapports identifient les mauvaises configurations et les vulnérabilités dans votre code IaC. Par défaut, les résultats apparaissent dans la console avec une explication pour chaque règle violée, comprenant un identifiant de la règle, une description du problème et le fichier ou la ressource affectée.
Formats de sortie disponibles
Section intitulée « Formats de sortie disponibles »Checkov supporte de nombreux formats d’export pour s’intégrer dans vos outils :
| Format | Option | Usage principal |
|---|---|---|
| CLI (défaut) | -o cli | Affichage console lisible |
| JSON | -o json | Intégration avec d’autres outils |
| SARIF | -o sarif | GitHub Code Scanning, Azure DevOps |
| JUnit XML | -o junitxml | Jenkins, GitLab CI |
| CSV | -o csv | Excel, Google Sheets |
| CycloneDX | -o cyclonedx | SBOM |
| GitHub | -o github_failed_only | Annotations dans les PR |
Exemples d’utilisation :
# Export JSON pour analysecheckov -d ./projet -o json > rapport.json
# Plusieurs formats à la foischeckov -d ./projet -o cli -o sarif --output-file-path console,results.sarif
# Format compact (sans afficher le code)checkov -d ./projet --compact
# Afficher uniquement les échecscheckov -d ./projet --quietComprendre le résultat JSON
Section intitulée « Comprendre le résultat JSON »{ "passed": 45, "failed": 12, "skipped": 3, "parsing_errors": 0, "resource_count": 60, "checkov_version": "3.2.495"}Le rapport distingue trois catégories :
- PASSED : Ressources conformes aux règles de sécurité
- FAILED : Problèmes de sécurité à corriger
- SKIPPED : Règles ignorées via commentaires ou CLI
Gestion des faux positifs et suppressions
Section intitulée « Gestion des faux positifs et suppressions »Dans certains cas, Checkov identifie des problèmes qui ne sont pas pertinents pour votre contexte (faux positifs). Pour ces situations, plusieurs mécanismes existent.
Suppression en ligne de commande
Section intitulée « Suppression en ligne de commande »Pour ignorer certaines règles lors de l’exécution :
# Ignorer une règle spécifiquecheckov -d ./projet --skip-check CKV_AWS_20
# Ignorer plusieurs règlescheckov -d ./projet --skip-check CKV_AWS_20,CKV_AWS_21
# Ignorer une catégorie entièrecheckov -d ./projet --skip-check LOWSuppression inline par framework
Section intitulée « Suppression inline par framework »Chaque framework utilise sa propre syntaxe de commentaire :
Terraform (HCL) :
resource "aws_s3_bucket" "example" { # checkov:skip=CKV_AWS_20: Bucket interne non exposé à Internet bucket = "mon-bucket-interne"}Kubernetes (YAML) :
apiVersion: v1kind: Podmetadata: name: test-pod annotations: checkov.io/skip1: "CKV_K8S_40=Pas de ressources pour cet environnement de test"spec: containers: - name: app image: nginx:1.25Dockerfile :
# checkov:skip=CKV_DOCKER_2: Image de base mise à jour via pipelineFROM ubuntu:22.04
# checkov:skip=CKV_DOCKER_3: Utilisateur défini dans entrypointUSER rootCloudFormation (YAML) :
Resources: MyBucket: # checkov:skip=CKV_AWS_18: Logs stockés dans un bucket dédié Type: AWS::S3::BucketFichier de baseline
Section intitulée « Fichier de baseline »Pour les projets existants avec beaucoup de violations, créez une baseline :
# Créer la baselinecheckov -d ./projet --create-baseline
# Utiliser la baseline (ignore les violations connues)checkov -d ./projet --baseline baseline.jsonLa baseline contient un hash des violations existantes. Seules les nouvelles violations seront signalées.
Configuration avec un fichier YAML
Section intitulée « Configuration avec un fichier YAML »Pour des projets récurrents, un fichier de configuration évite de répéter les
options en ligne de commande. Checkov recherche automatiquement .checkov.yaml
ou .checkov.yml dans le répertoire courant.
Exemple de configuration complète
Section intitulée « Exemple de configuration complète »# Répertoire à analyserdirectory: - ./infrastructure - ./kubernetes
# Frameworks à analyserframework: - terraform - kubernetes - dockerfile
# Règles à ignorer globalementskip-check: - CKV_AWS_20 # Bucket public (géré autrement) - CKV_K8S_40 # Ressources (environnement de dev)
# Règles à exécuter (si défini, seules celles-ci sont lancées)# check:# - CKV_AWS_18# - CKV_AWS_21
# Télécharger les modules Terraform externesdownload-external-modules: trueexternal-modules-download-path: .external_modules
# Format de sortieoutput: - cli - json
# Fichier de sortie pour JSON/SARIFoutput-file-path: reports/checkov-report
# Options diversescompact: truesoft-fail: false # true = ne pas échouer le pipelineGénérer une configuration
Section intitulée « Générer une configuration »Pour générer un fichier de configuration à partir de vos options actuelles :
checkov -d ./projet --skip-check CKV_AWS_20 --create-config .checkov.yamlPour visualiser la configuration active (ligne de commande + fichier + env) :
checkov --show-configCréation de politiques personnalisées
Section intitulée « Création de politiques personnalisées »Les +800 règles intégrées ne couvrent pas tous les cas. Checkov permet de créer des politiques adaptées à vos normes internes.
Politique en Python
Section intitulée « Politique en Python »Voici une règle qui vérifie que les instances EC2 utilisent un type autorisé :
from checkov.common.models.enums import CheckResult, CheckCategoriesfrom checkov.terraform.checks.resource.base_resource_check import BaseResourceCheck
class EC2InstanceTypeCheck(BaseResourceCheck): def __init__(self): name = "Ensure EC2 instances use approved instance types" id = "CKV_CUSTOM_01" supported_resources = ["aws_instance"] categories = [CheckCategories.GENERAL_SECURITY] super().__init__( name=name, id=id, categories=categories, supported_resources=supported_resources )
def scan_resource_conf(self, conf): # Types autorisés dans votre organisation allowed_types = ["t3.micro", "t3.small", "t3.medium"]
instance_type = conf.get("instance_type", [None])[0] if instance_type in allowed_types: return CheckResult.PASSED return CheckResult.FAILED
# Instancier pour enregistrer la règlecheck = EC2InstanceTypeCheck()Exécution avec les règles personnalisées :
checkov -d ./projet --external-checks-dir ./checksPolitique en YAML (plus simple)
Section intitulée « Politique en YAML (plus simple) »Pour des vérifications simples, le format YAML suffit :
metadata: id: "CKV_CUSTOM_02" name: "Ensure S3 buckets have encryption enabled" category: "ENCRYPTION"
definition: cond_type: "attribute" resource_types: - "aws_s3_bucket" attribute: "server_side_encryption_configuration" operator: "exists"checkov -d ./projet --external-checks-dir ./policiesBonnes pratiques
Section intitulée « Bonnes pratiques »- Préfixez vos IDs avec
CKV_CUSTOM_ouCKV_<ENTREPRISE>_ - Documentez chaque règle avec un
nameexplicite - Versionnez vos règles personnalisées dans un repo dédié
- Testez les règles sur des exemples avant déploiement
À retenir
Section intitulée « À retenir »- Shift-left security : Checkov détecte les problèmes dans votre IDE ou CI, pas en production
- +800 règles prêtes à l’emploi : AWS, Azure, GCP, Kubernetes, Docker… couverture immédiate sans configuration
- Zéro excuse pour les secrets : la détection automatique évite les fuites de credentials dans Git
- Faux positifs gérables : suppressions inline, baselines et fichier de config pour adapter à votre contexte
- Extensible : créez vos propres règles en Python ou YAML pour vos normes internes
Checkov s’intègre en quelques minutes dans n’importe quel pipeline CI/CD. Le retour sur investissement est immédiat : chaque mauvaiseconfiguration détectée avant le déploiement évite une potentielle brèche de sécurité.
Plus d’infos
Section intitulée « Plus d’infos »- Site officiel Checkov — Documentation complète
- Quick Start — Démarrage rapide
- CLI Reference — Options en ligne de commande
- Policy Index — Liste des +800 règles
- Custom Policies — Politiques personnalisées
- GitHub Checkov — Code source
- Slack Community — Communauté d’entraide
Questions fréquentes
Section intitulée « Questions fréquentes »Checkov est un outil open source d'analyse statique développé par Bridgecrew (Palo Alto Networks) qui scanne votre Infrastructure as Code (IaC) pour détecter les mauvaises configurations de sécurité et de conformité.
Frameworks supportés
| Framework | Types de fichiers |
|---|---|
| Terraform | .tf, .tfvars |
| CloudFormation | .yaml, .json, .template |
| Kubernetes | Manifests YAML |
| Helm | Charts |
| ARM | Templates Azure |
| Dockerfile | Configuration conteneur |
| Serverless | serverless.yml |
| GitHub Actions | Workflows CI/CD |
| GitLab CI | .gitlab-ci.yml |
Ce que Checkov détecte
- Mauvaises configurations : buckets S3 publics, ports exposés, chiffrement désactivé
- Violations de conformité : CIS, SOC2, HIPAA, PCI-DSS, GDPR
- Secrets exposés : clés API, mots de passe dans le code
- Vulnérabilités connues : CVE dans les images conteneurs
Exemple rapide
# Scanner un répertoire Terraform
checkov -d ./terraform/
# Scanner un fichier spécifique
checkov -f main.tf
Checkov s'installe facilement via plusieurs méthodes selon votre environnement.
Installation pip (recommandé)
# Installation globale
pip install checkov
# Installation dans un environnement virtuel
python -m venv venv
source venv/bin/activate
pip install checkov
# Mise à jour
pip install --upgrade checkov
Installation Homebrew (macOS)
brew install checkov
Installation Docker
# Scan sans installation locale
docker run --tty --rm \
--volume $(pwd):/tf \
bridgecrew/checkov \
--directory /tf
Vérification
checkov --version
# checkov 3.x.x
Comparaison des méthodes
| Méthode | Avantages | Inconvénients |
|---|---|---|
| pip | Complet, facile à mettre à jour | Nécessite Python |
| Homebrew | Simple sur macOS | macOS uniquement |
| Docker | Aucune installation | Plus lent, verbeux |
Commandes de base
# Scanner un répertoire
checkov -d ./terraform/
# Scanner un fichier spécifique
checkov -f main.tf
# Scanner avec Terraform Plan (plus précis)
terraform init
terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
checkov -f tfplan.json
Options utiles
# Afficher uniquement les échecs
checkov -d . --compact
# Filtrer par sévérité
checkov -d . --check CRITICAL,HIGH
# Exclure des checks
checkov -d . --skip-check CKV_AWS_20,CKV_AWS_21
# Scanner uniquement Terraform
checkov -d . --framework terraform
Exemple de sortie
Passed checks: 42, Failed checks: 3, Skipped checks: 2
Check: CKV_AWS_21: "Ensure S3 bucket has versioning enabled"
FAILED for resource: aws_s3_bucket.data
File: /main.tf:15-25
Guide: https://docs.prismacloud.io/...
Checks Terraform courants
| Check ID | Description |
|---|---|
CKV_AWS_19 |
S3 bucket encryption |
CKV_AWS_20 |
S3 bucket private |
CKV_AWS_21 |
S3 versioning |
CKV_AWS_23 |
Security group egress |
Comparaison des outils
| Critère | Checkov | Trivy | tfsec |
|---|---|---|---|
| Éditeur | Bridgecrew/Palo Alto | Aqua Security | Aqua (abandonné) |
| Focus | IaC spécialisé | Polyvalent | Terraform only |
| Règles IaC | 1000+ | ~800 | ~150 |
| Images conteneurs | Basique | Complet | Non |
| SBOM | Non | Oui | Non |
| Secrets | Oui | Oui | Non |
| Kubernetes runtime | Non | Trivy Operator | Non |
| Custom policies | Python + YAML | Rego | HCL |
| Statut | Actif | Actif | Fusionné dans Trivy |
Quand utiliser quoi ?
- Checkov : équipes focalisées sur l'IaC, besoin de nombreuses règles prédéfinies, intégration Prisma Cloud
- Trivy : approche unifiée (images + IaC + secrets), équipes DevSecOps complètes
- Les deux : cross-check pour maximiser la couverture
Exemple de cross-check
# Combiner les deux pour plus de couverture
checkov -d ./terraform/ -o json > checkov.json
trivy config ./terraform/ -f json > trivy.json
Suppression dans le code (recommandé)
Terraform
resource "aws_s3_bucket" "public_assets" {
# checkov:skip=CKV_AWS_20:Bucket public intentionnel pour assets statiques
bucket = "my-public-assets"
acl = "public-read"
}
CloudFormation
Resources:
MyBucket:
Type: 'AWS::S3::Bucket'
# checkov:skip=CKV_AWS_20:Bucket public requis
Properties:
BucketName: public-bucket
Kubernetes
apiVersion: v1
kind: Pod
metadata:
annotations:
checkov.io/skip1: "CKV_K8S_40=Root user nécessaire pour init"
Suppression en CLI
# Exclure des checks spécifiques
checkov -d . --skip-check CKV_AWS_20,CKV_AWS_21
# Exclure un framework entier
checkov -d . --skip-framework secrets
Bonnes pratiques
| Pratique | Pourquoi |
|---|---|
| Documenter la raison | Audit trail, revue de sécurité |
| Préférer inline | Versionné avec le code |
| Revue régulière | Les exceptions peuvent devenir obsolètes |
| Limiter les skip CLI | Difficile à auditer |
Les règles YAML sont idéales pour des vérifications d'attributs simples sans écrire de Python.
Structure d'une règle YAML
# custom_checks/s3_naming.yaml
metadata:
id: "CKV_CUSTOM_1"
name: "Ensure S3 bucket name follows convention"
guideline: "Bucket names must start with company prefix"
severity: "MEDIUM"
scope:
provider: "aws"
definition:
cond_type: "attribute"
resource_types:
- "aws_s3_bucket"
attribute: "bucket"
operator: "starting_with"
value: "mycompany-"
Opérateurs disponibles
| Opérateur | Description |
|---|---|
exists |
L'attribut existe |
not_exists |
L'attribut n'existe pas |
equals |
Valeur exacte |
not_equals |
Différent de |
contains |
Contient la valeur |
starting_with |
Commence par |
ending_with |
Se termine par |
regex_match |
Correspond à une regex |
Utilisation
# Charger les règles personnalisées
checkov -d ./terraform/ --external-checks-dir ./custom_checks/
# Vérifier que la règle est chargée
checkov --list | grep CKV_CUSTOM
Workflow basique
# .github/workflows/checkov.yml
name: Checkov Security Scan
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
checkov:
runs-on: ubuntu-latest
name: Checkov Scan
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Run Checkov
uses: bridgecrewio/checkov-action@master
with:
directory: ./terraform/
framework: terraform
quiet: true
soft_fail: false
output_format: sarif
output_file_path: checkov.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: checkov.sarif
Options de l'action
| Option | Description |
|---|---|
directory |
Répertoire à scanner |
framework |
terraform, kubernetes, cloudformation... |
quiet |
Afficher uniquement les échecs |
soft_fail |
Ne pas échouer le job si violations |
skip_check |
Checks à ignorer |
output_format |
cli, json, sarif, junitxml |
Résultat
Les violations apparaissent dans l'onglet Security > Code scanning alerts de GitHub.
Configuration GitLab CI
# .gitlab-ci.yml
stages:
- security
checkov:
stage: security
image:
name: bridgecrew/checkov:latest
entrypoint:
- '/usr/bin/env'
- 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
allow_failure: true
rules:
- if: $CI_COMMIT_BRANCH
exists:
- '**/*.tf'
- '**/*.yaml'
- '**/*.yml'
script:
- checkov -d . --output junitxml > checkov.xml || true
- checkov -d . --compact
artifacts:
reports:
junit: checkov.xml
when: always
Options avancées
checkov:
stage: security
image:
name: bridgecrew/checkov:latest
entrypoint: ['']
variables:
BC_API_KEY: $PRISMA_CLOUD_API_KEY # Optionnel: Prisma Cloud
script:
- |
checkov -d . \
--framework terraform,kubernetes \
--skip-check CKV_AWS_20 \
--output json > checkov.json
- cat checkov.json | jq '.results.failed_checks | length'
artifacts:
paths:
- checkov.json
Bonnes pratiques
- Utiliser
allow_failure: trueen développement - Passer à
allow_failure: falseen production - Conserver les artifacts pour analyse
Formats disponibles
| Format | Usage | Commande |
|---|---|---|
cli |
Terminal (défaut) | --output cli |
json |
Automatisation, API | --output json |
sarif |
GitHub Security, Azure DevOps | --output sarif |
junitxml |
CI/CD (Jenkins, GitLab) | --output junitxml |
csv |
Excel, reporting | --output csv |
cyclonedx |
SBOM | --output cyclonedx |
github_failed_only |
Annotations PR | --output github_failed_only |
Exemples
# Sortie JSON pour traitement
checkov -d . -o json > checkov.json
# SARIF pour GitHub Security
checkov -d . -o sarif > checkov.sarif
# JUnit XML pour CI/CD
checkov -d . -o junitxml > checkov.xml
# Plusieurs formats simultanés
checkov -d . -o cli -o json -o sarif
# Écrire dans un fichier
checkov -d . --output-file-path results/ -o json -o sarif
Format JSON (structure)
{
"passed": 42,
"failed": 3,
"skipped": 2,
"results": {
"passed_checks": [...],
"failed_checks": [
{
"check_id": "CKV_AWS_20",
"resource": "aws_s3_bucket.data",
"file_path": "/main.tf"
}
]
}
}
Commandes de base
# Scanner un répertoire de manifests
checkov -d ./k8s/
# Scanner uniquement Kubernetes
checkov --framework kubernetes -d .
# Scanner un fichier spécifique
checkov -f deployment.yaml
# Scanner des charts Helm
checkov --framework helm -d ./charts/
Problèmes détectés
| Check ID | Description |
|---|---|
CKV_K8S_1 |
Privilèges élevés (privileged: true) |
CKV_K8S_8 |
Limits CPU/mémoire manquants |
CKV_K8S_14 |
Image avec tag :latest |
CKV_K8S_20 |
Root user dans conteneur |
CKV_K8S_21 |
Système de fichiers non read-only |
CKV_K8S_22 |
hostNetwork activé |
CKV_K8S_28 |
Capabilities non droppées |
Exemple de sortie
Check: CKV_K8S_20: "Containers should not run as root"
FAILED for resource: Deployment.default.nginx
File: /deployment.yaml:1-25
Check: CKV_K8S_8: "Liveness and Readiness probes should be configured"
FAILED for resource: Deployment.default.nginx
Suppression inline
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
annotations:
checkov.io/skip1: "CKV_K8S_20=Init container requires root"
Créer un fichier de configuration
# Générer un template
checkov --create-config .checkov.yaml
Structure du fichier
# .checkov.yaml
branch: main
compact: true
directory:
- ./terraform/
- ./kubernetes/
external-checks-dir:
- ./custom_checks/
framework:
- terraform
- kubernetes
- dockerfile
quiet: true
repo-id: myorg/myrepo
soft-fail: false
skip-check:
- CKV_AWS_20 # S3 public intentionnel
- CKV_K8S_20 # Root requis pour init
skip-framework:
- secrets
download-external-modules: true
evaluate-variables: true
Utilisation
# Checkov détecte automatiquement .checkov.yaml
checkov
# Ou spécifier explicitement
checkov --config-file .checkov.yaml
# Surcharger une option
checkov --config-file .checkov.yaml --soft-fail
Priorité des options
1. Arguments CLI (priorité haute)
2. Variables d'environnement (CKV_*)
3. Fichier de configuration
4. Valeurs par défaut (priorité basse)
Bonnes pratiques
- Committer
.checkov.yamlavec le code - Documenter les
skip-checkavec commentaires - Utiliser
soft-fail: trueen développement
Faux positifs
# Documenter et skipper
resource "aws_s3_bucket" "logs" {
# checkov:skip=CKV_AWS_18:Logging bucket - pas de logs sur lui-même
bucket = "my-logs-bucket"
}
Modules Terraform non résolus
# Télécharger les modules distants
checkov -d . --download-external-modules true
# Ou d'abord init Terraform
terraform init
checkov -d .
Erreurs de parsing
# Valider la syntaxe Terraform d'abord
terraform validate
# Scanner avec verbose pour debug
checkov -d . --log-level DEBUG
Variables non résolues
# Activer l'évaluation des variables
checkov -d . --evaluate-variables true
# Fournir un fichier de variables
checkov -d . --var-file terraform.tfvars
Problèmes courants
| Problème | Solution |
|---|---|
| Module not found | --download-external-modules true |
| Variable undefined | --evaluate-variables true |
| Trop de checks | --check HIGH,CRITICAL |
| CI trop lent | --compact --quiet |
| Version obsolète | pip install --upgrade checkov |
Créer une baseline
# Générer la baseline (ignorer l'existant)
checkov -d . --create-baseline
# Scanner en utilisant la baseline
checkov -d . --baseline baseline.json