GitHub Actions 依赖安全:Dependabot、SBOM 与供应链防护

GitHub Actions 依赖安全:Dependabot 配置(版本更新/安全警报/自动 PR)、依赖图与 SBOM 生成、供应链安全(SLSA/Sigstore 签名)、私有仓库依赖扫描、 transitive 依赖漏洞追踪、CodeQL 安全分析集成、密钥扫描(secret scanning)、依赖锁定策略(lockfile)、漏洞修复工作流、第三方 Action 的安全审计

软件供应链攻击是 2020 年代最严峻的安全威胁之一——从 npm 包被植入恶意代码到 GitHub Action 被篡改,一条依赖链上的薄弱环节可能让整个组织暴露。GitHub 提供了一整套工具来防护依赖安全:Dependabot 自动监控漏洞、SBOM 追踪依赖全景、CodeQL 深度代码分析、密钥扫描防止泄露。本文从配置到集成,构建完整的依赖安全防线。


一、Dependabot 配置:自动更新与安全警报

1.1 基础配置

# .github/dependabot.yml
version: 2
updates:
  # npm 依赖
  - package-ecosystem: "npm"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "09:00"
      timezone: "Asia/Shanghai"
    open-pull-requests-limit: 10
    reviewers:
      - "octocat"
    labels:
      - "dependencies"
      - "security"
    commit-message:
      prefix: "chore"
      include: "scope"

  # Python 依赖
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "daily"
    target-branch: "main"

  # GitHub Actions
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"

1.2 安全更新

Dependabot 安全更新功能:
- 自动检测依赖中的已知 CVE
- 自动生成修复 PR(升级到有修复的版本)
- 在 repo → Security → Dependabot alerts 中查看

# 启用:Settings → Security → Dependabot alerts → Enable
# Settings → Security → Dependabot security updates → Enable

1.3 自动合并策略

# .github/workflows/auto-merge-dependabot.yml
name: Auto-merge Dependabot PRs

on: pull_request

jobs:
  auto-merge:
    runs-on: ubuntu-latest
    if: github.actor == 'dependabot[bot]'
    steps:
      - name: Dependabot metadata
        id: metadata
        uses: dependabot/fetch-metadata@v1

      - name: Auto-merge patch/minor
        if: steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor'
        run: gh pr merge --auto --merge "$PR_URL"
        env:
          PR_URL: ${{ github.event.pull_request.html_url }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

二、SBOM 生成与依赖追踪

2.1 生成 SBOM

# .github/workflows/sbom.yml
name: Generate SBOM

on:
  push:
    branches: [main]

jobs:
  sbom:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Generate SBOM
        uses: anchore/sbom-action@v0
        with:
          format: spdx-json
          output-file: sbom.spdx.json

      - name: Upload SBOM
        uses: actions/upload-artifact@v3
        with:
          name: sbom
          path: sbom.spdx.json

2.2 依赖图与许可证

# GitHub 自动生成依赖图:
# Insights → Dependency graph
# 查看:直接依赖、间接依赖、许可证信息

# 许可证合规检查:
# Settings → Code security → Dependency review → Enable
# PR 中新增有漏洞或有许可证冲突的依赖时会阻塞

三、供应链安全:SLSA 与 Sigstore

3.1 SLSA 等级

等级要求
L1构建过程文档化
L2使用版本控制系统 + 托管构建服务
L3源仓库和构建平台安全 hardened
L4双人审核所有变更 + 可复现构建

3.2 Sigstore 签名

      - name: Build artifact
        run: npm run build

      - name: Sign artifact with Sigstore
        uses: sigstore/cosign-installer@v3
      - run: cosign sign-blob --yes dist/app.js --output-signature app.js.sig
        env:
          COSIGN_EXPERIMENTAL: 1

3.3 GitHub Artifact Attestations

      - name: Attest build provenance
        uses: actions/attest-build-provenance@v1
        with:
          subject-path: 'dist/**/*'

四、CodeQL 安全分析

4.1 基础配置

# .github/workflows/codeql.yml
name: CodeQL

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  schedule:
    - cron: '0 9 * * 1'  # 每周一 9 点

jobs:
  analyze:
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      matrix:
        language: [javascript, python]

    steps:
      - uses: actions/checkout@v4

      - name: Initialize CodeQL
        uses: github/codeql-action/init@v2
        with:
          languages: ${{ matrix.language }}

      - name: Autobuild
        uses: github/codeql-action/autobuild@v2

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v2

4.2 自定义查询

# CodeQL 支持自定义安全查询规则
# .github/codeql/custom-queries/
# 可针对特定漏洞模式编写 QL 查询

五、密钥扫描与泄露防护

5.1 GitHub Secret Scanning

# 自动扫描仓库中泄露的密钥:
# - AWS 密钥
# - GitHub Token
# - Slack Token
# - 自定义模式(企业版)

# 启用:Settings → Security → Secret scanning → Enable
# 推送含密钥的代码 → 立即告警并提供撤销建议

5.2 预提交密钥检查

# .pre-commit-config.yaml
repos:
  - repo: https://github.com/Yelp/detect-secrets
    rev: v1.4.0
    hooks:
      - id: detect-secrets
        args: ['--baseline', '.secrets.baseline']

5.3 Actions 密钥管理

# 使用 GitHub Secrets 而非硬编码
secrets.MY_API_KEY  # 仓库级
vars.MY_VARIABLE    # 仓库级变量(非加密)

# 环境级密钥(prod/staging 分离)
# Settings → Environments → Production → Secrets

六、第三方 Action 安全审计

6.1 Action 安全 checklist

使用第三方 Action 前检查:
1) 官方认证:是否被 GitHub 验证(蓝勾)
2) Star 数和维护活跃度
3) 源代码审查:看 action.yml 和 entrypoint 做了什么
4) 版本锁定:用 SHA 而非 tag
5) 权限最小化:限制 GITHUB_TOKEN 权限

