reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
# CI/CD 管道安全审计
|
||||
|
||||
## 管道攻击面
|
||||
|
||||
```text
|
||||
威胁模型(STRIDE):
|
||||
□ 欺骗: 伪造构建/签名/来源
|
||||
□ 篡改: 修改源代码/构建产物/依赖
|
||||
□ 否认: 无审计日志的恶意操作
|
||||
□ 信息泄露: 管道日志/构建产物泄漏密钥
|
||||
□ 拒绝服务: 耗尽 CI 资源/破坏构建
|
||||
□ 权限提升: Runner 逃逸/密钥窃取
|
||||
```
|
||||
|
||||
## 审计清单
|
||||
|
||||
### 1. Pipeline as Code 配置
|
||||
|
||||
```yaml
|
||||
# GitHub Actions 审计要点
|
||||
# ❌ 危险模式
|
||||
on:
|
||||
pull_request_target: # 可访问 secrets 的 PR 触发
|
||||
types: [opened]
|
||||
|
||||
# ❌ 脚本注入
|
||||
- run: echo "${{ github.event.issue.title }}" # 用户输入 → shell
|
||||
|
||||
# ❌ 不受限的 token 权限
|
||||
permissions: write-all
|
||||
|
||||
# ✅ 安全模式
|
||||
on:
|
||||
pull_request: # 无 secrets 访问
|
||||
types: [opened]
|
||||
|
||||
# ✅ 固定到 SHA
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||
|
||||
# ✅ 最小权限
|
||||
permissions:
|
||||
contents: read
|
||||
```
|
||||
|
||||
### 2. 密钥管理
|
||||
|
||||
```bash
|
||||
# 扫描历史提交中的密钥
|
||||
gitleaks detect --source . --verbose
|
||||
trufflehog git file://. --only-verified
|
||||
|
||||
# 检查 Actions Secrets 使用
|
||||
gh secret list
|
||||
# 确认: 无硬编码密钥、定期轮换、最小权限
|
||||
|
||||
# 运行时密钥注入
|
||||
# ✅ 使用 OIDC 替代长期密钥
|
||||
# ✅ Secrets 仅在需要时暴露到特定步骤
|
||||
```
|
||||
|
||||
### 3. 构建完整性
|
||||
|
||||
```bash
|
||||
# 构建溯源
|
||||
# 生成不可篡改的构建记录(SLSA L2+)
|
||||
slsa-provenance generate --source . --output provenance.json
|
||||
|
||||
# 产物签名
|
||||
cosign sign-blob --key cosign.key artifact.tar.gz
|
||||
|
||||
# 验证
|
||||
cosign verify-blob --key cosign.pub --signature artifact.tar.gz.sig artifact.tar.gz
|
||||
```
|
||||
|
||||
### 4. Runner 安全
|
||||
|
||||
```text
|
||||
□ 是否使用 GitHub-hosted runner?(推荐,每次全新环境)
|
||||
□ Self-hosted runner: 是否在隔离的 VM/容器中运行?
|
||||
□ 是否运行过 fork PR?(self-hosted runner 风险极高)
|
||||
□ Runner 是否有网络出站限制?
|
||||
□ 构建缓存是否可能跨构建泄漏?
|
||||
```
|
||||
|
||||
### 5. 依赖拉取安全
|
||||
|
||||
```text
|
||||
□ npm: package-lock.json 是否提交? 禁止 --force / --legacy-peer-deps
|
||||
□ pip: requirements.txt 是否冻结版本? 禁止 pip install <未验证来源>
|
||||
□ Docker: FROM 是否固定 digest? 禁止 latest tag
|
||||
□ Go: go.sum 是否提交?
|
||||
□ 私有包: 注册表认证是否用短期 token?
|
||||
```
|
||||
|
||||
## 自动化检查 Pipeline
|
||||
|
||||
```yaml
|
||||
# .github/workflows/supply-chain.yml
|
||||
name: Supply Chain Security
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
sca:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: SBOM Generate
|
||||
run: |
|
||||
npm install -g @cyclonedx/cdxgen
|
||||
cdxgen -o sbom.json
|
||||
|
||||
- name: OSV Scan
|
||||
run: |
|
||||
go install github.com/google/osv-scanner/cmd/osv-scanner@latest
|
||||
osv-scanner scan --sbom sbom.json --format sarif > osv-results.sarif
|
||||
|
||||
- name: Trivy Scan
|
||||
uses: aquasecurity/trivy-action@master
|
||||
with:
|
||||
scan-type: fs
|
||||
severity: CRITICAL,HIGH
|
||||
exit-code: 1
|
||||
|
||||
- name: Secret Scan
|
||||
run: |
|
||||
docker run --rm -v $PWD:/src ghcr.io/gitleaks/gitleaks:latest \
|
||||
detect --source /src --verbose
|
||||
|
||||
- name: Dependency-Track Upload
|
||||
run: |
|
||||
curl -X POST https://dtrack.example.com/api/v1/bom \
|
||||
-H "X-Api-Key: ${{ secrets.DTRACK_API_KEY }}" \
|
||||
-F "autoCreate=true" -F "project=myapp" -F "bom=@sbom.json"
|
||||
```
|
||||
|
||||
Source: SLSA Framework, OWASP CI/CD Top 10, GitHub Security Lab
|
||||
Reference in New Issue
Block a user