checkov不扫描python业务代码,仅扫描aws cdk合成的cloudformation模板;需先执行cdk synth生成json/yaml,再用checkov -f扫描,或使用--framework cdk(≥2.4.210)自动合成,但显式合成更可靠。

Checkov 不扫描 Python 业务代码,它只扫描用 Python 编写的基础设施即代码(IaC)——准确说是扫描 **AWS CDK 项目生成的 CloudFormation 模板**。如果你直接拿 .py 文件(比如 Flask 启动脚本或数据处理逻辑)去跑 checkov,它会静默跳过,不会报错,也不会给出任何安全提示。
这是最常被误解的一点:工具名里带 “Python”,但它的解析器根本不吃纯 Python 语法。
为什么 checkov -d . 对 CDK 项目没反应?
因为 checkov 默认只识别标准 IaC 文件后缀(.tf、.yml、.json 等),而 CDK 的 .py 文件本身不是目标格式。
- CDK 项目必须先执行
cdk synth或cdk deploy --no-execute,生成cloudformation-template.json类型的输出 -
checkov实际扫描的是这个合成后的 JSON/YAML,不是原始 Python - 如果没运行合成步骤,目录下没有 CFN 模板文件,
checkov -d .就会显示No infrastructure code files found
如何正确扫描 AWS CDK(Python 版)?
关键在于让 checkov 知道你要走 CDK 路径,并自动触发合成 —— 这需要显式启用 --framework cdktf 或 --framework cdk(取决于版本),但更稳的方式是手动合成 + 扫描:
- 确保已安装
aws-cdk-lib和 CLI:npm install -g aws-cdk - 在 CDK 项目根目录运行:
cdk synth > cdk.out/synth.json - 再执行:
checkov -f cdk.out/synth.json - 若想跳过合成阶段直接扫描,可加参数:
checkov -d . --framework cdk(仅 Checkov ≥ 2.4.210 支持,且要求cdk命令在 PATH 中)
注意:--framework cdk 模式下,checkov 会尝试调用 cdk synth 并捕获输出,失败时可能卡住或静默退出 —— 建议优先用显式合成方式。
扫描结果里为什么看不到 Python 变量或函数调用的问题?
因为 checkov 的规则引擎只分析资源定义结构(例如 aws_s3.CfnBucket 是否设置了 public_access_block_configuration),不解析 Python 控制流或变量绑定。
- 它能发现:
access_control="PublicRead"这种硬编码风险 - 它无法发现:
bucket_acl = os.getenv("BUCKET_ACL")这种动态赋值是否安全 - 它不检查:
lambda.Function的code参数是否引用了含漏洞的 ZIP 包内容
这类问题得靠 bandit 或 semgrep 配合做 Python 层扫描,和 checkov 是互补关系,不是替代关系。
真正容易被忽略的是:CDK 合成模板里的资源 ID、条件判断、Fn::Sub 表达式等上下文信息,会影响某些策略的实际生效范围。比如一个 CfnBucket 被包在 if 块里,但合成后仍生成资源 —— checkov 看到的是最终 JSON,不是 Python 逻辑。这意味着你得确保合成环境和部署环境一致,否则扫描结果可能漏掉条件分支下的不安全配置。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











