安全左移:华为云 CodeArts Check 在 Pipeline 中嵌入代码质量与安全扫描

举报
行者·全栈架构师 发表于 2026/07/04 13:29:29 2026/07/04
【摘要】 在第2篇构建的 Pipeline 中集成 CodeArts Check 代码检查、依赖安全扫描(OSS)、Web 漏洞扫描(VSS),将安全左移到开发阶段。涵盖 Maven 项目代码规范检查、自定义规则集、增量扫描、门禁机制、OWASP Top 10 依赖漏洞检测、Docker 镜像安全扫描全流程,附 5 个安全扫描配置模板和 4 个企业级规则集。

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

🎯 为什么需要代码质量与安全扫描?

"安全左移"理念

006-codearts-check-security-guide_diagram_1.png

安全漏洞的修复成本(来源:NIST 研究):

  • 开发阶段发现并修复:$1
  • 构建阶段发现并修复:$10
  • 测试阶段发现并修复:$100
  • 生产环境发现并修复:$1,000+
  • 漏洞披露后修复:$10,000+

云原生实战系列集成全景

006-codearts-check-security-guide_diagram_2.png

📋 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 镜像的 musllibcrypto 等系统库经常被扫描出低危漏洞,这些漏洞在 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"]
    }
  }'

📊 安全质量看板

代码质量趋势

006-codearts-check-security-guide_diagram_3.png

月份 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 的 muslapklibssl 等系统包在 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

建议每月做一次漏洞治理复盘,统计漏洞引入趋势、修复周期、重复出现的漏洞类型,持续改进研发规范。不要追求"零漏洞",而是"已知漏洞可控可追踪"。

📝 总结与展望

本文总结

要点总结:

  1. CodeArts Check — 创建检查任务、配置规则集、增量扫描
  2. Pipeline 集成 — 6 阶段 CI/CD 流水线,全自动安全检查
  3. OWASP 依赖检查 — Maven 插件配置、误报排除、漏洞库加速
  4. Docker 镜像扫描 — SWR 内置扫描、最小基础镜像、漏洞处理策略
  5. VSS Web 扫描 — 部署后 DAST 扫描、合规检测
  6. 安全门禁策略 — 分级阻断、紧急豁免、效率平衡

下篇预告

第7篇:压测驱动弹性伸缩:华为云 PerfTest + HPA 性能优化实战 — 对 CCE 上部署的 Java 应用进行性能压测,配置 HPA 弹性伸缩策略,优化 JVM 参数,寻找最佳性价比配置。

💡 互动话题: 你在构建安全流水线时遇到过哪些"门禁太严"与"开发效率"的矛盾?如何平衡的?

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。