mcpField
B
building-devsecops-pipeline-with-gitlab-ci

building-devsecops-pipeline-with-gitlab-ci

github.com/mukul975安全35.2k230 次安装8 周前更新
代码仓库

关于 building-devsecops-pipeline-with-gitlab-ci

面向使用 GitLab CI 的团队,本技能介绍将安全扫描嵌入 CI/CD 流水线的方法,涵盖漏洞检测、策略控制与结果管理。

主要功能

  1. 01配置 SAST、DAST 和容器扫描
  2. 02检测依赖漏洞与泄露密钥
  3. 03设置安全扫描与审批策略
  4. 04查看漏洞报告和合并请求结果
  5. 05优化并行及增量扫描

适用场景

  1. 01为项目构建 DevSecOps 流水线
  2. 02在部署前检测应用和容器风险
  3. 03依据合规要求强制执行安全检查

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mukul975/anthropic-cybersecurity-skills --skill building-devsecops-pipeline-with-gitlab-ci

安装后在 Claude Code 中输入/building-devsecops-pipeline-with-gitlab-ci确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.py

详细介绍

使用 GitLab CI 构建 DevSecOps 流水线

概述

GitLab 提供了一体化的 DevSecOps 平台,将安全测试直接嵌入 CI/CD 流水线。借助 GitLab 内置的安全扫描器——SAST、DAST、容器扫描、依赖项扫描、密钥检测和许可证合规——团队可以将安全左移,在开发阶段而非部署后捕获漏洞。GitLab Duo AI 可协助检测 SAST 漏洞的误报,帮助安全团队专注于真正的问题。

适用场景

  • 在环境中部署或配置使用 GitLab CI 构建 DevSecOps 流水线相关能力时
  • 建立符合合规要求的安全控制措施时
  • 为该领域构建或改进安全架构时
  • 开展需要此实现的安全评估时

前提条件

  • GitLab Ultimate 许可证(完整安全扫描器套件所必需)
  • 已配置 GitLab Runner(共享或可自托管)
  • 熟悉 .gitlab-ci.yml 流水线配置
  • 使用 Docker-in-Docker(DinD)或 Kaniko 进行容器构建
  • 应用已部署到预发布环境以供 DAST 扫描

核心安全扫描阶段

静态应用安全测试(SAST)

SAST 在编译前分析源代码中的漏洞。GitLab 通过 Semgrep、SpotBugs、Gosec、Bandit 和 NodeJsScan 等分析器支持 14 种以上语言。最简单的引入方式是使用 GitLab 托管模板。

动态应用安全测试(DAST)

DAST 通过向 HTTP 端点模拟攻击载荷来测试运行中的应用。它可以检测 XSS、SQLi、CSRF 等静态分析无法发现的运行时漏洞。DAST 需要一个已部署、可访问的目标 URL。

容器扫描

使用 Trivy 扫描 Docker 镜像,检测操作系统包和应用依赖项中的已知 CVE。在 Docker 构建阶段之后运行,在镜像进入镜像仓库之前进行把关。

依赖项扫描

检查依赖项清单文件(package.json、requirements.txt、pom.xml、Gemfile.lock)中已知的存在漏洞的版本。在源代码层面运行,与容器扫描形成互补。

密钥检测

使用模式匹配和熵分析扫描提交内容中意外提交的凭据、API 密钥、令牌和私钥。在每次提交时运行,防止密钥进入代码仓库。

实施

完整流水线配置
# .gitlab-ci.yml

stages:
  - build
  - test
  - security
  - deploy-staging
  - dast
  - deploy-production

variables:
  DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
  SECURE_LOG_LEVEL: "info"

# Include GitLab managed security templates
include:
  - template: Security/SAST.gitlab-ci.yml
  - template: Security/Secret-Detection.gitlab-ci.yml
  - template: Security/Dependency-Scanning.gitlab-ci.yml
  - template: Security/Container-Scanning.gitlab-ci.yml
  - template: DAST.gitlab-ci.yml
  - template: Security/License-Scanning.gitlab-ci.yml

