安全左移:华为云 CodeArts Check 在 Pipeline 中嵌入代码质量与安全扫描
💡 摘要: 在第2篇构建的 Pipeline 中集成 CodeArts Check 代码检查、依赖安全扫描(OSS)、Web 漏洞扫描(VSS),将安全左移到开发阶段。涵盖 Maven 项目代码规范检查、自定义规则集、增量扫描、门禁机制、OWASP Top 10 依赖漏洞检测、Docker 镜像安全扫描全流程,附 5 个安全扫描配置模板和 4 个企业级规则集。
🎯 为什么需要代码质量与安全扫描?
"安全左移"理念

安全漏洞的修复成本(来源:NIST 研究):
- 开发阶段发现并修复:$1
- 构建阶段发现并修复:$10
- 测试阶段发现并修复:$100
- 生产环境发现并修复:$1,000+
- 漏洞披露后修复:$10,000+
云原生实战系列集成全景

📋 CodeArts Check:代码静态分析
1.1 创建检查任务
# 方式一:控制台创建
# 登录华为云 → CodeArts Check → 新建任务
# 任务名称: demo-app-check
# 代码仓库: demo-app(关联 CodeArts Repo)
# 语言: Java
# 扫描模式: 全量扫描(首次)/ 增量扫描(后续)
# 方式二:API 创建
curl -X POST "https://codearts-check.cn-north-4.myhuaweicloud.com/v1/{project_id}/tasks" \
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"task_name": "demo-app-check",
"repository_id": "repo_id_xxx",
"language": "Java",
"ruleset_id": "java_security_ruleset"
}'
1.2 规则集配置
华为云 CodeArts Check 提供 3000+ 内置规则,按严重级别分为三类:
| 规则集 | 规则数量 | 覆盖范围 | 建议场景 |
|---|---|---|---|
| Java 安全规则集 | 486 条 | OWASP Top 10、CWE 高危 | 必须启用 |
| Java 规范规则集 | 312 条 | 命名规范、代码风格、注释规范 | 建议启用 |
| Java 性能规则集 | 156 条 | 性能热点、内存泄漏、线程安全 | 推荐启用 |
| Java 兼容性规则集 | 98 条 | Java 版本兼容、API 弃用 | 版本升级时启用 |
自定义规则集配置:
{
"ruleset_name": "demo-app-production",
"language": "Java",
"severity": "critical",
"rules": [
// ===== 安全规则(必须修复)=====
{
"rule_id": "SEC001",
"severity": "critical",
"action": "block"
},
// SQL 注入
{
"rule_id": "SEC002",
"severity": "critical",
"action": "block"
},
// XSS 漏洞
{
"rule_id": "SEC003",
"severity": "critical",
"action": "block"
},
// 硬编码密码
{
"rule_id": "SEC004",
"severity": "critical",
"action": "block"
},
// 命令注入
{
"rule_id": "SEC005",
"severity": "critical",
"action": "block"
},
// 路径遍历
// ===== 代码规范(建议修复)=====
{
"rule_id": "STD001",
"severity": "major",
"action": "warn"
},
// 命名规范
{
"rule_id": "STD002",
"severity": "minor",
"action": "warn"
},
// 注释缺失
{
"rule_id": "STD003",
"severity": "major",
"action": "warn"
},
// 未使用的导入
// ===== 性能规则(推荐修复)=====
{
"rule_id": "PERF001",
"severity": "major",
"action": "warn"
},
// 循环内创建对象
{
"rule_id": "PERF002",
"severity": "critical",
"action": "block"
}
// 死锁风险
]
}
1.3 常见 Java 安全问题检出示例
// ===== 安全问题 1:SQL 注入(SEC001)=====
// ❌ 错误写法
String sql = "SELECT * FROM users WHERE id = " + userId; // CodeArts Check 检出
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// ✅ 正确写法
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, userId);
ResultSet rs = pstmt.executeQuery();
// ===== 安全问题 2:硬编码密码(SEC003)=====
// ❌ 错误写法
String DB_PASSWORD = "MyP@ssw0rd123!"; // CodeArts Check 检出
// ✅ 正确写法
// 密码从环境变量或 Secret 服务获取
String DB_PASSWORD = System.getenv("DB_PASSWORD");
// 或使用华为云凭据管理服务(CSMS)
String DB_PASSWORD = csmsClient.getSecret("demo-app/db-password").getValue();
// ===== 安全问题 3:路径遍历(SEC005)=====
// ❌ 错误写法
File file = new File("/data/uploads/" + filename); // CodeArts Check 检出
// ✅ 正确写法
Path basePath = Paths.get("/data/uploads");
Path resolvedPath = basePath.resolve(filename).normalize();
if (!resolvedPath.startsWith(basePath)) {
throw new SecurityException("非法路径访问");
}
🔥 踩坑经验 1: 首次扫描建议使用全量扫描,之后使用增量扫描(只扫描变更文件),将扫描时间从 10 分钟降到 30 秒。但别忘了每月做一次全量扫描,防止历史代码被忽略。
🔗 第二步:在 Pipeline 中集成检查
2.1 CodeArts Pipeline 配置(YAML)
在第2篇构建的 Pipeline 基础上,在构建前加入代码检查阶段:
# pipeline-config.yaml
pipeline:
name: demo-app-full-pipeline
stages:
# ===== 阶段 1:代码检查 =====
- stage: code_check
name: 代码质量检查
jobs:
- job: codearts_check
name: CodeArts Check 静态扫描
steps:
- codearts_check:
name: 代码静态分析
task_id: demo-app-check # 关联已创建的检查任务
mode: incremental # 增量扫描(首次全量)
severity: critical # 门禁级别
block_on: critical # critical 级别问题阻止发布
notify:
- type: email
target: developer@demo.com
- type: sms
target: +8613800138000
# ===== 阶段 2:依赖安全扫描 =====
- stage: dependency_scan
name: 依赖安全检查
jobs:
- job: dep_check
name: OWASP 依赖检查
steps:
- maven:
name: OWASP Dependency Check
command: mvn org.owasp:dependency-check-maven:check
args: -DfailBuildOnCVSS=7 # CVSS ≥ 7 分阻止构建
fail_on: true
# ===== 阶段 3:单元测试 =====
- stage: unit_test
name: 单元测试
jobs:
- job: maven_test
name: Maven 单元测试
steps:
- maven:
name: 执行单元测试 + 覆盖率检查
command: mvn clean test jacoco:report
coverage:
threshold: 80 # 覆盖率低于 80% 告警
fail_on: 60 # 覆盖率低于 60% 阻止发布
# ===== 阶段 4:Maven 构建 =====
- stage: build
name: Maven 构建
jobs:
- job: maven_build
name: Maven 编译打包
steps:
- maven:
name: 编译打包(使用缓存)
command: mvn clean package -DskipTests -T 4
cache: true
# ===== 阶段 5:Docker 镜像安全扫描 =====
- stage: image_scan
name: 镜像安全扫描
jobs:
- job: swr_scan
name: SWR 镜像安全扫描
steps:
- swr:
name: 推送镜像并扫描
action: build_and_push
image: swr.cn-north-4.myhuaweicloud.com/demo/demo-app:latest
scan: true # 开启镜像安全扫描
scan_severity: high # 高危漏洞不能发布
scan_block_on: "high,medium" # 高/中危漏洞阻止发布
# ===== 阶段 6:部署 =====
- stage: deploy
name: CCE 部署
depends_on: [ code_check, dependency_scan, unit_test, build, image_scan ]
jobs:
- job: cce_deploy
name: 部署到 CCE
steps:
- cce:
name: 滚动更新
action: rolling_update
cluster_id: your-cluster-id
deployment: demo-app
namespace: default
2.2 门禁策略配置
| 门禁维度 | 阻断条件 | 通知对象 | 处理时限 |
|---|---|---|---|
| CodeArts Check | critical 级别 > 0 | 开发者 + TL | 24h |
| OWASP 依赖 | CVSS >= 7 | 安全小组 | 48h |
| 单元测试覆盖 | < 60% | 开发者 | 24h |
| 镜像安全 | high/medium 漏洞 | 安全小组 + 运维 | 72h |
| 性能基线 | P99 RT 退化 > 20% | 架构师 | 1 周 |
🛡️ 第三步:OWASP 依赖安全检查
3.1 为什么需要依赖安全检查?
现代 Java 应用中,80%+ 的代码来自第三方依赖。一个被忽略的 Log4j 漏洞就能让整个系统沦陷。
<!-- pom.xml 配置 OWASP Dependency Check -->
<build>
<plugins>
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>10.0.4</version>
<configuration>
<!-- CVSS 阈值:>= 7 分阻止构建 -->
<failBuildOnCVSS>7</failBuildOnCVSS>
<!-- NVD API Key(加速下载漏洞库) -->
<nvdApiKey>${env.NVD_API_KEY}</nvdApiKey>
<!-- 只在 pipeline 中执行 -->
<skip>${skip.owasp.check}</skip>
<!-- 排除已知误报 -->
<suppressionFiles>
<suppressionFile>owasp-suppressions.xml</suppressionFile>
</suppressionFiles>
<!-- 输出格式 -->
<formats>
<format>HTML</format>
<format>JSON</format>
</formats>
</configuration>
</plugin>
</plugins>
</build>
3.2 误报排除配置
某些已知误报需要手动排除:
<?xml version="1.0" encoding="UTF-8"?>
<suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.3.xsd">
<!-- 排除 Spring Boot Starter 中的已知误报 -->
<suppress>
<notes><![CDATA[
Spring Boot 自带的 Tomcat 版本 CVE 已被 Spring Boot 官方修复补丁覆盖
参考: https://spring.io/blog/2025/08/01/spring-boot-tomcat-cve-false-positive
]]></notes>
<cve>CVE-2025-12345</cve>
</suppress>
<!-- 排除内部工具包的误报 -->
<suppress>
<notes><![CDATA[
内部 lib-utils 包不涉及网络通信,CVE-2025-67890 不适用
]]></notes>
<gav regex="true">^com\.demo\.internal:lib-utils:.*$</gav>
<cve>CVE-2025-67890</cve>
</suppress>
</suppressions>
3.3 依赖安全审计报告
# 执行 OWASP 检查
mvn dependency-check:check
# 查看 HTML 报告
# target/dependency-check-report.html
# 查看 JSON 报告(CI 流程用)
# target/dependency-check-report.json
# 快速检查高危依赖
cat target/dependency-check-report.json | jq '.dependencies[] | select(.vulnerabilities[].cvssScore >= 9) | {package: .packagePath, cve: .vulnerabilities[].name, score: .vulnerabilities[].cvssScore}'
// OWASP 检测结果示例
{
"reportSchema": "1.0",
"dependencies": [
{
"fileName": "log4j-core-2.17.1.jar",
"vulnerabilities": [
{
"name": "CVE-2024-12345",
"cvssScore": 9.8,
"severity": "CRITICAL",
"description": "Log4j 远程代码执行漏洞",
"fixedVersion": "2.20.0"
}
]
},
{
"fileName": "spring-core-5.3.30.jar",
"vulnerabilities": []
},
{
"fileName": "jackson-databind-2.15.2.jar",
"vulnerabilities": [
{
"name": "CVE-2024-23456",
"cvssScore": 7.5,
"severity": "HIGH",
"description": "Jackson 反序列化漏洞",
"fixedVersion": "2.16.0"
}
]
}
]
}
🐳 第四步:Docker 镜像安全扫描
4.1 SWR 镜像扫描
华为云 SWR(容器镜像仓库)内置镜像安全扫描功能:
# 推送镜像后自动触发扫描
docker push swr.cn-north-4.myhuaweicloud.com/demo/demo-app:latest
# 手动触发扫描
# 控制台 → SWR → 镜像管理 → 选中镜像 → 安全扫描
# 查看扫描结果
# 控制台 → SWR → 镜像管理 → 安全报告
# API 查询扫描结果
curl -X GET "https://swr.cn-north-4.myhuaweicloud.com/v2/manifests/demo-app/latest/scan" \
-H "X-Auth-Token: $TOKEN" | jq .
4.2 减少漏洞的 Dockerfile 最佳实践
# ======================================
# 多阶段构建:减少镜像层数和漏洞面
# ======================================
FROM maven:3.9.6-eclipse-temurin-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:resolve -q
COPY src .
RUN mvn clean package -DskipTests
# ===== 生产镜像:使用最小基础镜像 =====
# ❌ 不要用: openjdk:17(包含大量系统工具,漏洞多)
# ✅ 推荐: 使用 Distroless 或 Alpine 基础镜像
FROM eclipse-temurin:17-jre-alpine
# 安全加固:删除不必要的系统工具
RUN apk del --no-cache apk-tools && \
rm -rf /var/cache/apk/* /tmp/* /var/tmp/* && \
addgroup -S appgroup && \
adduser -S appuser -G appgroup
WORKDIR /app
COPY --from=builder /build/target/demo-app.jar app.jar
# 以非 root 用户运行
USER appuser
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD wget -qO- http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-jar", "app.jar"]
4.3 镜像安全扫描报告解读
| 漏洞级别 | 数量 | 处理策略 |
|---|---|---|
| 🔴 Critical | 0 | 必须修复,阻止发布 |
| 🟠 High | 2 | 24h 内修复 |
| 🟡 Medium | 5 | 1 周内修复 |
| 🟢 Low | 12 | 下一迭代修复 |
| ⚪ Unknown | 3 | 评估后处理 |
💡 常见误报: Alpine 镜像的
musl、libcrypto等系统库经常被扫描出低危漏洞,这些漏洞在 Alpine 中实际已被修复但 CVE 数据库未更新。可通过 SWR 的"忽略"功能标记。
🌐 第五步:VSS Web 漏洞扫描(部署后)
5.1 什么是 VSS?
VSS(漏洞扫描服务) 针对已部署的 Web 应用进行 DAST(动态应用安全测试)扫描,发现运行时漏洞:
| 扫描类型 | 检测能力 | 建议频率 |
|---|---|---|
| 基础扫描 | SQL 注入、XSS、CSRF、文件包含 | 每次发布后 |
| 高级扫描 | 认证绕过、逻辑漏洞、WebShell | 每周 |
| 专项扫描 | API 安全、JWT 安全、OAuth 安全 | 每月 |
| 合规扫描 | 等保 2.0、PCI DSS、GDPR | 季度 |
5.2 VSS 配置
# 方式一:控制台创建扫描任务
# 登录华为云 → VSS → 创建扫描任务
# 任务名称: demo-app-vss-scan
# 目标 URL: https://api.demo.com
# 扫描模式: 深度扫描(Deep Scan)
# 登录配置: 提供测试账号(扫描需要登录的功能)
# 速率限制: 50 QPS(避免被 WAF 误封)
# 回调通知: 扫描完成通知
# 方式二:API 配置
curl -X POST "https://vss.cn-north-4.myhuaweicloud.com/v1/{project_id}/tasks" \
-H "X-Auth-Token: $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"task_name": "demo-app-vss-scan",
"target_url": "https://api.demo.com",
"scan_type": "deep",
"auth_type": "form",
"auth_url": "https://api.demo.com/login",
"auth_credentials": {
"username": "test_scan",
"password": "${VSS_TEST_PASSWORD}"
},
"rate_limit": 50,
"notification": {
"email": ["security@demo.com"]
}
}'
📊 安全质量看板
代码质量趋势

| 月份 | Critical | High | Medium | Low | 修复率 | 门禁通过率 |
|---|---|---|---|---|---|---|
| 1 月 | 12 | 34 | 56 | 78 | 65% | 72% |
| 2 月 | 8 | 22 | 45 | 70 | 72% | 78% |
| 3 月 | 3 | 15 | 32 | 48 | 81% | 85% |
| 4 月 | 1 | 8 | 22 | 41 | 88% | 91% |
| 5 月 | 0 | 5 | 15 | 25 | 93% | 95% |
| 6 月 | 0 | 2 | 8 | 18 | 96% | 98% |
趋势: 随着门禁机制运行 6 个月,Critical 问题从 12 个降为 0,门禁通过率从 72% 提升到 98%。安全左移的成效显著。
🚨 常见安全漏洞及修复
按 OWASP Top 10 分类
| 排名 | 漏洞类型 | 代码示例(❌错误) | 修复方案(✅正确) |
|---|---|---|---|
| A01 | 访问控制缺陷 | @GetMapping("/admin") |
@PreAuthorize("hasRole('ADMIN')") |
| A02 | 加密失败 | MD5(password) |
BCryptPasswordEncoder |
| A03 | 注入漏洞 | "SELECT * FROM users WHERE id = " + id |
使用 PreparedStatement |
| A04 | 不安全设计 | 敏感信息明文传输 | 全站 HTTPS + 敏感信息脱敏 |
| A05 | 安全配置错误 | CORS 设置为 * |
指定具体域名 |
| A06 | 漏洞和过时组件 | log4j-core 2.14.1 |
升级到 2.20.0+ |
| A07 | 识别和认证失败 | JWT 不过期 | 设置短过期时间 + Refresh Token |
| A08 | 数据完整性失败 | 不对序列化数据签名 | 添加签名验证 |
| A09 | 安全日志和监控不足 | 不记录安全事件 | 全量审计日志 |
| A10 | SSRF | new URL(input).openConnection() |
白名单 URL + 内网 IP 阻断 |
🔧 本地开发环境配置
本地运行 CodeArts Check(IDE 插件)
# 安装 CodeArts Check IDE 插件
# VS Code → 扩展 → 搜索 "CodeArts Check" → 安装
# IntelliJ IDEA → Plugins → 搜索 "Huawei CodeArts Check" → 安装
# 本地检查(无需推送代码)
# 在 IDE 中右键项目 → CodeArts Check → 执行检查
# 实时显示问题,支持批量修复
本地配置 Pre-commit Hook
#!/bin/bash
# .git/hooks/pre-commit
echo "🔍 运行代码检查..."
# 检查 Java 文件
JAVA_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep '\.java$')
if [ -n "$JAVA_FILES" ]; then
# 运行 Checkstyle
mvn checkstyle:check -q
if [ $? -ne 0 ]; then
echo "❌ 代码规范检查失败,请修复后重新提交"
exit 1
fi
# 运行 PMD
mvn pmd:check -q
if [ $? -ne 0 ]; then
echo "❌ PMD 检查失败,请修复后重新提交"
exit 1
fi
echo "✅ 代码检查通过"
fi
exit 0
💰 成本核算
| 安全服务 | 免费额度 | 生产环境月估算 |
|---|---|---|
| CodeArts Check | 5 万行/月 | ¥0 ~ ¥200 |
| SWR 镜像扫描 | 20 次/月 | ¥0 ~ ¥100 |
| OWASP Dep Check | 开源免费 | ¥0 |
| VSS 漏洞扫描 | 1 次/周 | ¥200 ~ ¥500 |
| 合计 | — | ¥200 ~ ¥800/月 |
🔥 踩坑实录
踩坑 1:OWASP Dependency Check 下载 NVD 数据太慢
现象: 第一次运行 OWASP 检查需要 30+ 分钟,Pipeline 超时。
根因: NVD(美国国家漏洞数据库)在国内访问极慢(约 50KB/s),完整数据库约 2GB。
解决:
# 方案一:配置 NVD API Key(加速到 2MB/s)
# 1. 在 https://nvd.nist.gov/developers/request-an-api-key 申请 Key
# 2. 配置到 Maven settings.xml
<settings>
<servers>
<server>
<id>nvd-api-key</id>
<username>${env.NVD_API_KEY}</username>
</server>
</servers>
</settings>
# 方案二:使用华为云镜像
# 将 OWASP 数据库预下载到 SWR OBS 桶,流水线中直接挂载
wget https://your-bucket.obs.cn-north-4.myhuaweicloud.com/owasp-nvd-data.tar.gz
tar -xzf owasp-nvd-data.tar.gz -C ~/.dependency-check/data/
# 方案三:使用内置依赖扫描(华为云 CodeArts 原生)
# CodeArts Pipeline 提供插件"依赖安全检查",使用华为云维护的漏洞库,速度更快
踩坑 2:CodeArts Check 误报 Lombok 注解问题
现象: CodeArts Check 报 @Data、@Slf4j 等 Lombok 注解为"未使用的导入"。
根因: CodeArts Check 的 Java 解析器未识别 Lombok 的编译时注解处理。
解决:
{
"ruleset_name": "demo-app-production",
"lombok_support": true,
// 开启 Lombok 支持
"ignore_rules": [
"UNUSED_IMPORT",
// 忽略 Lombok 相关的误报
"MISSING_GETTER",
"MISSING_SETTER"
]
}
踩坑 3:镜像扫描发现 Alpine 系统库漏洞
现象: 每次构建都扫描出 30+ Low/Medium 级别的 Alpine 系统库漏洞。
根因: Alpine 的 musl、apk、libssl 等系统包在 NVD 数据库中标记为漏洞,但 Alpine 已通过补丁修复(CVE 未更新数据库)。
解决:
# 方案一:切换到 Distroless 基础镜像(减少系统组件)
FROM gcr.io/distroless/java17-debian12
# 方案二:在 SWR 中配置忽略规则
# SWR 镜像管理 → 漏洞忽略 → 添加忽略
# 规则: CVE 评分 < 5.0 AND 包名 = musl OR apk-tools
# 方案三:最小化安装
FROM eclipse-temurin:17-jre-alpine
RUN apk del --no-cache apk-tools # 删除包管理器,减少攻击面
踩坑 4:Pipeline 门禁过严,开发效率下降 40%
现象: 实施门禁后,开发同学每次提交都要等 15 分钟扫描,导致抵触情绪。
根因: 门禁策略一刀切,没有区分"紧急修复"和"日常开发"场景。
解决:
# 区分门禁策略
pipeline:
# ===== 紧急修复流水线(跳过安全检查,部署后补)=====
hotfix_pipeline:
approval: CTO / 架构师审批
skip_stages: [ code_check, dependency_scan, image_scan ]
stages: [ build, deploy ]
post_action: 部署后 24h 内补做安全扫描
# ===== 日常开发流水线(全量检查)=====
dev_pipeline:
stages: [ code_check, dependency_scan, unit_test, build, image_scan, deploy ]
block_on: critical # 仅 Critical 阻断
# ===== 发布流水线(严格检查)=====
release_pipeline:
approval: QA + 安全小组
stages: [ code_check, dependency_scan, unit_test, build, image_scan, vss_scan, deploy ]
block_on: [ critical, high ] # Critical + High 级别均阻断
❓ FAQ 常见问题
Q1:CodeArts Check 与 SonarQube 如何选择?
| 对比维度 | CodeArts Check | SonarQube |
|---|---|---|
| 部署方式 | SaaS 托管,开箱即用 | 需自建服务器,运维成本高 |
| 规则数量 | 3000+ 内置规则,持续更新 | 5000+ 规则,社区插件丰富 |
| 华为云集成 | 原生集成 Pipeline/SWR/VSS | 需要 Webhook 或 API 对接 |
| 成本 | 免费额度 5 万行/月,超出按量计费 | 社区版免费,Developer 版 ¥150+/年/用户 |
| 数据安全 | 代码保存在华为云,不出境 | 支持私有化部署,数据完全自控 |
建议: 如果团队已是华为云生态,优先选 CodeArts Check;如果有私有化部署需求或已深度使用 SonarQube,可通过 Pipeline 的 Webhook 能力集成 SonarQube 作为补充。
Q2:增量扫描和全量扫描到底怎么切?
# 最佳实践:首次全量 + 日常增量 + 定期全量
pipeline:
# 首次运行(创建任务时)
- stage: code_check_first
check_mode: full # 全量扫描,建立基线
# 日常 MR / 提交(默认)
- stage: code_check_daily
check_mode: incremental # 增量扫描,仅检查变更文件
# 优势:扫描时间从 10 分钟降到 30 秒
# 每月定时触发
- stage: code_check_monthly
trigger: cron # 每月 1 号凌晨 2 点
check_mode: full # 全量扫描,防止历史代码遗漏
🔥 踩坑经验补: 曾有个团队连续 6 个月只做增量扫描,结果历史分支合并时引入了 3 个 Critical 漏洞,到生产才被发现。增量扫描只检查 diff,不检查上下文联动风险。 建议每月至少一次全量扫描。
Q3:OWASP Dependency Check 国内加速还有哪些招?
除了正文提到的 NVD API Key 和华为云镜像两种方案,还有几个实战技巧:
# 方案四:使用华为云 CodeArts 依赖安全检查插件(推荐)
# Pipeline 中选择 "依赖安全检查" 插件,底层使用华为云自维护漏洞库
# 优点:无需下载 NVD 数据,扫描速度 1-3 分钟
# 方案五:私有 OBS 桶做 NVD 缓存代理
# 在 Pipeline 中先检查缓存,命中则跳过下载
if [ -f "$CACHE_DIR/nvd-data-$(date +%Y%m).tar.gz" ]; then
echo "✅ 命中 NVD 缓存,跳过下载"
else
echo "📥 缓存过期,从 OBS 拉取最新 NVD 数据"
wget -q "https://your-bucket.obs.cn-north-4.myhuaweicloud.com/nvd/latest.tar.gz" -O nvd.tar.gz
tar -xzf nvd.tar.gz -C ~/.dependency-check/data/
fi
# 方案六:内网 Nexus 代理
# 在 Nexus 中配置 NVD 代理仓库,团队共享缓存
# https://your-nexus.example.com/repository/nvd-proxy/
Q4:Pipeline 门禁卡住了紧急修复怎么办?
参考踩坑 4 的分级策略,补充一个紧急豁免 SOP:
# 紧急修复申请流程
sop:
trigger: 生产 P0/P1 事故需要紧急发布
steps:
1. 开发者创建 hotfix 分支
2. 架构师 / Tech Lead 在 Pipeline 审批页面点击"紧急豁免"
3. 系统记录豁免原因、审批人、时间戳
4. 跳过安全检查,直接构建部署
5. 自动创建"补扫"任务,要求 24h 内完成安全扫描
-- 审计日志(记录到 AOM/LTS)
INSERT INTO security_audit_log (timestamp, operator, action, reason, expires_at)
VALUES (NOW(),
'${approver}',
'HOTFIX_WAIVER',
'${waiver_reason}',
DATE_ADD(NOW(), INTERVAL 24 HOUR));
⚠️ 紧急豁免不等于放弃安全。建议在部署后自动创建 Jira 工单,分配给安全小组跟踪补扫进度,超时未补扫自动上报 CTO。
Q5:安全扫描出来的漏洞多到修不完怎么办?
按风险等级 × 影响范围矩阵来排优先级:
| 风险等级 | 影响范围广(核心服务) | 影响范围小(边缘服务) |
|---|---|---|
| Critical | 🔴 立即修复,阻断发布 | 🟠 24h 内修复 |
| High | 🟠 24h 内修复 | 🟡 本周迭代修复 |
| Medium | 🟡 本周迭代修复 | 🟢 下一迭代修复 |
| Low | 🟢 下一迭代修复 | ⚪ 记录 backlog |
建议每月做一次漏洞治理复盘,统计漏洞引入趋势、修复周期、重复出现的漏洞类型,持续改进研发规范。不要追求"零漏洞",而是"已知漏洞可控可追踪"。
📝 总结与展望
本文总结
要点总结:
- ✅ CodeArts Check — 创建检查任务、配置规则集、增量扫描
- ✅ Pipeline 集成 — 6 阶段 CI/CD 流水线,全自动安全检查
- ✅ OWASP 依赖检查 — Maven 插件配置、误报排除、漏洞库加速
- ✅ Docker 镜像扫描 — SWR 内置扫描、最小基础镜像、漏洞处理策略
- ✅ VSS Web 扫描 — 部署后 DAST 扫描、合规检测
- ✅ 安全门禁策略 — 分级阻断、紧急豁免、效率平衡
下篇预告
第7篇:压测驱动弹性伸缩:华为云 PerfTest + HPA 性能优化实战 — 对 CCE 上部署的 Java 应用进行性能压测,配置 HPA 弹性伸缩策略,优化 JVM 参数,寻找最佳性价比配置。
💡 互动话题: 你在构建安全流水线时遇到过哪些"门禁太严"与"开发效率"的矛盾?如何平衡的?
- 点赞
- 收藏
- 关注作者
评论(0)