漏洞扫描工具与实践
约 1572 字大约 5 分钟
vulnerabilityscanning
2025-08-25
概述
漏洞扫描是安全防御体系中的关键环节,通过自动化工具系统性地发现应用程序、容器和依赖中的已知安全漏洞。本文将介绍 SAST、DAST、SCA 三大类扫描技术,以及主流工具的使用方法和 CI/CD 集成方案。
扫描类型对比
| 特性 | SAST | DAST | SCA |
|---|---|---|---|
| 扫描对象 | 源代码 | 运行中的应用 | 依赖/容器 |
| 测试方式 | 白盒 | 黑盒 | 组件分析 |
| 开发阶段 | 编码阶段 | 测试/部署阶段 | 全生命周期 |
| 误报率 | 较高 | 较低 | 低 |
| 漏报率 | 中等 | 中等 | 低 |
| 发现类型 | 代码缺陷 | 运行时漏洞 | 已知 CVE |
Trivy(容器与文件系统扫描)
Trivy 是 Aqua Security 开源的全能安全扫描器,支持容器镜像、文件系统、Git 仓库和 Kubernetes 集群扫描。
# 安装 Trivy
brew install trivy # macOS
apt-get install trivy # Debian/Ubuntu
# 容器镜像扫描
trivy image nginx:latest
trivy image --severity HIGH,CRITICAL myapp:v1.2.3
# 文件系统扫描(项目依赖)
trivy fs --scanners vuln,secret,misconfig .
# Kubernetes 集群扫描
trivy k8s --report summary cluster
# 生成 JSON 报告
trivy image --format json --output report.json myapp:v1.2.3
# SBOM 生成
trivy image --format cyclonedx --output sbom.json myapp:v1.2.3
# 忽略特定漏洞
# .trivyignore 文件
# CVE-2023-12345
# CVE-2023-67890
trivy image --ignorefile .trivyignore myapp:v1.2.3# GitHub Actions 集成 Trivy
name: Security Scan
on: [push, pull_request]
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# 文件系统扫描
- name: Trivy FS Scan
uses: aquasecurity/trivy-action@master
with:
scan-type: 'fs'
scan-ref: '.'
severity: 'HIGH,CRITICAL'
exit-code: '1' # 发现高危漏洞时 CI 失败
# 容器镜像扫描
- name: Build Image
run: docker build -t myapp:test .
- name: Trivy Image Scan
uses: aquasecurity/trivy-action@master
with:
image-ref: 'myapp:test'
format: 'sarif'
output: 'trivy-results.sarif'
severity: 'CRITICAL,HIGH'
# 上传结果到 GitHub Security
- name: Upload Trivy scan results
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: 'trivy-results.sarif'Snyk
# 安装 Snyk
npm install -g snyk
# 认证
snyk auth
# 测试项目依赖
snyk test
snyk test --severity-threshold=high
# 容器扫描
snyk container test myapp:v1.2.3
# IaC 扫描(Terraform/CloudFormation/K8s)
snyk iac test ./infrastructure/
# 持续监控(推送到 Snyk 平台)
snyk monitor
# 自动修复
snyk fix # 自动升级到安全版本# Snyk CI/CD 集成
- name: Snyk Security Scan
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high --fail-on=allSonarQube (SAST)
# docker-compose.yml — SonarQube 部署
version: '3'
services:
sonarqube:
image: sonarqube:community
ports:
- "9000:9000"
environment:
- SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonar
- SONAR_JDBC_USERNAME=sonar
- SONAR_JDBC_PASSWORD=sonar
volumes:
- sonarqube_data:/opt/sonarqube/data
db:
image: postgres:15
environment:
- POSTGRES_USER=sonar
- POSTGRES_PASSWORD=sonar
- POSTGRES_DB=sonar
volumes:
- postgresql_data:/var/lib/postgresql/data
volumes:
sonarqube_data:
postgresql_data:# SonarScanner 分析
sonar-scanner \
-Dsonar.projectKey=my-project \
-Dsonar.sources=./src \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.token=sqp_xxx# GitHub Actions 集成 SonarQube
- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@master
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
with:
args: >
-Dsonar.projectKey=my-project
-Dsonar.sources=src/
-Dsonar.qualitygate.wait=trueSemgrep (SAST)
# 安装 Semgrep
pip install semgrep
# 使用内置规则扫描
semgrep --config auto .
# 使用特定规则集
semgrep --config p/owasp-top-ten .
semgrep --config p/javascript .
semgrep --config p/python .
# 自定义规则
semgrep --config custom-rules/ .# 自定义 Semgrep 规则
rules:
- id: hardcoded-secret
patterns:
- pattern: |
$KEY = "..."
- metavariable-regex:
metavariable: $KEY
regex: (password|secret|api_key|token)
message: "Potential hardcoded secret detected"
severity: ERROR
languages: [python, javascript, java]
- id: sql-injection
patterns:
- pattern: |
cursor.execute(f"... {$VAR} ...")
message: "Potential SQL injection via f-string"
severity: ERROR
languages: [python]CVE 数据库与 CVSS 评分
CVSS v3.1 评分体系
| 评分范围 | 严重级别 | 修复优先级 |
|---|---|---|
| 9.0 - 10.0 | Critical 严重 | 立即修复(24 小时) |
| 7.0 - 8.9 | High 高 | 紧急修复(1 周) |
| 4.0 - 6.9 | Medium 中 | 计划修复(1 月) |
| 0.1 - 3.9 | Low 低 | 下次迭代 |
| 0.0 | None 无 | 无需修复 |
# 查询 CVE 信息
# NVD API
curl "https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2024-1234"
# 使用 grype 扫描并显示 CVSS 评分
grype myapp:v1.2.3 --output table修复工作流
# 漏洞管理策略配置
# .trivyignore 或 policy 文件
vulnerability_policy:
# 按严重程度设置 SLA
sla:
critical: 1d # 严重漏洞 1 天内修复
high: 7d # 高危漏洞 1 周内修复
medium: 30d # 中危漏洞 1 月内修复
low: 90d # 低危漏洞 1 季度内修复
# 豁免列表(需要理由和过期时间)
exceptions:
- cve: CVE-2023-12345
reason: "已有 WAF 规则缓解,等待上游修复"
expires: "2024-06-01"
approver: "security-team"CI/CD 集成全景
最佳实践
- 在 CI/CD 中集成安全扫描,作为必须通过的质量门禁
- 组合使用 SAST + DAST + SCA,三种方式互补覆盖不同类型的漏洞
- Critical/High 漏洞阻止部署,Medium/Low 允许部署但限期修复
- 设置明确的漏洞修复 SLA,按 CVSS 严重程度分级处理
- 使用 Dependabot/Renovate 自动化依赖更新,减少人工干预
- 定期进行全量扫描(非仅增量),发现新公开的 CVE
- 漏洞豁免必须有理由、审批人和过期时间,定期复查
- 扫描结果集中到安全平台(如 DefectDojo),统一管理和追踪
贡献者
更新日志
2026/3/14 13:09
查看所有更新日志
9f6c2-feat: organize wiki content and refresh site setup于