本节摘要:DevSecOps 将 SAST、依赖扫描(SCA)、容器镜像扫描左移进 PR;Pipeline as Code 把 Jenkinsfile/GitLab CI 纳入 Git 评审。本节集成 Trivy、SonarQube、Dependabot,并说明 Jenkins Credentials 与 GitHub Secrets 的安全用法——合并原 5.4 可观测性与 5.5/5.6 安全与 PaC 要点。
阅读完本节,你应当能够:
- uses: aquasecurity/trivy-action@master with: image-ref: registry.corp.com/myapp:${{ github.sha }} format: sarif output: trivy-results.sarif severity: CRITICAL,HIGH exit-code: 1 # 有 Critical 则 fail
扫描在 push 后、deploy 前——坏镜像不进 prod Registry。
| 层次 | 工具 | 时机 | 阻断 |
|---|---|---|---|
| SAST | SonarQube, Semgrep | PR | quality gate |
| SCA | Dependabot, Snyk | 日常/PR | CVE 阈值 |
| 镜像 | Trivy, Grype | build 后 | Critical |
| DAST | OWASP ZAP | staging | High |
| Secret | gitleaks, trufflehog | PR | 任何泄露 |
- run: mvn sonar:sonar -Dsonar.projectKey=myapp -Dsonar.qualitygate.wait=true -Dsonar.pullrequest.key=${{ github.event.pull_request.number }}
Quality Gate 示例:新代码覆盖率 ≥ 80%、0 Blocker、安全热点已 review。
# sonar-project.properties sonar.sources=src sonar.tests=tests sonar.python.coverage.reportPaths=coverage.xml sonar.coverage.exclusions=**/migrations/**
⚠️ 常见坑:把 AWS key 写进 Jenkinsfile
sh 'export AWS_KEY=AKIA...'——Git 历史永久存在,即 rotate key 也被扫到。
💡 关键直觉:DevSecOps「左移」= 修复成本在 PR 阶段最低——生产漏洞修一次可能要 emergency change 流程。
repo/ Jenkinsfile # 或 .jenkins/Jenkinsfile src/ tests/
Multibranch 从 Git 读 Jenkinsfile——改 pipeline 与改代码同一 PR,Ops 可 review。
@Library('corp-pipeline-lib') _ standardPipeline { language = 'python' deployEnvironments = ['staging', 'production'] securityScan = true }
共享库 corp-pipeline-lib 统一安全 stage——避免每个 repo 复制粘贴 Trivy 配置。
.gitlab-ci.yml 天然在 Git 中——include 模板:
include: - project: 'devops/ci-templates' file: '/python-app.yml' variables: APP_NAME: myservice
模板更新一次,全局 repo 继承——DRY for pipelines。
| 方式 | 适用 | 禁止 |
|---|---|---|
| GitHub Secrets | Actions | 明文 commit |
| Jenkins Credentials | Jenkins | echo 到 log |
| Vault + OIDC | 企业 | 长期 static key |
| K8s External Secrets | 运行时 | Secret in image |
GitHub OIDC 无长期 key:
- uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::123456789:role/GitHubActions aws-region: ap-east-1
Deploy 后写 metrics 或 annotation 非可选——Pipeline post 块:
post { success { datadogEvent title: "Deploy ${env.GIT_COMMIT}", alertType: 'info' } }
Logs 用结构化 JSON 输出到 stdout,Fluent Bit 采集——pipeline 与 runtime observability 一体。
- uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR 阶段扫描 diff——比事后 rotate key 便宜几个数量级。
pull_request_target 需谨慎,fork PR 用只读 token| 风险 | 防护 |
|---|---|
| 凭证泄露 | gitleaks + Vault |
| 恶意 PR | 限制 fork workflow 权限 |
| 依赖投毒 | lock file + SCA |
| 制品篡改 | 镜像 sign Cosign |
Sigstore Cosign 签名镜像,K8s 准入验证 signature——supply chain 完整性。
Renovate 支持 grouping(一次 PR 更新所有 patch)、schedule(仅工作日)。Dependabot GitHub 原生集成简单。二者都可 auto-merge patch 若 CI 全绿——减少 technical debt 累积。
pull_request vs pull_request_target)Metrics:deploy 计数、duration histogram。Logs:结构化 JSON。Traces:OpenTelemetry 传播 trace context 到 deploy script——全链路可追。
rules: - id: hardcoded-aws-key pattern: AKIA[0-9A-Z]{16} message: Possible AWS access key severity: ERROR
组织特有安全规则进 Git,与业务代码同 review。
本教程完结。你应能设计从 Git push 到 K8s prod 的完整 CI/CD/CDP 管道,并在其中嵌入构建、测试、部署与安全扫描。回顾第1章 maturity 阶梯,按团队就绪度渐进即可。
DevSecOps 的工程要点是「安全即代码的一部分」:SAST、SCA、镜像扫描全部在 PR 阶段自动执行,修复成本最低。扫描工具的选择要与语言栈匹配——SonarQube 覆盖多语言 SAST,Trivy/Grype 扫镜像与 SBOM,Dependabot/Renovate 管依赖更新,gitleaks 拦密钥提交。扫描结果要接入质量门禁:Critical 直接 fail,High 进评审队列,而不是生成一份没人看的报告。
Pipeline as Code 把 CI/CD 配置纳入版本控制与代码评审,Jenkinsfile、GitLab CI、GitHub Actions 都是仓库的一部分。治理层面的配套动作:共享库/模板统一安全 stage(避免每个 repo 复制粘贴),密钥一律走 Secret 系统(禁止明文 commit),敏感 job 用专用 runner,PR 触发保持最小权限。管道本身也是攻击面——恶意 PR、依赖投毒、runner 逃逸都要纳入威胁模型。