Checkov ist ein statisches Code-Analysetool für Infrastructure as Code (IaC) und auch ein Software-Kompositionsanalyse-Tool (SCA) für Bilder und Open-Source-Pakete.
Es scannt die Cloud-Infrastruktur, die mit Terraform, Terraform Plan, Cloudformation, AWS SAM, Kubernetes, Helm Charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates oder OpenTofu bereitgestellt wird, und erkennt Sicherheits- und Compliance-Fehlkonfigurationen mithilfe diagrammbasierter Scans.
Es führt einen SCA-Scan (Software Composition Analysis) durch, bei dem es sich um einen Scan von Open-Source-Paketen und Bildern nach Common Vulnerabilities and Exposures (CVEs) handelt.
Checkov unterstützt auch Prisma Cloud Application Security , die entwicklerorientierte Plattform, die die Cloud-Sicherheit während des gesamten Entwicklungslebenszyklus kodifiziert und optimiert. Prisma Cloud identifiziert, behebt und verhindert Fehlkonfigurationen in Cloud-Ressourcen und Infrastructure-as-Code-Dateien.
Scan-Ergebnisse in CLI
Geplantes Scanergebnis in Jenkins
Um Pip zu installieren, befolgen Sie die offiziellen Dokumente
pip3 install checkov
oder mit Homebrew (macOS oder Linux)
brew install checkov
source <( register-python-argcomplete checkov )
wenn Sie checkov mit pip3 installiert haben
pip3 install -U checkov
oder mit Homebrew
brew upgrade checkov
checkov --directory /user/path/to/iac/code
Oder eine bestimmte Datei oder Dateien
checkov --file /user/tf/example.tf
Oder
checkov -f /user/cloudformation/example1.yml -f /user/cloudformation/example2.yml
Oder eine Terraform-Plandatei im JSON-Format
terraform init
terraform plan -out tf.plan
terraform show -json tf.plan > tf.json
checkov -f tf.json
Hinweis: terraform show
Ausgabedatei tf.json
besteht aus einer einzelnen Zeile. Aus diesem Grund werden alle Befunde von Checkov mit der Zeilennummer 0 gemeldet
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
Wenn Sie jq
installiert haben, können Sie die JSON-Datei mit dem folgenden Befehl in mehrere Zeilen konvertieren:
terraform show -json tf.plan | jq ' . ' > tf.json
Das Scanergebnis wäre sehr benutzerfreundlich.
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 " ,
Alternativ können Sie mithilfe des Flags --repo-root-for-plan-enrichment
das Repo-Stammverzeichnis der hcl-Dateien angeben, die zum Generieren der Plandatei verwendet werden, um die Ausgabe mit dem entsprechenden Dateipfad, den entsprechenden Zeilennummern und dem Codeblock der Ressource anzureichern (S). Ein zusätzlicher Vorteil besteht darin, dass Scheckunterdrückungen entsprechend gehandhabt werden.
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
Beginnen Sie mit der Verwendung von Checkov, indem Sie die Seite „Erste Schritte“ lesen.
docker pull bridgecrew/checkov
docker run --tty --rm --volume /user/tf:/tf --workdir /tf bridgecrew/checkov --directory /tf
Hinweis: Wenn Sie Python 3.6 (Standardversion in Ubuntu 18.04) verwenden, funktioniert checkov nicht und schlägt mit der Fehlermeldung ModuleNotFoundError: No module named 'dataclasses'
fehl. In diesem Fall können Sie stattdessen die Docker-Version verwenden.
Beachten Sie, dass es bestimmte Fälle gibt, in denen die Umleitung docker run --tty
Ausgabe in eine Datei – beispielsweise wenn Sie die Checkov JUnit-Ausgabe in einer Datei speichern möchten – dazu führt, dass zusätzliche Steuerzeichen gedruckt werden. Dies kann das Parsen von Dateien unterbrechen. Wenn dies auftritt, entfernen Sie das Flag --tty
.
Das Flag --workdir /tf
ist optional, um das Arbeitsverzeichnis auf das bereitgestellte Volume zu ändern. Wenn Sie die SARIF-Ausgabe -o sarif
verwenden, wird die Datei results.sarif auf das bereitgestellte Volume ( /user/tf
im obigen Beispiel) ausgegeben. Wenn Sie dieses Flag nicht angeben, lautet das Arbeitsverzeichnis „/“.
Durch die Verwendung von Befehlszeilenflags können Sie festlegen, dass nur benannte Prüfungen (Zulassungsliste) oder alle Prüfungen außer den aufgeführten (Verweigerungsliste) ausgeführt werden sollen. Wenn Sie die Plattformintegration per API-Schlüssel verwenden, können Sie auch einen Schweregradschwellenwert zum Überspringen und/oder Einbeziehen angeben. Da JSON-Dateien außerdem keine Kommentare enthalten können, kann man ein Regex-Muster übergeben, um den geheimen Scan der JSON-Datei zu überspringen.
Ausführlichere Informationen zur Zusammenarbeit dieser Flags finden Sie in den Dokumenten.
Lassen Sie nur die Ausführung der beiden angegebenen Prüfungen zu:
checkov --directory . --check CKV_AWS_20,CKV_AWS_57
Führen Sie alle Prüfungen außer der angegebenen aus:
checkov -d . --skip-check CKV_AWS_20
Führen Sie alle Prüfungen außer Prüfungen mit angegebenen Mustern aus:
checkov -d . --skip-check CKV_AWS *
Führen Sie alle Prüfungen mit mittlerem oder höherem Schweregrad aus (API-Schlüssel erforderlich):
checkov -d . --check MEDIUM --bc-api-key ...
Führen Sie alle Prüfungen mit mittlerem oder höherem Schweregrad aus und prüfen Sie auch CKV_123 (angenommen, es handelt sich um eine Prüfung mit niedrigem Schweregrad):
checkov -d . --check MEDIUM,CKV_123 --bc-api-key ...
Überspringen Sie alle Prüfungen mit dem Schweregrad MITTEL oder niedriger:
checkov -d . --skip-check MEDIUM --bc-api-key ...
Überspringen Sie alle Prüfungen mit mittlerem oder niedrigerem Schweregrad und prüfen Sie auch CKV_789 (angenommen, es handelt sich um eine Prüfung mit hohem Schweregrad):
checkov -d . --skip-check MEDIUM,CKV_789 --bc-api-key ...
Führen Sie alle Prüfungen mit mittlerem oder höherem Schweregrad aus, überspringen Sie jedoch die Prüfung CKV_123 (angenommen, es handelt sich um eine Prüfung mit mittlerem oder höherem Schweregrad):
checkov -d . --check MEDIUM --skip-check CKV_123 --bc-api-key ...
Führen Sie die Prüfung CKV_789 aus, aber überspringen Sie sie, wenn es sich um einen mittleren Schweregrad handelt (die --check-Logik wird immer vor --skip-check angewendet).
checkov -d . --skip-check MEDIUM --check CKV_789 --bc-api-key ...
Für Kubernetes-Workloads können Sie auch Namespaces zum Zulassen/Verweigern verwenden. Melden Sie beispielsweise keine Ergebnisse für den Namespace kube-system:
checkov -d . --skip-check kube-system
Führen Sie einen Scan eines Container-Images durch. Ziehen oder erstellen Sie zuerst das Image und verweisen Sie dann über den Hash, die ID oder den Namen:Tag darauf:
checkov --framework sca_image --docker-image sha256:1234example --dockerfile-path /Users/path/to/Dockerfile --repo-id ... --bc-api-key ...
checkov --docker-image < image-name > :tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
Sie können anstelle von --docker-image auch das Flag --image verwenden, um das Container-Image zu scannen, um einen Shortener zu erhalten:
checkov --image < image-name > :tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
Führen Sie einen SCA-Scan der Pakete in einem Repo durch:
checkov -d . --framework sca_package --bc-api-key ... --repo-id < repo_id(arbitrary) >
Führen Sie einen Scan eines Verzeichnisses mit Umgebungsvariablen durch, entfernen Sie die Pufferung und fügen Sie Protokolle auf Debug-Ebene hinzu:
PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG checkov -d .
ODER aktivieren Sie die Umgebungsvariablen für mehrere Läufe
export PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG
checkov -d .
Führen Sie eine geheime Überprüfung aller Dateien in MyDirectory durch. Überspringen Sie die CKV_SECRET_6-Prüfung von JSON-Dateien, ob deren Suffix DontScan lautet
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:. * DontScan.json$
Führen Sie einen Secrets-Scan für alle Dateien in MyDirectory durch. Überspringen Sie die CKV_SECRET_6-Prüfung für JSON-Dateien, die „skip_test“ im Pfad enthalten
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:. * skip_test. * json$
Man kann Werte aus den Scan-Ergebnissen maskieren, indem man eine Konfigurationsdatei (mit dem Flag --config-file) mit einem Maskeneintrag bereitstellt. Die Maskierung kann auf Ressource und Wert angewendet werden (oder auf mehrere Werte, getrennt durch ein Komma). Beispiele:
mask:
- aws_instance:user_data
- azurerm_key_vault_secret:admin_password,user_passwords
Im obigen Beispiel werden die folgenden Werte maskiert:
Wie jedes statische Analysetool ist es durch seinen Analyseumfang begrenzt. Wenn eine Ressource beispielsweise manuell oder mithilfe nachfolgender Konfigurationsverwaltungstools verwaltet wird, kann die Unterdrückung als einfache Codeanmerkung eingefügt werden.
Um eine Prüfung eines bestimmten Terraform-Definitionsblocks oder einer CloudFormation-Ressource zu überspringen, wenden Sie das folgende Kommentarmuster innerhalb des Gültigkeitsbereichs an:
checkov:skip=<check_id>:<suppression_comment>
<check_id>
ist einer der [verfügbaren Scheckscanner](docs/5.Policy Index/all.md)<suppression_comment>
ist ein optionaler Unterdrückungsgrund, der in die Ausgabe einbezogen werden soll Der folgende Kommentar überspringt die CKV_AWS_20
Prüfung der durch foo-bucket
identifizierten Ressource, bei der der Scan prüft, ob ein AWS S3-Bucket privat ist. Im Beispiel ist der Bucket mit öffentlichem Lesezugriff konfiguriert; Durch das Hinzufügen des Unterdrückungskommentars würde die entsprechende Prüfung übersprungen, anstatt dass die Prüfung fehlschlägt.
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"
}
Die Ausgabe würde nun einen SKIPPED
-Prüfergebniseintrag enthalten:
...
...
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
...
Um mehrere Prüfungen zu überspringen, fügen Sie jede als neue Zeile hinzu.
#checkov:skip=CKV2_AWS_6
#checkov:skip=CKV_AWS_20:The bucket is a public static content host
Um Prüfungen in Kubernetes-Manifesten zu unterdrücken, werden Annotationen im folgenden Format verwendet: checkov.io/skip#: <check_id>=<suppression_comment>
Zum Beispiel:
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:
...
Für eine detaillierte Protokollierung auf stdout richten Sie die Umgebungsvariable LOG_LEVEL
auf DEBUG
ein.
Der Standardwert ist LOG_LEVEL=WARNING
.
Um Dateien oder Verzeichnisse zu überspringen, verwenden Sie das Argument --skip-path
, das mehrfach angegeben werden kann. Dieses Argument akzeptiert reguläre Ausdrücke für Pfade relativ zum aktuellen Arbeitsverzeichnis. Sie können damit ganze Verzeichnisse und/oder bestimmte Dateien überspringen.
Standardmäßig werden alle Verzeichnisse mit den Namen node_modules
, .terraform
und .serverless
übersprungen, zusätzlich zu allen Dateien oder Verzeichnissen, die mit beginnen .
. Um das Überspringen von Verzeichnissen abzubrechen, die mit beginnen .
Überschreiben Sie den Export der Umgebungsvariablen CKV_IGNORE_HIDDEN_DIRECTORIES
export CKV_IGNORE_HIDDEN_DIRECTORIES=false
Sie können den Standardsatz an zu überspringenden Verzeichnissen überschreiben, indem Sie die Umgebungsvariable CKV_IGNORED_DIRECTORIES
festlegen. Beachten Sie, dass Sie diese Werte einschließen müssen, wenn Sie diese Liste beibehalten und ergänzen möchten. Beispielsweise überspringt CKV_IGNORED_DIRECTORIES=mynewdir
nur dieses Verzeichnis, nicht jedoch die anderen oben genannten. Bei dieser Variablen handelt es sich um eine Legacy-Funktionalität. Wir empfehlen die Verwendung des Flags --skip-file
.
Die Konsolenausgabe erfolgt standardmäßig in Farbe. Um zu einer monochromen Ausgabe zu wechseln, legen Sie die Umgebungsvariable ANSI_COLORS_DISABLED
fest
Wenn Sie Checkov in VS Code verwenden möchten, probieren Sie die Prisma Cloud-Erweiterung aus.
Checkov kann mithilfe einer YAML-Konfigurationsdatei konfiguriert werden. Standardmäßig sucht checkov an den folgenden Stellen in der Reihenfolge ihrer Priorität nach einer .checkov.yaml
oder .checkov.yml
Datei:
--directory
)Achtung : Es ist eine bewährte Methode, die Checkov-Konfigurationsdatei von einer vertrauenswürdigen Quelle zu laden, die aus einer verifizierten Identität besteht, sodass gescannte Dateien, Prüf-IDs und geladene benutzerdefinierte Prüfungen wie gewünscht sind.
Benutzer können den Pfad zu einer Konfigurationsdatei auch über die Befehlszeile übergeben. In diesem Fall werden die anderen Konfigurationsdateien ignoriert. Zum Beispiel:
checkov --config-file path/to/config.yaml
Benutzer können auch eine Konfigurationsdatei mit dem Befehl --create-config
erstellen, der die aktuellen Befehlszeilenargumente übernimmt und sie in einen bestimmten Pfad schreibt. Zum Beispiel:
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
Erstellt eine config.yaml
Datei, die so aussieht:
branch : develop
check :
- CKV_DOCKER_1
compact : true
directory :
- test-dir
docker-image : sample-image
dockerfile-path : Dockerfile
download-external-modules : true
evaluate-variables : true
external-checks-dir :
- sample-dir
external-modules-download-path : .external_modules
framework :
- all
output : cli
quiet : true
repo-id : prisma-cloud/sample-repo
skip-check :
- CKV_DOCKER_3
- CKV_DOCKER_2
skip-framework :
- dockerfile
- secrets
soft-fail : true
Benutzer können auch das Flag --show-config
verwenden, um alle Argumente und Einstellungen sowie deren Herkunft anzuzeigen, z. B. Befehlszeile, Konfigurationsdatei, Umgebungsvariable oder Standard. Zum Beispiel:
checkov --show-config
Zeigt Folgendes an:
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
Beitrag ist willkommen!
Lesen Sie zunächst die Beitragsrichtlinien durch. Schauen Sie sich danach eine gute Erstausgabe an.
Sie können dies sogar mit One-Click-Dev in Ihrem Browser über Gitpod unter dem folgenden Link starten:
Möchten Sie neue Schecks einzahlen? Erfahren Sie hier, wie Sie einen neuen Scheck ausstellen (AKA-Richtlinie).
checkov
speichert, veröffentlicht oder gibt keine identifizierbaren Kundeninformationen an Dritte weiter.
Für die Abfrage der öffentlich zugänglichen Leitfäden von Prisma Cloud werden keine identifizierbaren Kundeninformationen verwendet. checkov
nutzt die API von Prisma Cloud, um die Ergebnisse mit Links zu Behebungsleitfäden anzureichern. Um diesen API-Aufruf zu überspringen, verwenden Sie das Flag --skip-download
.
Prisma Cloud erstellt und verwaltet Checkov, um Policy-as-Code einfach und zugänglich zu machen.
Beginnen Sie mit unserer Dokumentation für schnelle Tutorials und Beispiele.
Wir befolgen den offiziellen Supportzyklus von Python und verwenden automatisierte Tests für unterstützte Versionen von Python. Das bedeutet, dass wir derzeit Python 3.9 bis einschließlich 3.12 unterstützen. Beachten Sie, dass Python 3.8 EOL im Oktober 2024 erreicht hat und Python 3.9 EOL im Oktober 2025 erreichen wird. Wir prüfen die Unterstützung für 3.13. Wenn Sie Probleme mit einer nicht EOL-Python-Version haben, öffnen Sie bitte ein Problem.