## 聊聊 Python 里的 Checkov:一个容易被忽略的“基础设施安检员”
如果你写过一些 Python 项目,尤其是那些需要和云服务、Docker 或者 Kubernetes 打交道的,可能遇到过这样的场景:代码跑得好好的,逻辑也没问题,但一部署到线上,权限不对、配置漏了、安全组没开……各种和环境相关的问题就冒出来了。这些问题往往不是业务逻辑错误,而是基础设施即代码(IaC)的配置有疏漏。
今天想聊的 Checkov,就是专门用来对付这类问题的工具。它不是用来检查 Python 语法或者逻辑的,而是用来检查那些描述基础设施的代码文件是否“健康”的。你可以把它想象成一个专门为云基础设施配置准备的、非常严格的代码审查员。
它究竟是什么?
简单来说,Checkov 是一个用 Python 写的静态代码分析工具。但它的分析对象很特别,不是.py文件,而是像 Terraform 的.tf文件、CloudFormation 的 YAML/JSON、Kubernetes 的 manifest 文件,甚至 Dockerfile 和 Helm charts。它的核心工作是,在这些文件真正变成云上的服务器、数据库或网络之前,提前扫描一遍,找出里面不符合安全最佳实践和合规性要求的配置。
比如,你在 Terraform 里定义了一个 AWS S3 存储桶,如果忘了设置“禁止公开访问”这个属性,Checkov 就会立刻标记出来。它内置了成百上千条规则,这些规则来自 CIS 基准、AWS 安全最佳实践、PCI-DSS 标准等,就像一个经验丰富的运维专家,把他踩过的所有坑都总结成了检查清单。
它能解决什么问题?
最大的价值是左移安全。在传统的开发流程里,安全检查往往是在部署前甚至部署后,由另一个团队来做的。这时候发现问题,修复成本已经很高了。Checkov 让开发者在自己写 IaC 代码的时候,就能第一时间得到反馈。
举个例子,你正在用 Terraform 编写一个自动创建数据库的模块。你心里可能只想着连接字符串和密码,但 Checkov 会提醒你:“这个数据库实例的存储加密开关没开”,“它的备份保留期设置得太短了”,“关联的安全组规则似乎允许了来自全网的访问”。这些提醒,能让你在代码提交到仓库之前,就堵上很多潜在的安全漏洞和运维隐患。
它尤其适合整合到 CI/CD 流水线里。每次有人提交一个 Pull Request,修改了基础设施代码,流水线可以自动运行 Checkov 扫描。如果发现了高风险问题,流水线可以直接失败,阻止不安全的配置被合并和部署。这相当于给基础设施的变更加了一道自动化的安检门。
上手使用其实很简单
安装 Checkov 只需要一条 pip 命令:pip install checkov。之后,最基本的用法就是指向你要扫描的目录或文件。
假设你有一个存放 Terraform 代码的文件夹叫my-infra/,那么打开终端,进入该目录的父级目录,运行:
checkov-dmy-infra/它就会自动识别目录下的.tf文件,并开始逐条规则进行扫描。扫描结果会在终端里清晰地列出来,每条结果会告诉你:在哪个文件的第几行,违反了哪条规则(比如 “CKV_AWS_18”),严重程度是高、中还是低,以及一个简短的描述。
对于更精细的控制,你可以只扫描特定类型的文件,比如--framework terraform;也可以指定只输出某种格式的报告,例如--output junitxml以便在 Jenkins 等工具中展示。如果你所在的公司有内部的安全规范,Checkov 也支持用 Python 来编写自定义规则,这给了它很强的扩展性。
一些值得分享的使用心得
刚开始用的时候,很容易被它报出的一大堆“问题”吓到,尤其是扫描一个遗留项目时。这时候,更好的做法不是试图一次性修复所有问题,而是利用它的--skip-check参数,先把那些确实不适用或需要延期处理的规则 ID 跳过,让流水线能先跑通。然后,再像还技术债一样,逐步解决这些问题。
把它和pre-commit这样的 Git 钩子工具结合起来,体验会非常好。这样每次执行git commit时,它就会自动扫描本次提交改动的 IaC 文件,给出即时反馈,真正把检查做到了“左移”的极限。
另外,不要只把它当成一个“错误查找器”。它输出的报告,其实是一个非常好的学习资料。每一条它捕捉到的问题,背后都对应着一个真实世界中的安全事件或运维故障。多看看这些提示,能快速积累起在云上设计基础设施的安全意识。
和同类工具的对比
市面上做 IaC 扫描的工具不少,比如tfsec、Terrascan,还有云厂商自己出的安全工具。Checkov 的一个明显优势是它的多框架支持。在一个项目里,你可能同时用了 Terraform、几个 Kubernetes YAML 和 Dockerfile。用 Checkov 可以一次扫描所有类型,统一出报告,而不用在几个工具间切换。
另一个特点是它的可编程性。因为它是用 Python 写的,对于 Python 开发者来说,无论是安装、调试还是编写自定义规则,心理负担都小很多。社区也非常活跃,不断有新的规则加入,对主流云服务商(AWS, Azure, GCP)的支持更新很快。
当然,它也不是没有缺点。比如,扫描大型的 Terraform 项目时,速度可能不如一些用 Go 写的专用工具快。但总的来说,对于大多数项目,尤其是那些技术栈混合、且团队熟悉 Python 的环境,Checkov 提供了一个在功能、易用性和扩展性上非常平衡的选择。
说到底,Checkov 这类工具的出现,反映了一个趋势:基础设施的管理已经变得和编写应用代码一样重要,甚至更需要严谨性。毕竟,一个应用 Bug 可能影响部分功能,而一个云存储桶的错误配置,可能导致公司数据直接暴露在公网上。让工具来帮我们记住这些琐碎又关键的安全细节,我们就可以更专注于架构和业务逻辑本身了。