# SDL_Devsecops_Mini **Repository Path**: sdl_devsecs/SDL_Devsecops_Mini ## Basic Information - **Project Name**: SDL_Devsecops_Mini - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-16 - **Last Updated**: 2026-02-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SDL DevSecOps Mini(Python + GitHub Actions) ## Day 1 范围 Day 1 只定义稳定的“漏洞归一化数据模型”。 本阶段不实现门禁决策逻辑。 ## 输入输出约定 ### 输入 - 扫描工具原始报告(JSON) - 初始适配器目标:`Bandit`、`Semgrep`(IAST 适配器后续补充) ### 输出 - 归一化报告 JSON,顶层字段固定为: - `summary` - `findings` - `decision` - `reasons` - 当前参考样例: - `samples/normalized_findings.json` - 正式 Schema: - `schemas/normalized_findings.schema.json` ## 归一化漏洞字段(v1) `findings[]` 中的每条漏洞需包含以下字段: - `id`:漏洞唯一标识 - `tool`:来源扫描器名称 - `type`:归一化后的漏洞类型 - `severity`:漏洞级别,取值为 `Critical|High|Medium|Low` - `file`:相对文件路径 - `line`:漏洞所在行号 - `message`:漏洞简要描述 - `evidence`:扫描器给出的证据代码/片段 - `cwe`:CWE 编号(可选,建议保留) - `fix_hint`:修复提示(解析阶段可选,报告阶段建议提供) ## Day 1 完成标准 - 统一模型已固定并文档化。 - `samples/normalized_findings.json` 可通过 Schema 校验。 - 后续阶段仅消费归一化数据,不直接依赖原始扫描格式。 ## Day 2 快速开始(规则 DSL + 门禁) ```bash pip install -r requirements.txt python -m src.cli gate \ --input samples/normalized_findings.json \ --rules rules/gate-policy.yml \ --output samples/gate_result.json ``` 退出码约定: - `1` => `block`(CI 失败) - `0` => `warn/suggest`(CI 通过) ## Day 3 快速开始(Bandit 解析器) ```bash python -m src.cli parse-bandit \ --input samples/bandit.json \ --output samples/normalized_from_bandit.json ``` 解析完成后可继续执行门禁: ```bash python -m src.cli gate \ --input samples/normalized_from_bandit.json \ --rules rules/gate-policy.yml \ --output samples/gate_result_from_bandit.json ``` ## Day 4 快速开始(Semgrep 解析器) ```bash python -m src.cli parse-semgrep \ --input samples/semgrep.json \ --output samples/normalized_from_semgrep.json ``` 解析完成后可继续执行门禁: ```bash python -m src.cli gate \ --input samples/normalized_from_semgrep.json \ --rules rules/gate-policy.yml \ --output samples/gate_result_from_semgrep.json ``` ## Day 5 快速开始(规则引擎与门禁决策) Day 5 重点能力: - 支持规则条件:`severity_gte`、`severity_lte`、`type_in`、`count_gte` - 最终决策优先级:`block > warn > suggest` - CLI 退出码:`block=1`,`warn/suggest=0` 验证规则引擎测试: ```bash python -m unittest tests/test_rule_engine.py ``` 验证门禁输出(Bandit 样例): ```bash python -m src.cli gate \ --input samples/normalized_from_bandit.json \ --rules rules/gate-policy.yml \ --output samples/gate_result_from_bandit.json ``` 说明: - `reasons` 仅展示“最终决策动作”对应规则,减少噪音。 - `matched_rules` 保留全部命中规则,便于排查与审计。 ## Day 6 快速开始(修复建议模板库) 模板目录: - `fix_templates/sql_injection.md` - `fix_templates/xss.md` - `fix_templates/hardcoded_secret.md` - `fix_templates/command_injection.md` - `fix_templates/insecure_tempfile.md` 门禁阶段会自动为每条漏洞附加: - `fix_guidance`:模板正文(Markdown) - `fix_template_source`:模板来源路径(或 `default`) 运行验证: ```bash python -m unittest tests/test_fix_guidance.py python -m src.cli gate \ --input samples/normalized_from_semgrep.json \ --rules rules/gate-policy.yml \ --output samples/gate_result_from_semgrep.json ``` ## Day 7 快速开始(GitHub Actions 门禁) 工作流文件: - `.github/workflows/sdl-gate.yml` 触发方式: - `pull_request` - `workflow_dispatch` 工作流动作: 1. 解析 Bandit/Semgrep 样例报告 2. 执行 `gate` 门禁决策(`block` 时退出码为 1,流水线失败) 3. 上传 `samples/*.json` 结果为 Artifact 建议在 GitHub 仓库中开启分支保护: - 将 `SDL Gate / sdl-gate` 设为 Required Status Check - 这样 PR 必须通过门禁后才可合并