Checkov คือเครื่องมือวิเคราะห์โค้ดแบบคงที่สำหรับโครงสร้างพื้นฐานในรูปแบบโค้ด (IaC) และยังเป็นเครื่องมือวิเคราะห์องค์ประกอบซอฟต์แวร์ (SCA) สำหรับรูปภาพและแพ็คเกจโอเพ่นซอร์ส
โดยจะสแกนโครงสร้างพื้นฐานระบบคลาวด์ที่จัดเตรียมโดยใช้ Terraform, แผน Terraform, Cloudformation, AWS SAM, Kubernetes, แผนภูมิ Helm, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, เทมเพลต ARM หรือ OpenTofu และตรวจจับความปลอดภัยและการกำหนดค่าที่ไม่ถูกต้องตามข้อกำหนดโดยใช้การสแกนตามกราฟ
ทำการสแกนการวิเคราะห์องค์ประกอบของซอฟต์แวร์ (SCA) ซึ่งเป็นการสแกนแพ็คเกจโอเพ่นซอร์สและรูปภาพสำหรับช่องโหว่และความเสี่ยงทั่วไป (CVE)
Checkov ยังขับเคลื่อน Prisma Cloud Application Security ซึ่งเป็นแพลตฟอร์มแรกของนักพัฒนาที่เข้ารหัสและปรับปรุงความปลอดภัยบนคลาวด์ตลอดวงจรการพัฒนา Prisma Cloud ระบุ แก้ไข และป้องกันการกำหนดค่าที่ไม่ถูกต้องในทรัพยากรคลาวด์และไฟล์โครงสร้างพื้นฐานตามโค้ด
ผลลัพธ์การสแกนใน CLI
ผลการสแกนตามกำหนดเวลาใน Jenkins
หากต้องการติดตั้ง pip ให้ทำตามเอกสารอย่างเป็นทางการ
pip3 install checkov
หรือด้วย Homebrew (macOS หรือ Linux)
brew install checkov
source <( register-python-argcomplete checkov )
หากคุณติดตั้ง checkov ด้วย pip3
pip3 install -U checkov
หรือด้วยโฮมบรูว์
brew upgrade checkov
checkov --directory /user/path/to/iac/code
หรือไฟล์เฉพาะหรือไฟล์ต่างๆ
checkov --file /user/tf/example.tf
หรือ
checkov -f /user/cloudformation/example1.yml -f /user/cloudformation/example2.yml
หรือไฟล์แผน Terraform ในรูปแบบ json
terraform init
terraform plan -out tf.plan
terraform show -json tf.plan > tf.json
checkov -f tf.json
หมายเหตุ: ไฟล์เอาต์พุต terraform show
tf.json
จะเป็นบรรทัดเดียว ด้วยเหตุนี้การค้นพบทั้งหมดจะถูกรายงานบรรทัดที่ 0 โดย Checkov
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
หากคุณติดตั้ง jq
คุณสามารถแปลงไฟล์ json ให้เป็นหลายบรรทัดได้โดยใช้คำสั่งต่อไปนี้:
terraform show -json tf.plan | jq ' . ' > tf.json
ผลลัพธ์การสแกนจะเป็นมิตรกับผู้ใช้มาก
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 " ,
หรือระบุรูท repo ของไฟล์ hcl ที่ใช้ในการสร้างไฟล์แผน โดยใช้แฟล็ก --repo-root-for-plan-enrichment
เพื่อเพิ่มคุณค่าให้กับเอาต์พุตด้วยพาธไฟล์ หมายเลขบรรทัด และบล็อกรหัสที่เหมาะสมของทรัพยากร (s) ประโยชน์เพิ่มเติมก็คือการระงับเช็คจะได้รับการจัดการตามนั้น
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
เริ่มใช้ Checkov โดยการอ่านหน้าเริ่มต้นใช้งาน
docker pull bridgecrew/checkov
docker run --tty --rm --volume /user/tf:/tf --workdir /tf bridgecrew/checkov --directory /tf
หมายเหตุ: หากคุณใช้ Python 3.6 (เวอร์ชันเริ่มต้นใน Ubuntu 18.04) การตรวจสอบจะไม่ทำงานและจะล้มเหลวด้วย ModuleNotFoundError: No module named 'dataclasses'
error message ในกรณีนี้ คุณสามารถใช้เวอร์ชันนักเทียบท่าแทนได้
โปรดทราบว่ามีบางกรณีที่การเปลี่ยนเส้นทางนักเทียบ docker run --tty
เอาต์พุตไปยังไฟล์ ตัวอย่างเช่น หากคุณต้องการบันทึกเอาต์พุต Checkov JUnit ไปยังไฟล์ จะทำให้มีการพิมพ์อักขระควบคุมเพิ่มเติม สิ่งนี้สามารถทำลายการแยกวิเคราะห์ไฟล์ หากคุณพบสิ่งนี้ ให้ลบแฟล็ก --tty
ออก
การตั้งค่าสถานะ --workdir /tf
เป็นทางเลือกในการเปลี่ยนไดเร็กทอรีการทำงานเป็นโวลุ่มที่เมาท์ หากคุณใช้เอาต์พุต SARIF -o sarif
สิ่งนี้จะส่งออกไฟล์ results.sarif ไปยังโวลุ่มที่เมาท์ ( /user/tf
ในตัวอย่างด้านบน) หากคุณไม่รวมแฟล็กนั้น ไดเร็กทอรีการทำงานจะเป็น "/"
โดยใช้แฟล็กบรรทัดคำสั่ง คุณสามารถระบุให้รันเฉพาะเช็คที่มีชื่อ (รายการที่อนุญาต) หรือรันเช็คทั้งหมดยกเว้นรายการที่อยู่ในรายการ (รายการปฏิเสธ) หากคุณใช้การผสานรวมแพลตฟอร์มผ่านคีย์ API คุณยังสามารถระบุเกณฑ์ความรุนแรงที่จะข้ามและ/หรือรวมได้ นอกจากนี้ เนื่องจากไฟล์ json ไม่สามารถแสดงความคิดเห็นได้ เราจึงสามารถส่งรูปแบบ regex เพื่อข้ามการสแกนความลับของไฟล์ json ได้
ดูเอกสารสำหรับข้อมูลโดยละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานร่วมกันของแฟล็กเหล่านี้
อนุญาตให้เรียกใช้การตรวจสอบที่ระบุสองรายการเท่านั้น:
checkov --directory . --check CKV_AWS_20,CKV_AWS_57
ดำเนินการตรวจสอบทั้งหมดยกเว้นรายการที่ระบุไว้:
checkov -d . --skip-check CKV_AWS_20
ดำเนินการตรวจสอบทั้งหมด ยกเว้นการตรวจสอบที่มีรูปแบบที่ระบุ:
checkov -d . --skip-check CKV_AWS *
เรียกใช้การตรวจสอบทั้งหมดที่มีความรุนแรงปานกลางหรือสูงกว่า (ต้องใช้คีย์ API):
checkov -d . --check MEDIUM --bc-api-key ...
เรียกใช้การตรวจสอบทั้งหมดที่มีความรุนแรงปานกลางหรือสูงกว่า รวมถึงตรวจสอบ CKV_123 (สมมติว่านี่เป็นการตรวจสอบความรุนแรงต่ำ):
checkov -d . --check MEDIUM,CKV_123 --bc-api-key ...
ข้ามการตรวจสอบทั้งหมดที่มีความรุนแรงปานกลางหรือต่ำกว่า:
checkov -d . --skip-check MEDIUM --bc-api-key ...
ข้ามการตรวจสอบทั้งหมดที่มีความรุนแรงปานกลางหรือต่ำกว่า รวมทั้งตรวจสอบ CKV_789 (สมมติว่านี่เป็นการตรวจสอบความรุนแรงสูง):
checkov -d . --skip-check MEDIUM,CKV_789 --bc-api-key ...
เรียกใช้การตรวจสอบทั้งหมดที่มีความรุนแรงปานกลางหรือสูงกว่า แต่ข้ามการตรวจสอบ CKV_123 (สมมติว่านี่เป็นการตรวจสอบความรุนแรงปานกลางหรือสูงกว่า):
checkov -d . --check MEDIUM --skip-check CKV_123 --bc-api-key ...
รันตรวจสอบ CKV_789 แต่ข้ามไปหากเป็นระดับความรุนแรงปานกลาง (ตรรกะ --check จะถูกใช้ก่อน --skip-check เสมอ)
checkov -d . --skip-check MEDIUM --check CKV_789 --bc-api-key ...
สำหรับภาระงาน Kubernetes คุณยังใช้อนุญาต/ปฏิเสธเนมสเปซได้ด้วย ตัวอย่างเช่น อย่ารายงานผลลัพธ์ใดๆ สำหรับเนมสเปซของระบบ kube:
checkov -d . --skip-check kube-system
เรียกใช้การสแกนอิมเมจคอนเทนเนอร์ ขั้นแรกให้ดึงหรือสร้างอิมเมจ จากนั้นอ้างอิงด้วยแฮช ID หรือชื่อ: แท็ก:
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 ...
คุณสามารถใช้ --image flag เพื่อสแกนอิมเมจคอนเทนเนอร์แทน --docker-image เพื่อย่อให้สั้นลง:
checkov --image < image-name > :tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
รันการสแกนแพ็คเกจ SCA ใน repo:
checkov -d . --framework sca_package --bc-api-key ... --repo-id < repo_id(arbitrary) >
รันการสแกนไดเร็กทอรีด้วยตัวแปรสภาพแวดล้อมเพื่อลบการบัฟเฟอร์ โดยเพิ่มบันทึกระดับการแก้ไขข้อบกพร่อง:
PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG checkov -d .
หรือเปิดใช้งานตัวแปรสภาพแวดล้อมสำหรับการรันหลายครั้ง
export PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG
checkov -d .
เรียกใช้การสแกนความลับในไฟล์ทั้งหมดใน MyDirectory ข้ามการตรวจสอบ CKV_SECRET_6 ในไฟล์ json ว่าส่วนต่อท้ายคือ DontScan
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:. * DontScan.json$
เรียกใช้การสแกนความลับในไฟล์ทั้งหมดใน MyDirectory ข้ามการตรวจสอบ CKV_SECRET_6 ในไฟล์ json ที่มี "skip_test" ในเส้นทาง
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:. * skip_test. * json$
เราสามารถปกปิดค่าจากผลลัพธ์การสแกนได้โดยการจัดหาไฟล์การกำหนดค่า (โดยใช้แฟล็ก --config-file) พร้อมรายการมาสก์ การมาสก์สามารถนำไปใช้กับทรัพยากรและค่าได้ (หรือหลายค่า โดยคั่นด้วยเครื่องหมายจุลภาค) ตัวอย่าง:
mask:
- aws_instance:user_data
- azurerm_key_vault_secret:admin_password,user_passwords
ในตัวอย่างข้างต้น ค่าต่อไปนี้จะถูกปกปิด:
เช่นเดียวกับเครื่องมือวิเคราะห์แบบคงที่ใดๆ มันถูกจำกัดด้วยขอบเขตการวิเคราะห์ ตัวอย่างเช่น หากทรัพยากรได้รับการจัดการด้วยตนเอง หรือใช้เครื่องมือการจัดการการกำหนดค่าในภายหลัง การระงับสามารถแทรกเป็นคำอธิบายประกอบโค้ดแบบง่ายได้
หากต้องการข้ามการตรวจสอบบล็อกคำจำกัดความ Terraform หรือทรัพยากร CloudFormation ที่กำหนด ให้ใช้รูปแบบความคิดเห็นต่อไปนี้ภายในขอบเขต:
checkov:skip=<check_id>:<suppression_comment>
<check_id>
เป็นหนึ่งใน [เครื่องสแกนเช็คที่มีอยู่](docs/5.Policy Index/all.md)<suppression_comment>
เป็นเหตุผลในการระงับทางเลือกที่จะรวมไว้ในเอาต์พุต ความคิดเห็นต่อไปนี้ข้ามการตรวจสอบ CKV_AWS_20
บนทรัพยากรที่ระบุโดย foo-bucket
โดยที่การสแกนจะตรวจสอบว่าที่เก็บข้อมูล AWS S3 เป็นแบบส่วนตัวหรือไม่ ในตัวอย่าง ที่เก็บข้อมูลได้รับการกำหนดค่าด้วยการเข้าถึงการอ่านแบบสาธารณะ การเพิ่มความคิดเห็นระงับจะข้ามการตรวจสอบที่เหมาะสมแทนที่จะทำให้การตรวจสอบล้มเหลว
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"
}
ตอนนี้เอาต์พุตจะมีรายการผลลัพธ์การตรวจสอบ SKIPPED
:
...
...
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
...
หากต้องการข้ามการตรวจสอบหลายรายการ ให้เพิ่มแต่ละรายการเป็นบรรทัดใหม่
#checkov:skip=CKV2_AWS_6
#checkov:skip=CKV_AWS_20:The bucket is a public static content host
หากต้องการระงับการตรวจสอบในรายการ Kubernetes จะใช้คำอธิบายประกอบในรูปแบบต่อไปนี้: checkov.io/skip#: <check_id>=<suppression_comment>
ตัวอย่างเช่น:
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:
...
สำหรับการบันทึกโดยละเอียดไปยัง stdout ให้ตั้งค่าตัวแปรสภาพแวดล้อม LOG_LEVEL
เป็น DEBUG
ค่าเริ่มต้นคือ LOG_LEVEL=WARNING
หากต้องการข้ามไฟล์หรือไดเร็กทอรี ให้ใช้อาร์กิวเมนต์ --skip-path
ซึ่งสามารถระบุได้หลายครั้ง อาร์กิวเมนต์นี้ยอมรับนิพจน์ทั่วไปสำหรับเส้นทางที่สัมพันธ์กับไดเร็กทอรีการทำงานปัจจุบัน คุณสามารถใช้มันเพื่อข้ามไดเร็กทอรีทั้งหมดและ / หรือไฟล์เฉพาะได้
ตามค่าดีฟอลต์ ไดเร็กทอรีทั้งหมดที่ชื่อ node_modules
, .terraform
และ .serverless
จะถูกข้าม นอกเหนือจากไฟล์หรือไดเร็กทอรีใดๆ ที่ขึ้นต้น .
- หากต้องการยกเลิกการข้ามไดเรกทอรีที่ขึ้นต้นด้วย .
แทนที่ตัวแปรสภาพแวดล้อม CKV_IGNORE_HIDDEN_DIRECTORIES
export CKV_IGNORE_HIDDEN_DIRECTORIES=false
คุณสามารถแทนที่ชุดไดเร็กทอรีดีฟอลต์ที่จะข้ามโดยการตั้งค่าตัวแปรสภาพแวดล้อม CKV_IGNORED_DIRECTORIES
โปรดทราบว่าถ้าคุณต้องการเก็บรายการนี้และเพิ่มเข้าไป คุณต้องรวมค่าเหล่านี้ด้วย ตัวอย่างเช่น CKV_IGNORED_DIRECTORIES=mynewdir
จะข้ามเฉพาะไดเร็กทอรีนั้น แต่ไม่ใช่ไดเร็กทอรีอื่นที่กล่าวถึงข้างต้น ตัวแปรนี้เป็นฟังก์ชันการทำงานแบบเดิม เราขอแนะนำให้ใช้แฟล็ก --skip-file
เอาต์พุตคอนโซลจะเป็นสีตามค่าเริ่มต้น หากต้องการสลับเป็นเอาต์พุตขาวดำ ให้ตั้งค่าตัวแปรสภาพแวดล้อม: ANSI_COLORS_DISABLED
หากคุณต้องการใช้ Checkov ภายใน VS Code ให้ลองใช้ส่วนขยาย Prisma Cloud
Checkov สามารถกำหนดค่าได้โดยใช้ไฟล์การกำหนดค่า YAML ตามค่าเริ่มต้น checkov จะค้นหาไฟล์ .checkov.yaml
หรือ .checkov.yml
ในตำแหน่งต่อไปนี้ตามลำดับความสำคัญ:
--directory
)ข้อควรสนใจ : แนวทางปฏิบัติที่ดีที่สุดสำหรับไฟล์การกำหนดค่า Checkov ที่จะโหลดจากแหล่งที่เชื่อถือได้ซึ่งประกอบไปด้วยข้อมูลประจำตัวที่ได้รับการยืนยัน เพื่อให้ไฟล์ที่สแกน รหัสตรวจสอบ และการตรวจสอบแบบกำหนดเองที่โหลดไว้เป็นไปตามที่ต้องการ
ผู้ใช้ยังสามารถส่งผ่านเส้นทางไปยังไฟล์กำหนดค่าผ่านทางบรรทัดคำสั่ง ในกรณีนี้ ไฟล์กำหนดค่าอื่นๆ จะถูกละเว้น ตัวอย่างเช่น:
checkov --config-file path/to/config.yaml
ผู้ใช้ยังสามารถสร้างไฟล์กำหนดค่าโดยใช้คำสั่ง --create-config
ซึ่งรับ args บรรทัดคำสั่งปัจจุบันและเขียนลงในพาธที่กำหนด ตัวอย่างเช่น:
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
จะสร้างไฟล์ config.yaml
ซึ่งมีลักษณะดังนี้:
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
ผู้ใช้ยังสามารถใช้แฟล็ก --show-config
เพื่อดู args และการตั้งค่าทั้งหมด และที่มาของสิ่งเหล่านั้น เช่น commandline, ไฟล์ปรับแต่ง, ตัวแปรสภาพแวดล้อม หรือค่าเริ่มต้น ตัวอย่างเช่น:
checkov --show-config
จะแสดง:
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
ยินดีบริจาค!
เริ่มต้นด้วยการทบทวนหลักเกณฑ์การบริจาค หลังจากนั้นลองดูประเด็นแรกที่ดี
คุณสามารถเริ่มต้นได้ด้วยคลิกเดียว dev ในเบราว์เซอร์ของคุณผ่าน Gitpod ที่ลิงก์ต่อไปนี้:
กำลังมองหาการสนับสนุนเช็คใหม่หรือไม่? เรียนรู้วิธีเขียนเช็คใหม่ (นโยบาย AKA) ที่นี่
checkov
จะไม่บันทึก เผยแพร่ หรือแบ่งปันข้อมูลของลูกค้าที่สามารถระบุตัวตนได้กับใครก็ตาม
ไม่มีการใช้ข้อมูลลูกค้าที่สามารถระบุตัวตนได้เพื่อสอบถามคำแนะนำที่เข้าถึงได้แบบสาธารณะของ Prisma Cloud checkov
ใช้ API ของ Prisma Cloud เพื่อเพิ่มผลลัพธ์ด้วยลิงก์ไปยังคำแนะนำในการแก้ไข หากต้องการข้ามการเรียก API นี้ให้ใช้แฟล็ก --skip-download
Prisma Cloud สร้างและบำรุงรักษา Checkov เพื่อทำให้นโยบายตามโค้ดเป็นเรื่องง่ายและเข้าถึงได้
เริ่มต้นด้วยเอกสารประกอบของเราสำหรับบทช่วยสอนและตัวอย่างสั้นๆ
เราปฏิบัติตามวงจรการสนับสนุนอย่างเป็นทางการของ Python และเราใช้การทดสอบอัตโนมัติสำหรับ Python เวอร์ชันที่รองรับ ซึ่งหมายความว่าขณะนี้เรารองรับ Python 3.9 - 3.12 รวมอยู่ด้วย โปรดทราบว่า Python 3.8 จะเข้าถึง EOL ในเดือนตุลาคม 2024 และ Python 3.9 จะเข้าถึง EOL ในเดือนตุลาคม 2025 เรากำลังตรวจสอบการสนับสนุนสำหรับ 3.13 หากคุณประสบปัญหาใดๆ กับเวอร์ชันที่ไม่ใช่ EOL Python โปรดเปิดปัญหา