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 月终止。我们正在研究对 3.13 的支持。如果您遇到任何非 EOL Python 版本的任何问题,请提出问题。