Checkov扫描结果中的硬性失败与软性失败机制解析
概述
在基础设施即代码(IaC)安全扫描工具Checkov中,扫描结果的判定机制是保障CI/CD流程顺畅运行的关键。本文将深入探讨Checkov中的硬性失败(hard fail)和软性失败(soft fail)机制,帮助开发者根据实际需求灵活配置扫描策略。
基本概念
退出代码含义
Checkov扫描结束后会返回以下两种退出代码:
0
:表示扫描通过(可能是所有检查都通过,或者存在软性失败)1
:表示扫描失败(存在硬性失败)
失败类型定义
-
硬性失败:当检查发现问题且配置为必须修复时,Checkov会返回退出代码
1
,通常会导致CI/CD流程中断。 -
软性失败:虽然检查发现了问题,但被标记为可容忍的,Checkov仍返回退出代码
0
,不会中断CI/CD流程。
核心配置参数
全局软性失败参数
--soft-fail
(简写-s
):
- 作用:强制所有检查结果都视为软性失败
- 使用场景:在开发环境或测试阶段,希望发现问题但不中断流程
精细化控制参数
-
--soft-fail-on
:- 功能:指定哪些检查ID或严重级别应被视为软性失败
- 匹配规则:当检查的严重级别小于等于指定级别时视为匹配
- 多级别处理:若指定多个级别,取最高级别作为阈值
-
--hard-fail-on
:- 功能:指定哪些检查ID或严重级别必须视为硬性失败
- 匹配规则:当检查的严重级别大于等于指定级别时视为匹配
- 多级别处理:若指定多个级别,取最低级别作为阈值
组合逻辑与优先级
当同时使用多个参数时,Checkov会按照以下优先级顺序评估每个失败的检查:
- 检查ID是否明确匹配
--hard-fail-on
列表(支持通配符) - 检查ID是否明确匹配
--soft-fail-on
列表(支持通配符) - 检查严重级别是否达到
--hard-fail-on
设定的阈值 - 检查严重级别是否低于
--soft-fail-on
设定的阈值 - 以上都不匹配时,回退到
--soft-fail
的全局设置
最终结果判定:
- 只要有一个失败检查被判定为硬性失败,整个扫描就会返回硬性失败
- 所有失败检查都是软性失败时,才会返回软性失败
实践示例
假设扫描发现两个问题:
| 策略ID | 严重级别 | |---------|----------| | CKV_123 | 低 | | CKV_789 | 高 |
不同参数组合下的结果:
-
--soft-fail true
:- 结果:0(软性失败)
- 说明:强制所有失败转为软性
-
--soft-fail-on CKV_123
:- 结果:1(硬性失败)
- 说明:CKV_789未匹配任何软性条件
-
--hard-fail-on HIGH
:- 结果:1(硬性失败)
- 说明:CKV_789达到硬性阈值
-
--soft-fail-on LOW --hard-fail-on CKV_123
:- 结果:1(硬性失败)
- 说明:显式硬性匹配优先
平台级强制执行规则
Checkov支持从安全平台下载预定义的强制执行规则,实现集中化管理:
- 启用方式:使用
--use-enforcement-rules
参数配合平台API密钥 - 优势:可按扫描类型(IaC、密钥、SCA等)分别设置不同的硬性失败阈值
- 与本地参数的关系:
--soft-fail
会覆盖所有强制执行规则- 仅含检查ID的参数会与规则合并
- 含严重级别的参数会覆盖对应规则
最佳实践建议
- 开发环境:使用
--soft-fail
确保流程不被阻断,同时收集问题 - 预发布环境:结合
--hard-fail-on HIGH
确保关键问题必须修复 - 生产环境:配置严格的强制执行规则,并配合精细化的检查ID控制
- 渐进式严格:随着环境接近生产,逐步提高硬性失败的严重级别阈值
通过合理配置硬性失败和软性失败机制,团队可以在安全性和开发效率之间取得平衡,实现安全左移的同时不影响开发体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考