Checkov是用於基礎設施即程式碼 (IaC) 的靜態程式碼分析工具,也是用於影像和開源套件的軟體組合分析 (SCA) 工具。
它掃描使用Terraform、Terraform plan、Cloudformation、AWS SAM、Kubernetes、Helm Charts、Kustomize、Dockerfile、Serverless、Bicep、OpenAPI、ARM Templates 或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 )
如果你用 pip3 安裝了 checkov
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
或 json 格式的 terraform plan 文件
terraform init
terraform plan -out tf.plan
terraform show -json tf.plan > tf.json
checkov -f tf.json
注意: terraform show
輸出檔tf.json
將是一行。因此,Checkov 將在第 0 行報告所有發現結果
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-root-for-plan-enrichment
標誌指定用於產生計畫檔案的 hcl 檔案的儲存庫根,以使用資源的適當檔案路徑、行號和程式碼區塊豐富輸出(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 中的預設版本),checkov 將無法運作,並且會失敗並顯示ModuleNotFoundError: No module named 'dataclasses'
錯誤訊息。在這種情況下,您可以改用 docker 版本。
請注意,在某些情況下,將docker run --tty
輸出重定向到檔案(例如,如果要將 Checkov JUnit 輸出儲存到檔案)將導致列印額外的控製字元。這可能會破壞文件解析。如果遇到這種情況,請刪除--tty
標誌。
--workdir /tf
標誌是可選的,用於將工作目錄變更為已安裝的磁碟區。如果您使用 SARIF 輸出-o sarif
這會將 results.sarif 檔案輸出到已安裝的磁碟區(上例中的/user/tf
)。如果不包含該標誌,工作目錄將為“/”。
透過使用命令列標誌,您可以指定僅執行命名檢查(允許清單)或執行除列出的檢查之外的所有檢查(拒絕清單)。如果您透過 API 金鑰使用平台集成,您還可以指定要跳過和/或包含的嚴重性閾值。此外,由於 json 檔案不能包含註釋,因此可以透過正規表示式模式來跳過 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 ...
運行 check CKV_789,但如果是中等嚴重程度則跳過它(--check 邏輯始終在 --skip-check 之前應用)
checkov -d . --skip-check MEDIUM --check CKV_789 --bc-api-key ...
對於 Kubernetes 工作負載,您也可以使用允許/拒絕命名空間。例如,不報告 kube-system 命名空間的任何結果:
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 標誌來掃描容器映像,而不是使用 --docker-image 來縮短時間:
checkov --image < image-name > :tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
對儲存庫中的套件執行 SCA 掃描:
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 檢查路徑中包含“skip_test”的 json 文件
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>
是要包含在輸出中的可選抑制原因以下註解跳過對foo-bucket
標識的資源的CKV_AWS_20
檢查,其中掃描檢查 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
,該參數可以指定多次。此參數接受相對於目前工作目錄的路徑的正規表示式。您可以使用它來跳過整個目錄和/或特定檔案。
預設.terraform
下.serverless
node_modules
以.
。取消跳過以 . 開頭的目錄.
覆蓋CKV_IGNORE_HIDDEN_DIRECTORIES
環境變數export CKV_IGNORE_HIDDEN_DIRECTORIES=false
您可以透過設定環境變數CKV_IGNORED_DIRECTORIES
來覆寫要跳過的預設目錄集。請注意,如果要保留此清單並在其中添加內容,則必須包含這些值。例如, CKV_IGNORED_DIRECTORIES=mynewdir
將只跳過該目錄,而不會跳過上面提到的其他目錄。該變數是遺留功能;我們建議使用--skip-file
標誌。
控制台輸出預設為彩色,若要切換到單色輸出,請設定環境變數: ANSI_COLORS_DISABLED
如果您想在 VS Code 中使用 Checkov,請嘗試 Prisma Cloud 擴充功能。
可以使用 YAML 設定檔來設定 Checkov。預設情況下,checkov 會依優先順序在以下位置尋找.checkov.yaml
或.checkov.yml
檔案:
--directory
)注意:最佳實踐是從經過驗證的身份組成的可信任來源載入 checkov 設定文件,以便掃描的檔案、檢查 ID 和載入的自訂檢查符合需求。
使用者還可以透過命令列傳遞設定檔的路徑。在這種情況下,其他設定檔將被忽略。例如:
checkov --config-file path/to/config.yaml
使用者還可以使用--create-config
命令建立設定文件,該命令會取得目前命令列參數並將它們寫入給定路徑。例如:
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
標誌來查看所有參數和設定以及它們的來源,即命令列、設定檔、環境變數或預設值。例如:
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
歡迎貢獻!
首先查看貢獻指南。之後,看一下好第一期。
您甚至可以透過 Gitpod 在瀏覽器中一鍵開發來啟動此操作,連結如下:
想要貢獻新的支票嗎?在此了解如何開立新支票(又稱保單)。
checkov
不會保存、發布或與任何人分享任何可識別的客戶資訊。
查詢 Prisma Cloud 的公開存取指南時不會使用任何可識別的客戶資訊。 checkov
使用 Prisma Cloud 的 API 透過修復指南的連結來豐富結果。若要跳過此 API 呼叫,請使用標誌--skip-download
。
Prisma Cloud 建置和維護 Checkov 以使策略即程式碼變得簡單且易於存取。
從我們的文件開始,取得快速教學和範例。
我們遵循 Python 的官方支援週期,並對支援的 Python 版本使用自動化測試。這意味著我們目前支援 Python 3.9 - 3.12(含)。請注意,Python 3.8 將於 2024 年 10 月終止,Python 3.9 將於 2025 年 10 月終止。如果您遇到任何非 EOL Python 版本的任何問題,請提出問題。