软件供应链攻击是 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 Python CI — Python 安全扫描集成
- GitHub Actions PR 自动化 — 安全 PR 审查流程
- SLSA 规范
- Sigstore 文档
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。