5.3 安全扫描与 Pipeline as Code


5.3 安全扫描与 Pipeline as Code

本节摘要: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 要点。

上手前先明确

阅读完本节,你应当能够:

  1. 在 CI 中运行 Trivy 扫描 Docker 镜像并阻断 Critical CVE
  2. 配置 SonarQube SAST quality gate
  3. 启用 Dependabot/Renovate 依赖更新
  4. 将 Jenkinsfile 放在 Git 根目录并 PR 评审
  5. 解释 CI 流水线本身的攻击面与防护

一、Trivy 镜像扫描

- 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。

安全扫描层次(合并 5.4/5.5)

层次 工具 时机 阻断
SAST SonarQube, Semgrep PR quality gate
SCA Dependabot, Snyk 日常/PR CVE 阈值
镜像 Trivy, Grype build 后 Critical
DAST OWASP ZAP staging High
Secret gitleaks, trufflehog PR 任何泄露

二、SonarQube 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 流程。

三、Pipeline as Code

Jenkinsfile 入 Git

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 即 PaC

.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

可观测性进 Pipeline(原 5.4 合并)

Deploy 后写 metrics 或 annotation 非可选——Pipeline post 块:

post { success { datadogEvent title: "Deploy ${env.GIT_COMMIT}", alertType: 'info' } }

Logs 用结构化 JSON 输出到 stdout,Fluent Bit 采集——pipeline 与 runtime observability 一体

gitleaks 防密钥 commit

- uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

PR 阶段扫描 diff——比事后 rotate key 便宜几个数量级。

CI 流水线攻击面

  • 恶意 PR 跑 untrusted code → 用 pull_request_target 需谨慎,fork PR 用只读 token
  • 依赖投毒 → lock file + SCA
  • Runner 逃逸 → 隔离 runner,敏感 deploy 用 dedicated pool

四、DevSecOps 全景与 PaC 治理(SOURCE 5.5–5.6/5.4 合并)

OWASP CI/CD Top 10 风险

风险 防护
凭证泄露 gitleaks + Vault
恶意 PR 限制 fork workflow 权限
依赖投毒 lock file + SCA
制品篡改 镜像 sign Cosign

Sigstore Cosign 签名镜像,K8s 准入验证 signature——supply chain 完整性。

Renovate vs Dependabot

Renovate 支持 grouping(一次 PR 更新所有 patch)、schedule(仅工作日)。Dependabot GitHub 原生集成简单。二者都可 auto-merge patch 若 CI 全绿——减少 technical debt 累积。

Pipeline 变更评审清单

  • 新增 secret 引用而非明文
  • prod deploy 仍有 gate(若 CD 非 CDP)
  • 新 stage 有 timeout
  • 失败通知到达正确 channel
  • 不影响 fork PR 安全(GHA pull_request vs pull_request_target

可观测性三支柱进 Pipeline

Metrics:deploy 计数、duration histogram。Logs:结构化 JSON。Traces:OpenTelemetry 传播 trace context 到 deploy script——全链路可追。

Semgrep 自定义规则

rules: - id: hardcoded-aws-key pattern: AKIA[0-9A-Z]{16} message: Possible AWS access key severity: ERROR

组织特有安全规则进 Git,与业务代码同 review。

核心回顾

  • Trivy exit-code 1 阻断 Critical 镜像
  • SonarQube quality gate SAST 左移
  • Dependabot 持续 SCA
  • Jenkinsfile in Git = Pipeline as Code
  • OIDC 替代长期 cloud key
  • gitleaks PR 防泄露
  • 共享 CI 模板 DRY 安全 stage

本教程完结。你应能设计从 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 逃逸都要纳入威胁模型。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U