
Strumento di analisi statica per infrastruttura come codice che rileva configurazioni errate del cloud, vulnerabilità e segreti attraverso Terraform, Kubernetes, CloudFormation e immagini contenitore durante la fase di build.
Checkov è uno strumento di analisi statica del codice per infrastructure as code (IaC) e anche uno strumento di software composition analysis (SCA) per immagini e pacchetti open source.
Analizza l'infrastruttura cloud predisposta utilizzando Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates, o OpenTofu e rileva misconfigurazioni di sicurezza e conformità utilizzando una scansione basata su grafo.
Esegue una Software Composition Analysis (SCA) scanning che consiste in un'analisi di pacchetti open source e immagini per Common Vulnerabilities and Exposures (CVE).
Checkov alimenta anche Prisma Cloud Application Security, la piattaforma incentrata sugli sviluppatori che codifica e semplifica la sicurezza cloud lungo tutto il ciclo di sviluppo. Prisma Cloud identifica, corregge e previene le misconfigurazioni nelle risorse cloud e nei file infrastructure-as-code.
Risultati scansione in CLI

Risultato scansione pianificata in Jenkins

Per installare pip segui la documentazione ufficiale```sh pip3 install checkov
Alcuni ambienti (ad esempio, Debian 12) potrebbero richiedere di installare Checkov in un ambiente virtuale.```sh
# Create and activate a virtual environment
python3 -m venv /path/to/venv/checkov
cd /path/to/venv/checkov
source ./bin/activate
# Install Checkov with pip
pip install checkov
# Optional: Create a symlink for easy access
sudo ln -s /path/to/venv/checkov/bin/checkov /usr/local/bin/checkov
o con Homebrew (macOS o Linux)```sh brew install checkov
### Abilitare l'autocompletamento bash```sh
source <(register-python-argcomplete checkov)
se hai installato checkov con pip3```sh pip3 install -U checkov
o con Homebrew```sh
brew upgrade checkov
checkov --directory /user/path/to/iac/code
Oppure un file o file specifici```sh
checkov --file /user/tf/example.tf
O```sh checkov -f /user/cloudformation/example1.yml -f /user/cloudformation/example2.yml
Oppure un file plan di terraform in formato json```sh
terraform init
terraform plan -out tf.plan
terraform show -json tf.plan > tf.json
checkov -f tf.json
Nota: il file di output tf.json di terraform show sarà una singola riga. Per questo motivo tutti i risultati verranno riportati con numero di riga 0 da Checkov```sh
check: CKV_AWS_21: "Ensure all data stored in the S3 bucket have versioning enabled"
FAILED for resource: aws_s3_bucket.customer
File: /tf/tf.json:0-0
Guide: https://docs.prismacloud.io/en/enterprise-edition/policy-reference/aws-policies/s3-policies/s3-16-enable-versioning
Se hai installato `jq` puoi convertire un file json in più righe con il seguente comando:```sh
terraform show -json tf.plan | jq '.' > tf.json
Il risultato della scansione sarebbe molto più facile da usare.```sh checkov -f tf.json Check: CKV_AWS_21: "Ensure all data stored in the S3 bucket have versioning enabled" FAILED for resource: aws_s3_bucket.customer File: /tf/tf1.json:224-268 Guide: https://docs.prismacloud.io/en/enterprise-edition/policy-reference/aws-policies/s3-policies/s3-16-enable-versioning
225 | "values": {
226 | "acceleration_status": "",
227 | "acl": "private",
228 | "arn": "arn:aws:s3:::mybucket",
In alternativa, specifica la root del repository dei file hcl utilizzati per generare il file di piano, usando il flag `--repo-root-for-plan-enrichment`, per arricchire l'output con il percorso file appropriato, i numeri di riga e il blocco di codice della/e risorsa/e. Un ulteriore vantaggio è che le soppressioni dei controlli verranno gestite di conseguenza.```sh
checkov -f tf.json --repo-root-for-plan-enrichment /user/path/to/iac/code
Passed Checks: 1, Failed Checks: 1, Suppressed Checks: 0 Check: "Ensure all data stored in the S3 bucket is securely encrypted at rest" /main.tf: Passed for resource: aws_s3_bucket.template_bucket Check: "Ensure all data stored in the S3 bucket is securely encrypted at rest" /../regionStack/main.tf: Failed for resource: aws_s3_bucket.sls_deployment_bucket_name
Inizia a usare Checkov leggendo la pagina [Getting Started](https://github.com/bridgecrewio/checkov/blob/main/docs/1.Welcome/Quick%20Start.md).
### Usare Docker```sh
docker pull bridgecrew/checkov
docker run --tty --rm --volume /user/tf:/tf --workdir /tf bridgecrew/checkov --directory /tf
Nota: se stai usando Python 3.6 (versione predefinita in Ubuntu 18.04) checkov non funzionerà e fallirà con il messaggio di errore ModuleNotFoundError: No module named 'dataclasses'. In questo caso, puoi usare la versione docker.
Nota che in alcuni casi reindirizzare l'output di docker run --tty in un file - ad esempio, se si vuole salvare l'output JUnit di Checkov in un file - causerà la stampa di caratteri di controllo extra. Questo può rompere il parsing del file. Se incontri questo problema, rimuovi il flag --tty.
Il flag --workdir /tf è opzionale per cambiare la directory di lavoro nel volume montato. Se stai usando l'output SARIF -o sarif, questo produrrà il file results.sarif nel volume montato (/user/tf nell'esempio precedente). Se non includi quel flag, la directory di lavoro sarà "/".
Utilizzando i flag da riga di comando, puoi specificare di eseguire solo controlli nominati (allow list) o eseguire tutti i controlli tranne quelli elencati (deny list). Se stai usando l'integrazione con la piattaforma tramite chiave API, puoi anche specificare una soglia di gravità per saltare e/o includere. Inoltre, poiché i file json non possono contenere commenti, è possibile passare un pattern regex per saltare la scansione dei segreti nei file json.
Consulta la documentazione per informazioni più dettagliate su come questi flag funzionano insieme.
Consente l'esecuzione solo dei due controlli specificati:```sh checkov --directory . --check CKV_AWS_20,CKV_AWS_57
Esegui tutti i controlli tranne quello specificato:```sh
checkov -d . --skip-check CKV_AWS_20
Esegui tutti i controlli eccetto quelli con pattern specificati:```sh checkov -d . --skip-check CKV_AWS*
Esegui tutti i controlli con gravità MEDIA o superiore (richiede chiave API):```sh
checkov -d . --check MEDIUM --bc-api-key ...
Esegui tutti i controlli con gravità MEDIUM o superiore, così come il controllo CKV_123 (assumi che questo sia un controllo di gravità LOW):```sh checkov -d . --check MEDIUM,CKV_123 --bc-api-key ...
Salta tutti i controlli con gravità MEDIUM o inferiore:```sh
checkov -d . --skip-check MEDIUM --bc-api-key ...
Salta tutti i controlli con gravità MEDIA o inferiore, così come il controllo CKV_789 (supponendo che sia un controllo ad alta gravità):```sh checkov -d . --skip-check MEDIUM,CKV_789 --bc-api-key ...
Esegui tutti i controlli che hanno gravità MEDIUM o superiore, ma salta il controllo CKV_123 (si assume che questa sia una gravità MEDIUM o superiore):```sh
checkov -d . --check MEDIUM --skip-check CKV_123 --bc-api-key ...
Esegui il controllo CKV_789, ma saltalo se è di gravità media (la logica di --check viene sempre applicata prima di --skip-check)```sh checkov -d . --skip-check MEDIUM --check CKV_789 --bc-api-key ...
Per i carichi di lavoro Kubernetes, puoi anche utilizzare spazi dei nomi allow/deny. Ad esempio, non riportare alcun risultato per lo
spazio dei nomi kube-system:```sh
checkov -d . --skip-check kube-system
Esegui una scansione di un'immagine container. Prima, scarica o crea l'immagine, poi fai riferimento ad essa tramite l'hash, l'ID o nome:tag:```sh checkov --framework sca_image --docker-image sha256:1234example --dockerfile-path /Users/path/to/Dockerfile --repo-id ... --bc-api-key ...
checkov --docker-image :tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
Puoi anche usare il flag --image per scansionare l'immagine del contenitore invece di --docker-image per shortener:```sh
checkov --image <image-name>:tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
Esegui una scansione SCA dei pacchetti in un repo:```sh checkov -d . --framework sca_package --bc-api-key ... --repo-id <repo_id(arbitrary)>
Eseguire una scansione di una directory con variabili d'ambiente che rimuovono il buffering, aggiungendo log di livello debug:```sh
PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG checkov -d .
OPPURE abilita le variabili d'ambiente per più esecuzioni```sh export PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG checkov -d .
Esegui la scansione dei segreti su tutti i file in MyDirectory. Salta il controllo CKV_SECRET_6 sui file json il cui suffisso è DontScan```sh
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:.*DontScan.json$
Esegui la scansione dei segreti su tutti i file in MyDirectory. Salta il controllo CKV_SECRET_6 sui file json che contengono "skip_test" nel percorso.```sh checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:.*skip_test.*json$
È possibile mascherare valori dai risultati di scansione fornendo un file di configurazione (usando il flag --config-file) con una voce di mascheramento. Il mascheramento può applicarsi a risorsa & valore (o più valori, separati da una virgola). Esempi:```sh
mask:
- aws_instance:user_data
- azurerm_key_vault_secret:admin_password,user_passwords
Nell'esempio sopra, i seguenti valori saranno mascherati:
Come qualsiasi strumento di analisi statica, è limitato dal suo ambito di analisi. Ad esempio, se una risorsa è gestita manualmente o utilizzando strumenti di gestione della configurazione successivi, la soppressione può essere inserita come una semplice annotazione del codice.
Per saltare un controllo su un dato blocco di definizione Terraform o risorsa CloudFormation, applicare il seguente modello di commento all'interno del suo ambito:
checkov:skip=<check_id>:<suppression_comment>
<check_id> è uno degli [scanner di controllo disponibili](docs/5.Policy Index/all.md)<suppression_comment> è un motivo opzionale di soppressione da includere nell'outputIl seguente commento salta il controllo CKV_AWS_20 sulla risorsa identificata da foo-bucket, dove la scansione verifica se un bucket S3 di AWS è privato.
Nell'esempio, il bucket è configurato con accesso in lettura pubblico; aggiungendo il commento di soppressione si saltarebbe il controllo appropriato invece di far fallire il controllo.```hcl-terraform
resource "aws_s3_bucket" "foo-bucket" {
region = var.region
#checkov:skip=CKV_AWS_20:The bucket is a public static content host
bucket = local.bucket_name
force_destroy = true
acl = "public-read"
}
L'output ora conterrebbe una voce di risultato del controllo ``SKIPPED``:```bash
...
...
Check: "S3 Bucket has an ACL defined which allows public access."
SKIPPED for resource: aws_s3_bucket.foo-bucket
Suppress comment: The bucket is a public static content host
File: /example_skip_acl.tf:1-25
...
Per saltare più controlli, aggiungi ciascuno come nuova riga.``` #checkov:skip=CKV2_AWS_6 #checkov:skip=CKV_AWS_20:The bucket is a public static content host
Per sopprimere i controlli nei manifest Kubernetes, vengono utilizzate annotazioni con il seguente formato:
`checkov.io/skip#: <check_id>=<suppression_comment>`
Per esempio:```bash
apiVersion: v1
kind: Pod
metadata:
name: mypod
annotations:
checkov.io/skip1: CKV_K8S_20=I don't care about Privilege Escalation :-O
checkov.io/skip2: CKV_K8S_14
checkov.io/skip3: CKV_K8S_11=I have not set CPU limits as I want BestEffort QoS
spec:
containers:
...
Per una registrazione dettagliata su stdout, imposta la variabile d'ambiente LOG_LEVEL su DEBUG.
Il valore predefinito è LOG_LEVEL=WARNING.
Per ignorare file o directory, usa l'argomento --skip-path, che può essere specificato più volte. Questo argomento accetta espressioni regolari per percorsi relativi alla directory di lavoro corrente. Puoi usarlo per ignorare intere directory e/o file specifici.
Per impostazione predefinita, vengono ignorate tutte le directory chiamate node_modules, .terraform e .serverless, oltre a tutti i file o directory che iniziano con ..
Per annullare l'ignoranza delle directory che iniziano con ., sovrascrivi la variabile d'ambiente CKV_IGNORE_HIDDEN_DIRECTORIES con export CKV_IGNORE_HIDDEN_DIRECTORIES=false
Puoi sovrascrivere il set predefinito di directory da ignorare impostando la variabile d'ambiente CKV_IGNORED_DIRECTORIES.
Nota che se vuoi preservare questa lista e aggiungerla, devi includere questi valori. Ad esempio, CKV_IGNORED_DIRECTORIES=mynewdir ignorerà solo quella directory, ma non le altre menzionate sopra. Questa variabile è una funzionalità legacy; consigliamo di usare il flag --skip-file.
L'output della console è a colori per impostazione predefinita; per passare a un output monocromatico, imposta la variabile d'ambiente:
ANSI_COLORS_DISABLED
Se vuoi usare Checkov all'interno di VS Code, prova l'estensione Prisma Cloud.
Checkov può essere configurato utilizzando un file di configurazione YAML. Per impostazione predefinita, checkov cerca un file .checkov.yaml o .checkov.yml nei seguenti luoghi in ordine di precedenza:
--directory)Attenzione: è una buona pratica che il file di configurazione di checkov venga caricato da una fonte attendibile composta da un'identità verificata, in modo che i file scansionati, gli ID dei controlli e i controlli personalizzati caricati siano come desiderato.
Gli utenti possono anche passare il percorso di un file di configurazione tramite la riga di comando. In questo caso, gli altri file di configurazione verranno ignorati. Per esempio:```sh checkov --config-file path/to/config.yaml
Gli utenti possono anche creare un file di configurazione usando il comando `--create-config`, che prende gli attuali argomenti della riga di comando e li scrive in un percorso specificato. Per esempio:```sh
checkov --compact --directory test-dir --docker-image sample-image --dockerfile-path Dockerfile --download-external-modules True --external-checks-dir sample-dir --quiet --repo-id prisma-cloud/sample-repo --skip-check CKV_DOCKER_3,CKV_DOCKER_2 --skip-framework dockerfile secrets --soft-fail --branch develop --check CKV_DOCKER_1 --create-config /Users/sample/config.yml
Creerà un file config.yaml che assomiglia a questo:```yaml
branch: develop
check:
Gli utenti possono anche usare il flag `--show-config` per visualizzare tutti gli args e le impostazioni e la loro provenienza, ovvero riga di comando, file di configurazione, variabile d'ambiente o default. Per esempio:```sh
checkov --show-config
Mostrerà:```sh Command Line Args: --show-config Environment Variables: BC_API_KEY: your-api-key Config File (/Users/sample/.checkov.yml): soft-fail: False branch: master skip-check: ['CKV_DOCKER_3', 'CKV_DOCKER_2'] Defaults: --output: cli --framework: ['all'] --download-external-modules:False --external-modules-download-path:.external_modules --evaluate-variables:True
## Contribuire
I contributi sono benvenuti!
Inizia rivedendo le [linee guida per i contributi](https://github.com/bridgecrewio/checkov/blob/main/CONTRIBUTING.md). Dopodiché, dai un'occhiata a una [buona prima issue](https://github.com/bridgecrewio/checkov/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22).
Puoi persino iniziare con uno sviluppo con un clic nel tuo browser tramite Gitpod al seguente link:
[](https://gitpod.io/#https://github.com/bridgecrewio/checkov)
Desideri contribuire con nuovi controlli? Scopri come scrivere un nuovo controllo (noto anche come policy) [qui](https://github.com/bridgecrewio/checkov/blob/main/docs/6.Contribution/Contribution%20Overview.md).
## Dichiarazione di non responsabilità
`checkov` non salva, pubblica o condivide con nessuno informazioni identificabili dei clienti.
Nessuna informazione identificabile dei clienti viene utilizzata per interrogare le guide accessibili pubblicamente di Prisma Cloud.
`checkov` utilizza l'API di Prisma Cloud per arricchire i risultati con collegamenti alle guide di remediation.
Per saltare questa chiamata API, utilizza il flag `--skip-download`.
## Supporto
[Prisma Cloud](https://www.prismacloud.io/?utm_source=github&utm_medium=organic_oss&utm_campaign=checkov) costruisce e mantiene Checkov per rendere la policy-as-code semplice e accessibile.
Inizia con la nostra [Documentazione](https://www.checkov.io/1.Welcome/Quick%20Start.html) per tutorial rapidi ed esempi.
## Supporto Versioni Python
Seguiamo il ciclo di supporto ufficiale di Python e utilizziamo test automatizzati per le versioni supportate di Python.
Ciò significa che attualmente supportiamo Python 3.9 - 3.13, inclusi.
Nota che Python 3.8 ha raggiunto la fine del ciclo di vita (EOL) nell'ottobre 2024 e Python 3.9 raggiungerà l'EOL nell'ottobre 2025.
Se incontri problemi con qualsiasi versione di Python non EOL, apri una Issue.