Checkov 是一个用于基础设施即代码(IaC)的静态代码分析工具,同时也是用于镜像和开源包的软件组成分析(SCA)工具。
它扫描使用 Terraform、Terraform 计划、Cloudformation、AWS SAM、Kubernetes、Helm charts、Kustomize、Dockerfile、Serverless、Bicep、OpenAPI、ARM 模板 或 OpenTofu 配置的云基础设施,并使用基于图的扫描检测安全与合规配置错误。
它执行 软件组成分析(SCA)扫描,即对开源包和镜像进行常见漏洞与暴露(CVE)扫描。
Checkov 还为 Prisma Cloud 应用程序安全 提供支持,这是一个以开发者优先的平台,在整个开发生命周期中将云安全编码化并简化流程。Prisma Cloud 能够在云资源和基础设施即代码文件中识别、修复并防止配置错误。
CLI 中的扫描结果

Jenkins 中的定时扫描结果

要安装 pip,请遵循官方文档```sh pip3 install checkov
某些环境(例如Debian 12)可能要求您在虚拟环境中安装Checkov```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
或者使用 Homebrew (macOS或Linux)```sh brew install checkov
### 启用 bash 自动补全```sh
source <(register-python-argcomplete checkov)
如果你通过 pip3 安装了 checkov```sh pip3 install -U checkov
或通过 Homebrew```sh
brew upgrade checkov
checkov --directory /user/path/to/iac/code
或者一个特定的文件或多个文件```sh
checkov --file /user/tf/example.tf
或者```sh checkov -f /user/cloudformation/example1.yml -f /user/cloudformation/example2.yml
或者一个 terraform plan 文件的 json 格式```sh
terraform init
terraform plan -out tf.plan
terraform show -json tf.plan > tf.json
checkov -f tf.json
Note: terraform show output file tf.json will be a single line.
For that reason all findings will be reported line number 0 by 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
如果你已经安装了 `jq`,你可以使用以下命令将 JSON 文件转换为多行格式:```sh
terraform show -json tf.plan | jq '.' > tf.json
扫描结果会更加用户友好。```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",
或者,使用 `--repo-root-for-plan-enrichment` 标志指定用于生成计划文件的 HCL 文件的仓库根目录,以在输出中丰富相关资源的文件路径、行号和代码块。另一个好处是,检查抑制将得到相应处理。```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
开始使用 Checkov,请阅读 [入门指南](https://github.com/bridgecrewio/checkov/blob/main/docs/1.Welcome/Quick%20Start.md) 页面。
### 使用 Docker```sh
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 文件的秘密扫描。
请参阅文档了解这些标志如何协同工作的更多详细信息。
仅允许运行指定的两个检查:```sh checkov --directory . --check CKV_AWS_20,CKV_AWS_57
运行除指定检查外的所有检查:```sh
checkov -d . --skip-check CKV_AWS_20
运行所有检查,但排除指定模式的检查:```sh checkov -d . --skip-check CKV_AWS*
运行所有中严重性或更高级别的检查(需要API密钥):```sh
checkov -d . --check MEDIUM --bc-api-key ...
运行所有严重程度为 MEDIUM 或更高的检查,以及检查 CKV_123(假设这是一个 LOW 严重程度的检查):```sh checkov -d . --check MEDIUM,CKV_123 --bc-api-key ...
跳过所有中等严重性或更低级别的检查:```sh
checkov -d . --skip-check MEDIUM --bc-api-key ...
跳过所有严重性为中等或更低的检查,以及检查 CKV_789(假设这是一个高严重性检查):```sh checkov -d . --skip-check MEDIUM,CKV_789 --bc-api-key ...
运行所有严重程度为中等或更高的检查,但跳过检查 CKV_123(假设这是一个中等或更高严重程度的检查):```sh
checkov -d . --check MEDIUM --skip-check CKV_123 --bc-api-key ...
运行检查 CKV_789,但如果它是中等严重性则跳过(--check 逻辑总是在 --skip-check 之前应用)```sh checkov -d . --skip-check MEDIUM --check CKV_789 --bc-api-key ...
对于Kubernetes工作负载,你还可以使用允许/拒绝命名空间。例如,不要报告kube-system命名空间的任何结果:```sh
checkov -d . --skip-check kube-system
运行容器镜像的扫描。首先拉取或构建镜像,然后通过哈希、ID 或名称:标签来引用它:```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 ...
你也可以使用 --image 标志来扫描容器镜像,而不是使用 --docker-image 进行简写:```sh
checkov --image <image-name>:tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
对仓库中的包运行SCA扫描:```sh checkov -d . --framework sca_package --bc-api-key ... --repo-id <repo_id(arbitrary)>
使用环境变量运行目录扫描,移除缓冲,添加调试级别日志:```sh
PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG checkov -d .
或者启用环境变量以进行多次运行```sh export PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG checkov -d .
对 MyDirectory 中的所有文件运行密钥扫描。跳过后缀为 DontScan 的 json 文件上的 CKV_SECRET_6 检查。```sh
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:.*DontScan.json$
对 MyDirectory 中的所有文件运行秘密扫描。跳过路径中包含 "skip_test" 的 json 文件的 CKV_SECRET_6 检查。```sh checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:.*skip_test.*json$
可以通过提供包含掩码条目的配置文件(使用 --config-file 标志)来遮蔽扫描结果中的值。
遮蔽可以应用于资源与值(或多个值,用逗号分隔)。
示例:```sh
mask:
- aws_instance:user_data
- azurerm_key_vault_secret:admin_password,user_passwords
在以上示例中,以下值将会被掩蔽:
aws_instance 资源的 user_dataazurerm_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 存储桶是否为私有。
在示例中,存储桶配置了公共读取权限;添加压制注释将跳过相应的检查,而不是让检查失败。```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"
}
输出现在将包含一个 ``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
...
要跳过多个检查,请将每个检查添加为单独一行。``` #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>`
例如:```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:
...
如需向标准输出输出详细日志,请将环境变量 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
如果您想在 VS Code 中使用 Checkov,请尝试 Prisma Cloud 扩展。
Checkov 可使用 YAML 配置文件进行配置。默认情况下,checkov 会按以下优先级顺序查找 .checkov.yaml 或 .checkov.yml 文件:
--directory)注意:最佳实践是 checkov 配置文件应从已验证身份的可信来源加载,以确保扫描的文件、检查 ID 和加载的自定义检查符合预期。
用户还可以通过命令行传递配置文件的路径。在这种情况下,将忽略其他配置文件。例如:```sh checkov --config-file path/to/config.yaml
用户还可以使用 `--create-config` 命令创建配置文件,该命令会获取当前命令行参数并将其写入指定路径。例如:```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
将创建一个config.yaml文件,内容如下:```yaml
branch: develop
check:
用户也可以使用 `--show-config` 标志来查看所有参数和设置及其来源,即命令行、配置文件、环境变量或默认值。例如:```sh
checkov --show-config
将显示:```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
## 贡献
欢迎贡献!
首先查看[贡献指南](https://github.com/bridgecrewio/checkov/blob/main/CONTRIBUTING.md)。然后,看看[适合初学者的议题](https://github.com/bridgecrewio/checkov/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)。
你甚至可以通过以下链接使用 Gitpod 在浏览器中一键开始开发:
[](https://gitpod.io/#https://github.com/bridgecrewio/checkov)
想要贡献新的检查项?了解如何编写新的检查(即策略)请[点击这里](https://github.com/bridgecrewio/checkov/blob/main/docs/6.Contribution/Contribution%20Overview.md)。
## 免责声明
`checkov` 不会保存、发布或与任何人共享任何可识别的客户信息。
不会使用任何可识别的客户信息来查询 Prisma Cloud 的公开指南。
`checkov` 使用 Prisma Cloud 的 API 来丰富结果中的修复指南链接。
要跳过此 API 调用,请使用 `--skip-download` 标志。
## 支持
[Prisma Cloud](https://www.prismacloud.io/?utm_source=github&utm_medium=organic_oss&utm_campaign=checkov) 构建并维护 Checkov,使策略即代码变得简单易用。
从我们的[文档](https://www.checkov.io/1.Welcome/Quick%20Start.html)开始,获取快速教程和示例。
## Python 版本支持
我们遵循 Python 的官方支持周期,并对支持的 Python 版本进行自动化测试。
这意味着我们目前支持 Python 3.9 至 3.13(含)。
注意,Python 3.8 已于 2024 年 10 月达到生命周期结束(EOL),Python 3.9 将于 2025 年 10 月达到 EOL。
如果你在使用任何未达到 EOL 的 Python 版本时遇到问题,请提交一个 Issue。