6.2 版本锁定最佳实践

# 坏:使用 mutable tag
- uses: actions/checkout@v4

# 好:使用 commit SHA(不可变)
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11  # v4.1.1

# 更好:用 Dependabot 自动更新 SHA
# Dependabot 会监控 Action 更新并自动发 PR

6.3 最小权限原则

jobs:
  build:
    permissions:
      contents: read      # 只读代码
      packages: write     # 只写包
      security-events: write  # 安全扫描用

七、漏洞修复工作流

7.1 收到安全警报后

1) 评估影响:漏洞是否在代码路径中被触发
2) 查看 Dependabot PR:是否已自动生成修复
3) 测试修复:引入新版本是否破坏兼容性
4) 紧急修复:如 POC 公开,立即修复/release
5) 通知用户:如影响已发布版本,发布安全公告

7.2 安全发布流程

# .github/workflows/security-release.yml
name: Security Release

on:
  workflow_dispatch:
    inputs:
      severity:
        description: 'Severity (low/medium/high/critical)'
        required: true

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run full test suite
        run: npm test
      - name: Publish security patch
        run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

总结

依赖安全是「纵深防御」——Dependabot 自动监控漏洞、SBOM 追踪依赖全貌、CodeQL 分析代码安全、密钥扫描防止泄露、Sigstore 签名验证构建来源。GitHub Actions 的供应链安全还要注意:Action 用 SHA 锁定版本、最小权限 GITHUB_TOKEN、私有依赖的访问控制。安全不是一次性配置,而是持续监控和快速响应的流程。Dependabot 自动合并 patch/minor 更新可减少维护负担,但 major 版本升级仍需人工审查。

延伸阅读:

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「github-actions」更多文章

  1. GitHub Actions Go/Rust CI:交叉编译、静态检查与发布
  2. GitHub Actions Java/JVM CI:Maven、Gradle、JaCoCo 与 Jib 容器化
  3. GitHub Actions PR 自动化:标签、审查、合并与发布