build:
  stage: build
  image: docker:24.0
  services:
    - docker:24.0-dind
  variables:
    DOCKER_TLS_CERTDIR: "/certs"
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  rules:
    - if: $CI_COMMIT_BRANCH

unit-tests:
  stage: test
  image: $DOCKER_IMAGE
  script:
    - npm ci
    - npm run test:coverage
  coverage: '/Lines\s*:\s*(\d+\.?\d*)%/'
  artifacts:
    reports:
      junit: junit-report.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml

# Override SAST to run in security stage
sast:
  stage: security
  variables:
    SAST_EXCLUDED_PATHS: "spec,test,tests,tmp,node_modules"
    SEARCH_MAX_DEPTH: 10

# Override container scanning
container_scanning:
  stage: security
  variables:
    CS_IMAGE: $DOCKER_IMAGE
    CS_SEVERITY_THRESHOLD: "HIGH"

# Override dependency scanning
dependency_scanning:
  stage: security

# Override secret detection
secret_detection:
  stage: security

# License compliance scanning
license_scanning:
  stage: security

deploy-staging:
  stage: deploy-staging
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/app app=$DOCKER_IMAGE -n staging
    - kubectl rollout status deployment/app -n staging --timeout=300s
  environment:
    name: staging
    url: https://staging.example.com
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

# DAST runs against deployed staging
dast:
  stage: dast
  variables:
    DAST_WEBSITE: https://staging.example.com
    DAST_FULL_SCAN_ENABLED: "true"
    DAST_BROWSER_SCAN: "true"
  needs:
    - deploy-staging
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

deploy-production:
  stage: deploy-production
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/app app=$DOCKER_IMAGE -n production
    - kubectl rollout status deployment/app -n production --timeout=300s
  environment:
    name: production
    url: https://app.example.com
  when: manual
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
安全审批策略

配置扫描执行策略以强制执行必要的安全扫描:

  1. 导航至 Security & Compliance > Policies
  2. 创建一项“Scan Execution Policy”,要求在所有分支上执行 SAST 和密钥检测
  3. 创建一项“Merge Request Approval Policy”,要求在检测到严重漏洞时获得安全团队审批
自定义 SAST 规则集配置

创建 .gitlab/sast-ruleset.toml 以自定义分析器行为:

[semgrep]
  [[semgrep.ruleset]]
    dirs = ["src"]

  [[semgrep.passthrough]]
    type = "url"
    target = "/sgrep-rules/custom-rules.yml"
    value = "https://semgrep.dev/p/owasp-top-ten"

  [[semgrep.passthrough]]
    type = "url"
    target = "/sgrep-rules/java-rules.yml"
    value = "https://semgrep.dev/p/java"

安全仪表盘与漏洞管理

漏洞报告

GitLab 将所有扫描器的发现结果汇总到一份统一的漏洞报告中,可通过 Security & Compliance > Vulnerability Report 访问。每个漏洞包含:

  • 严重性等级(Critical、High、Medium、Low、Info)
  • 扫描器来源(SAST、DAST、Container、Dependency、Secret)
  • 在源代码或镜像层中的位置
  • 修复指导和建议的修复方案
  • 状态跟踪(Detected、Confirmed、Dismissed、Resolved)
合并请求安全小组件

每个合并请求都会显示一个安全扫描小组件,展示:

  • 该 MR 引入的新漏洞
  • 该 MR 修复的漏洞
  • 与目标分支基线的对比

流水线优化

  • 并行执行:安全扫描器在安全阶段并发运行
  • 缓存:使用 CI 缓存缓存依赖下载,以加快扫描速度
  • 增量扫描:SAST 可使用 SAST_INCREMENTAL: "true" 仅扫描已更改的文件
  • 失败条件:在关键扫描器上设置 allow_failure: false,以强制执行质量门禁

监控与指标

指标描述目标
流水线安全覆盖率已启用所有扫描器的项目百分比> 95%
严重漏洞 MTTR严重发现从检测到解决的时间< 48 小时
误报率被驳回为误报的发现所占百分比< 15%
密钥检测拦截率被推送规则拦截的密钥提交所占百分比> 99%

参考资料

评论

支持 Markdown