Docker Bench for Security社区贡献指南:如何提交自定义安全检查规则
你是否在使用Docker Bench for Security时发现缺少特定场景的安全检查规则?作为容器安全领域最受欢迎的开源检测工具,Docker Bench for Security(以下简称DBFS)通过社区协作持续完善其安全检测能力。本文将详细介绍如何为DBFS项目贡献自定义安全检查规则,帮助你将实战经验转化为社区共同财富。读完本文后,你将掌握从环境搭建到规则提交的完整流程,包括测试编写、代码规范和PR提交流程。
开发环境准备
在开始编写自定义规则前,需要准备符合项目要求的开发环境。DBFS采用Shell脚本开发,核心检测逻辑分散在不同测试模块中。
首先通过国内镜像仓库克隆项目代码:
git clone https://gitcode.com/gh_mirrors/do/docker-bench-security.git
cd docker-bench-security
项目提供两种运行方式,本地直接执行脚本或通过Docker容器运行:
# 本地直接运行
sudo sh docker-bench-security.sh
# 容器化运行
docker build -t docker-bench-security .
docker run --net host --pid host --cap-add audit_control \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/lib/systemd:/usr/lib/systemd \
-v /etc:/etc --label docker_bench_security \
docker-bench-security
项目核心文件结构如下,安全检查规则主要位于tests/目录:
docker-bench-security/
├── docker-bench-security.sh # 主程序入口
├── functions/ # 辅助函数库
└── tests/ # 安全检查规则目录
├── 1_host_configuration.sh
├── ...
└── 99_community_checks.sh # 社区贡献规则存放位置
安全检查规则开发规范
DBFS的安全检查规则遵循统一的开发规范,确保代码质量和检测一致性。所有社区贡献的自定义规则必须放置在tests/99_community_checks.sh文件中,采用特定的命名和结构规范。
规则命名规范
社区贡献的检查规则采用C.x.x编号体系,其中:
- C表示社区贡献(Community)
- 第一位数字表示大类(如C.1表示示例检查)
- 后续数字表示细分检查项(如C.5.3.1表示容器运行时相关检查)
函数命名必须遵循check_c_*格式,如check_c_5_3_1对应编号C.5.3.1的检查规则。
规则结构模板
每个检查规则需包含标准结构,以下是自动化检查的基础模板:
check_c_x_y() {
local id="C.x.y" # 规则唯一标识符
local desc="检查规则描述" # 简洁描述检查目的
local remediation="修复建议" # 安全问题的修复步骤
local remediationImpact="修复影响" # 修复操作可能带来的影响
local check="$id - $desc" # 检查项标题
starttestjson "$id" "$desc" # JSON日志初始化
# 检查逻辑实现
if [ 检查条件 ]; then
pass -s "$check" # 检查通过
logcheckresult "PASS"
return
fi
# 多级判断示例
if [ 警告条件 ]; then
warn -s "$check" # 检查警告
logcheckresult "WARN" "问题详情" "相关容器列表"
return
fi
note -c "$check" # 信息提示
logcheckresult "INFO"
}
上述模板中使用的核心函数来自项目的函数库:
pass()/warn()/note(): 结果输出函数,定义于functions/output_lib.shstarttestjson()/logcheckresult(): JSON日志函数,用于生成机器可读报告
编写自定义检查规则实战
以下通过两个具体示例,演示如何编写不同类型的安全检查规则。
示例1:容器特权模式检查
假设需要添加一个检查容器是否启用特权模式的规则,这是一个典型的容器运行时安全问题。
check_c_5_4_1() {
local id="C.5.4.1"
local desc="Ensure containers are not running with privileged mode enabled"
local remediation="Add --cap-drop=ALL or specific capabilities instead of using --privileged flag"
local remediationImpact="May break containers requiring specific system capabilities"
local check="$id - $desc"
starttestjson "$id" "$desc"
local fail=0
local priv_containers=""
# 遍历所有运行中的容器
for c in $(docker ps -q --no-trunc); do
# 检查容器是否启用特权模式
if docker inspect --format '{{.HostConfig.Privileged}}' "$c" | grep -q "true"; then
if [ $fail -eq 0 ]; then
warn -s "$check"
fail=1
fi
priv_containers="$priv_containers $(docker inspect --format '{{.Name}}' "$c" | sed 's/^\///')"
fi
done
if [ $fail -eq 0 ]; then
pass -s "$check"
logcheckresult "PASS"
else
logcheckresult "WARN" "Privileged containers found" "$priv_containers"
fi
}
此规则实现了以下功能:
- 遍历所有运行中的容器
- 使用
docker inspect检查Privileged配置项 - 收集违规容器名称并生成警告报告
- 符合项目的JSON日志规范
示例2:镜像漏洞扫描检查
对于需要外部工具支持的检查(如镜像漏洞扫描),可实现为手动检查规则:
check_c_4_13() {
local id="C.4.13"
local desc="Ensure container images are scanned for vulnerabilities"
local remediation="Implement automated image scanning using Trivy, Clair or Docker Scout"
local remediationImpact="Adds scanning step to CI/CD pipeline, may increase build time"
local check="$id - $desc"
starttestjson "$id" "$desc"
# 检查是否安装了扫描工具(以Trivy为例)
if command -v trivy &> /dev/null; then
info -c "$check"
logcheckresult "INFO" "Trivy detected, consider adding to CI/CD pipeline"
return
fi
note -c "$check"
logcheckresult "NOTE" "No vulnerability scanning tool detected"
}
这类规则通常用于推荐最佳实践,而非强制执行特定配置,通过info或note级别提示用户。
规则集成与测试
编写完成的规则需要正确集成到项目框架中才能被执行,同时必须通过代码质量检查。
规则注册
社区贡献的检查规则需要在两个地方进行注册:
- 在
tests/99_community_checks.sh的community_checks()函数中添加调用:
community_checks() {
check_c
check_c_1
check_c_1_1
check_c_2
# ... 现有规则 ...
check_c_5_4_1 # 添加新规则调用
check_c_4_13 # 添加新规则调用
check_c_end
}
- 在functions/functions_lib.sh的
community_checks()函数中确保包含社区检查入口:
community_checks() {
check_c
check_c_1
check_c_1_1
check_c_2
check_c_5_3_1
check_c_5_3_2
check_c_5_3_3
check_c_5_3_4
check_c_end
}
本地测试流程
新规则编写完成后,需进行全面测试确保质量:
- 代码规范检查:使用ShellCheck验证脚本语法
shellcheck tests/99_community_checks.sh
- 功能测试:运行修改后的DBFS并验证新规则
# 仅运行社区检查规则
sudo sh docker-bench-security.sh -c
- 结果验证:检查输出是否包含新规则及正确结果
grep "C.5.4.1" docker-bench-security.log
贡献代码提交流程
完成规则开发和测试后,即可按照开源项目规范提交贡献。
代码提交规范
提交代码需遵循项目的提交信息规范,格式如下:
check: add C.5.4.1 privileged mode check
- Detect containers running with --privileged flag
- Add remediation steps for capability management
- Fixes #123 (如关联issues)
所有提交必须签署DCO(Developer Certificate of Origin):
git commit -s -m "check: add C.5.4.1 privileged mode check"
Pull Request流程
- 创建分支:从
main分支创建特性分支
git checkout -b feature/add-privileged-check
-
提交变更:确保仅包含相关变更,避免格式化等无关修改
-
创建PR:通过GitCode平台提交PR,PR描述需包含:
- 检查规则的目的和依据
- 测试方法和结果
- 相关安全最佳实践文档链接
-
代码审查:项目维护者会进行代码审查,可能需要根据反馈进行修改
项目维护者信息可参考MAINTAINERS文件,PR将由核心团队成员审核。
社区贡献最佳实践
为提高贡献被接受的概率,建议遵循以下社区贡献最佳实践:
规则设计原则
- 针对性:聚焦特定安全问题,避免过于宽泛的检查
- 可操作性:提供清晰的修复建议,包含具体命令示例
- 兼容性:考虑不同Docker版本和操作系统差异
- 性能影响:避免资源密集型操作,对大规模环境友好
文档完善
优秀的社区贡献应包含完善的文档:
- 在规则描述中引用权威安全标准(如CIS、NIST)
- 提供修复步骤的具体命令示例
- 说明检查规则的适用场景和局限性
持续改进
DBFS项目处于活跃开发中,贡献者应:
- 关注CONTRIBUTING.md文档更新
- 参与Issue讨论,帮助解决社区问题
- 定期同步上游代码,避免分支冲突
总结与展望
通过本文介绍的方法,你可以将自己的容器安全实践转化为社区共享的检查规则,帮助全球Docker用户提升容器部署安全性。随着云原生技术的发展,DBFS项目将持续扩展其检查覆盖范围,未来可能支持Kubernetes环境检查、镜像供应链安全等新兴领域。
如果你在贡献过程中遇到问题,可通过项目Issue系统寻求帮助。期待你的贡献能让Docker生态更加安全!
点赞收藏本文,关注容器安全系列文章,下期将带来"Docker Bench规则编写高级技巧"。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




