You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将npm SBOM导入Artifactory供Xray扫描(Gradle+Jib场景)

解决Gradle+Jib场景下npm依赖信息导入JFrog Xray的方案

核心思路

通过Jib Gradle插件扩展嵌入前端npm依赖元数据,结合JFrog CLI同步依赖信息,让Xray能抓取到完整的前后端依赖数据,无需切换到Maven。

具体实现步骤

1. 用Jib Gradle插件嵌入npm依赖清单

Jib支持给容器镜像添加自定义标签或注释,我们可以把前端的package-lock.json(或精简的依赖树JSON)嵌入镜像元数据,让Xray扫描时能读取到npm依赖信息。

在项目根目录的build.gradle中配置Jib插件:

plugins {
    id 'com.google.cloud.tools.jib' version '3.4.0' // 使用最新稳定版本
}

jib {
    container {
        // 将前端package-lock.json内容作为镜像标签嵌入
        labels = [
            "JFROG_XRAY_NPM_DEPENDENCIES": new File("frontend/package-lock.json").text
        ]
        // 若package-lock过大,可先生成精简依赖树再嵌入:
        // "JFROG_XRAY_NPM_DEPENDENCIES": new ByteArrayOutputStream().withStream { os ->
        //     exec {
        //         commandLine 'npm', 'list', '--json', '--prefix', 'frontend'
        //         standardOutput = os
        //     }
        //     os.toString()
        // }
    }
}

2. 结合JFrog CLI同步npm SBOM到Artifactory

在CI/CD流程中,生成前端npm依赖的SBOM并上传到Artifactory,再关联到容器镜像,让Xray能关联扫描:

  1. 前端目录生成SBOM:
cd frontend
npm install
# 用cyclonedx生成标准SBOM
npx @cyclonedx/cyclonedx-npm -o ./sbom-npm.json
  1. 用JFrog CLI上传SBOM并关联镜像:
# 配置Artifactory连接
jfrog rt config --url=https://your-artifactory-domain --user=your-account --apikey=your-api-key
# 上传SBOM到指定仓库
jfrog rt upload ./frontend/sbom-npm.json sbom-repo/npm/
# 构建镜像时添加标签关联SBOM路径
./gradlew jib --image=your-artifactory-domain/docker-repo/your-app:latest \
  -Djib.container.labels=JFROG_XRAY_SBOM_PATH=sbom-repo/npm/sbom-npm.json

3. 配置Xray识别自定义元数据

在JFrog Xray后台配置元数据提取规则,确保能解析嵌入的npm依赖信息:

  • 进入Xray → Settings → Metadata Extraction Rules
  • 添加新规则,选择「容器镜像」类型
  • 配置提取JFROG_XRAY_NPM_DEPENDENCIES标签内容,设置解析格式为JSON
  • 保存规则后,Xray扫描容器镜像时会自动解析并纳入npm依赖的漏洞检测

验证方法

构建并上传镜像后,查看Xray的扫描报告,确认报告中包含前端npm依赖项及对应的漏洞信息。

内容的提问来源于stack exchange,提问作者user3240316

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:17:14