🔍 第29课:安全扫描

核心概念

安全扫描:左移安全,早发现早修复

安全扫描在开发阶段就发现漏洞,而不是等到生产环境被攻击。包括容器镜像扫描、代码静态分析、依赖漏洞检查。

安全扫描全景

代码提交 → SAST(代码扫描) → SCA(依赖扫描) → 构建
  → 容器镜像扫描 → DAST(运行时扫描) → 部署 → 运行时防护

SAST  → 静态代码分析(SonarQube/Semgrep)
SCA   → 软件成分分析(Snyk/Dependabot)
Container → 镜像漏洞(Trivy/Harbor)
DAST  → 动态安全测试(OWASP ZAP)
IaC   → 基础设施扫描(Checkov/tfsec)

命令实操

1. Trivy容器镜像扫描 ✅

Trivy扫描
# 安装Trivy
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin

# 扫描镜像
trivy image myregistry/myapp:v1.2.3
trivy image --severity HIGH,CRITICAL myregistry/myapp:v1.2.3
trivy image --format json --output trivy-report.json myregistry/myapp:v1.2.3

# CI门禁(发现CRITICAL则失败)
trivy image --exit-code 1 --severity CRITICAL myregistry/myapp:v1.2.3

# 扫描文件系统(代码依赖)
trivy fs --severity HIGH,CRITICAL ./

# 扫描IaC配置
trivy config ./terraform/

# 扫描K8s集群
trivy k8s --report summary cluster

2. SonarQube代码质量扫描 ✅

SonarQube
docker run -d --name sonarqube -p 9000:9000 -v sonarqube-data:/opt/sonarqube/data sonarqube:community

# 创建项目+Token
curl -u admin:admin -X POST "http://localhost:9000/api/projects/create" -d "name=myapp&project=myapp"

# Maven扫描
mvn sonar:sonar -Dsonar.projectKey=myapp -Dsonar.host.url=http://localhost:9000 -Dsonar.login=

# 设置质量门禁
curl -u admin:admin -X POST "http://localhost:9000/api/qualitygates/create" -d "name=DevOps-Gate"
curl -u admin:admin -X POST "http://localhost:9000/api/qualitygates/create_condition" \
  -d "gateName=DevOps-Gate&metric=critical_violations&operator=GT&error=0"

# CI集成(扫描失败则构建失败)
mvn sonar:sonar -Dsonar.qualitygate.wait=true

3. GitHub Actions安全扫描流水线 ✅

安全CI流水线
cat > .github/workflows/security-scan.yml << 'EOF'
name: Security Scan
on: [push, pull_request]
jobs:
  trivy-container:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - run: docker build -t myapp:${{ github.sha }} .
    - uses: aquasecurity/trivy-action@master
      with: {image-ref: 'myapp:${{ github.sha }}', severity: 'CRITICAL,HIGH', exit-code: '1', format: 'sarif', output: 'trivy.sarif'}

  semgrep:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: returntocorp/semgrep-action@v1
      with: {config: 'p/security-audit p/secrets p/owasp-top-ten'}

  checkov-iac:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: bridgecrewio/checkov-action@master
      with: {directory: 'terraform/', framework: 'terraform'}
EOF

架构图

安全扫描:左移安全,早发现早修复架构

┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐
│ SAST     │  │ SCA      │  │ Container│  │ IaC      │
│ Semgrep  │  │ Trivy FS │  │ Trivy    │  │ Checkov  │
│ SonarQube│  │ Snyk     │  │ Harbor   │  │ tfsec    │
└────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────┘
     └──────────────┼──────────────┘              │
                    ▼                             │
             ┌─────────────┐                      │
             │ Quality Gate│◄─────────────────────┘
             └──────┬──────┘
          ┌─────────┼─────────┐
          ▼                   ▼
     通过 → 部署         失败 → 阻断

故障排查

❌ Trivy误报过多

排查
cat > .trivyignore << 'EOF'
CVE-2023-XXXX  # 已评估,暂不修复
CVE-2024-XXXX  # 仅影响非本场景
EOF
# 仅扫描特定类型
trivy image --vuln-type os myapp:v1.2.3  # 仅OS漏洞
trivy image --vuln-type library myapp:v1.2.3  # 仅依赖漏洞
💡 安全扫描原则:CI中自动运行、CRITICAL级别阻断部署、定期更新漏洞数据库、误报用.trivyignore管理。

🏆 成就解锁:安全扫描专家!

掌握Trivy/SonarQube/Semgrep/Checkov——左移安全把漏洞挡在门外

📝 安全扫描类型详解

类型扫描时机工具检测内容
SAST代码提交时Semgrep/SonarQube代码漏洞模式
SCA依赖变更时Snyk/Dependabot已知CVE漏洞
Container镜像构建时Trivy/HarborOS+库漏洞
DAST部署后OWASP ZAP运行时漏洞
IaCTerraform变更时Checkov/tfsec配置安全
Secret代码提交时TruffleHog/gitleaks硬编码密钥
💡 安全扫描策略:CI中自动运行、CRITICAL级别阻断部署、定期更新漏洞库、误报用ignore文件管理。

🔧 Trivy高级用法

Trivy高级
# 忽略特定CVE
cat > .trivyignore << 'EOF'
CVE-2023-XXXX  # 已评估,暂不修复
CVE-2024-YYYY  # 仅影响非本场景功能
EOF

# 仅扫描OS漏洞
trivy image --vuln-type os myapp:v1.2.3

# 仅扫描依赖漏洞
trivy image --vuln-type library myapp:v1.2.3

# SBOM生成+扫描
trivy image --format spdx-json --output sbom.json myapp:v1.2.3
trivy sbom sbom.json --severity HIGH,CRITICAL

# Kubernetes全集群扫描
trivy k8s --report all cluster --severity CRITICAL

# 自定义Regexp扫描密钥泄露
trivy fs --scanners secret ./src/

# CI集成:SARIF上传GitHub Security
trivy image --format sarif --output trivy.sarif myapp:${{ github.sha }}

📝 安全扫描频率建议

扫描类型频率阻断级别处理SLA
SAST每次PRHIGH+24h
SCA每次PR+每日CRITICAL7天
Container每次构建CRITICAL7天
IaC每次Terraform变更HIGH+14天
DAST每周CRITICAL14天
Secret每次提交任何立即
⚠️ 密钥泄露是最高优先级!一旦发现硬编码密钥,立即轮换该密钥,不要只删除代码。
⚠️ 学习建议:每课内容都需要在实验环境中实际操作验证,只有动手才能真正掌握。建议搭建自己的实验环境反复练习。

课前准备

课后巩固

进阶方向

📝 本课知识图谱

知识域核心技能验证方式
核心概念理解原理和架构能用自己的话解释
命令实操熟练使用相关工具能独立完成操作
故障排查定位和解决问题能在模拟故障中恢复
最佳实践遵循生产级标准能设计可靠方案
💡 持续学习:技术领域更新快,关注官方博客、GitHub Release、社区动态,保持知识新鲜度。