SuperAPI AI 工具集

implementing-devsecops-security-scanning

安全与审计

查看项目

更新于 10-15 13:53

技能介绍

用途

本技能用于在新建或已有的 CI/CD 流水线中搭建自动化安全扫描,实现安全左移,在代码进入生产环境前发现漏洞;同时满足 SOC 2、PCI-DSS、ISO 27001 等要求自动化安全测试的合规需求,并建立可阻断含严重漏洞部署的安全门禁。

需要说明的是,它不能替代人工渗透测试。自动化扫描能发现常见漏洞模式,但无法替代人工对业务逻辑缺陷和复杂攻击链的安全评估。

主要能力

  • 密钥检测:使用 Gitleaks 扫描仓库历史与提交,发现硬编码凭据。
  • SAST:使用 Semgrep 做静态代码分析,查找安全漏洞、缺陷与代码模式,支持自定义规则。
  • SCA 与容器扫描:使用 Trivy 扫描依赖、容器镜像、IaC 文件(Terraform、CloudFormation),并可生成 SBOM。
  • DAST:使用 OWASP ZAP 对已部署的预发布环境发起请求并分析响应,发现运行时问题。
  • 结果聚合与安全门禁:汇总各扫描结果,按严重级别阈值阻断流水线。
  • 分支保护:将安全流水线设为合并前必须通过的状态检查。
  • 开发者反馈闭环:通过 pre-commit 钩子在本地提交前捕获问题。

使用方式

前置条件包括:CI/CD 平台(GitHub Actions、GitLab CI、Jenkins 或 Azure DevOps)、用于运行扫描工具的容器运行时(Docker)、用于 DAST 的预发布环境 URL(DAST 无法测试静态代码)、具备修改 CI/CD 工作流文件权限的仓库访问权。工具要求:Semgrep 对开源规则集(p/security-audit、p/owasp-top-ten)免费;Trivy 免费且无需账号;OWASP ZAP 免费并提供 Docker 镜像;Gitleaks 免费且无需账号。

工作流分为七步:

  1. 用 Gitleaks 添加密钥检测。密钥检测最先运行,因为泄露的凭据是最高优先级发现。在 .github/workflows/security.yml 中配置 secrets-scan 作业,检出时使用 fetch-depth: 0 以扫描全部提交历史,并通过 gitleaks/gitleaks-action@v2 运行。可在仓库根目录用 .gitleaks.toml 配置自定义规则与允许列表,示例包含 [extend] useDefault = true、[allowlist] 的 paths 列表,以及自定义规则 custom-internal-api-key(正则 INTERNAL_KEY_[A-Za-z0-9]{32})。

  2. 用 Semgrep 添加 SAST 扫描。在容器镜像 semgrep/semgrep 中运行 semgrep scan,使用 --config p/security-audit、--config p/owasp-top-ten、--config p/secrets,配合 --severity ERROR、--error、--json、--output semgrep-results.json,并用 actions/upload-artifact@v4 上传结果。自定义规则可放在 .semgrep/custom-rules.yml,示例规则包括 no-exec-user-input(检测用户输入传入 exec(),CWE-78)与 no-raw-sql-queries(检测字符串拼接或 f-string 构造 SQL,CWE-89)。

  3. 用 Trivy 添加 SCA 扫描。使用 aquasecurity/trivy-action@0.28.0,分别执行文件系统扫描(scan-type: 'fs')与 IaC 扫描(scan-type: 'config'),严重级别设为 CRITICAL,HIGH,exit-code 为 '1',输出 JSON 并上传。容器扫描作业在 SAST 通过后构建镜像(needs: [sast-scan]),扫描镜像并生成 CycloneDX 格式 SBOM,作为构建产物上传。

  4. 用 OWASP ZAP 添加 DAST 扫描。DAST 针对已部署的预发布环境运行,比 SAST/SCA 慢,应异步或按计划运行。使用 zaproxy/action-baseline@v0.14.0 做基线扫描(适合 CI),通过 rules_file_name 指定 .zap/rules.tsv;夜间完整扫描可改用 zaproxy/action-full-scan@v0.12.0。rules.tsv 用于配置告警阈值,示例将部分 Cookie 相关告警设为 IGNORE 或 WARN,将 CSP 未设置、反射型与持久型 XSS、SQL 注入、服务端代码注入、远程 OS 命令注入设为 FAIL。

  5. 聚合结果并执行安全门禁。创建 security-gate 作业,依赖 secrets-scan、sast-scan、sca-scan、container-scan,使用 if: always(),逐一检查各上游作业结果,任一失败即输出 BLOCKED 并以 exit 1 终止流水线。

  6. 配置分支保护规则。在 GitHub 仓库 Settings > Branches > Branch Protection Rules 中,对 main 分支启用合并前必须通过状态检查,将 Secrets Detection (Gitleaks)、SAST (Semgrep)、SCA & Container Scan (Trivy)、Security Gate 设为必需检查,并启用合并前分支需保持最新。

  7. 建立开发者反馈闭环。通过 .pre-commit-config.yaml 配置 gitleaks 与 semgrep 钩子(semgrep 参数为 --config p/security-audit --config p/owasp-top-ten --error),然后执行 pip install pre-commit、pre-commit install,并用 pre-commit run --all-files 对现有代码库测试。

关键概念

  • SAST:不执行代码分析源码以发现安全漏洞,运行快、能早期发现问题,但无法发现运行时缺陷。
  • DAST:向运行中的应用发送请求并分析响应,能发现运行时问题,但需要已部署环境。
  • SCA:将项目依赖与漏洞数据库(NVD、GitHub Advisory)比对,发现已知存在漏洞的库。
  • SBOM:应用全部组件与依赖的机器可读清单,用于漏洞跟踪与合规。
  • Shift Left:将安全测试从部署后前移到提交前与 CI 阶段的安全实践。
  • 安全门禁:CI/CD 流水线检查点,当扫描结果超过定义的严重级别阈值时阻断部署。
  • Pre-commit 钩子:本地 Git 钩子,在代码提交前运行安全检查,提供最快的开发者反馈。

验证要点

Gitleaks 能阻断含硬编码密钥的提交与 PR(可用假 API 密钥测试);Semgrep 在每次 PR 运行并以注解或评论报告发现;Trivy 文件系统扫描能检测已知存在漏洞的依赖(可添加易受攻击的包测试);Trivy 容器扫描能对构建的 Docker 镜像成功运行;SBOM 以 CycloneDX 或 SPDX 格式生成并作为构建产物存储;OWASP ZAP 基线扫描能对预发布 URL 运行且不崩溃;当任一扫描发现严重/高危问题时安全门禁作业阻断合并到 main;分支保护规则在合并前强制执行必需状态检查;pre-commit 钩子在推送前本地捕获密钥与 SAST 发现;开发者文档说明如何解读扫描结果并修复常见发现。

适用场景与限制

适用场景包括:在新建或已有 CI/CD 流水线中设置自动化安全扫描;通过安全左移在代码进入生产前捕获漏洞;满足要求自动化安全测试的合规要求;组合 SAST、DAST、SCA 实现较全面的应用安全覆盖;建立阻断含严重或高危漏洞部署的安全门禁。

限制:不能替代人工渗透测试,自动化扫描无法覆盖业务逻辑缺陷与复杂攻击链;DAST 需要已部署的预发布环境,无法测试静态代码,且运行较慢,宜异步或按计划执行。