supplyshield/supplyshield
GitHub: supplyshield/supplyshield
SupplyShield 是一个开源的软件供应链安全编排框架,通过自动化扫描、漏洞优先级排序与问题编排来保护软件供应链。
Stars: 16 | Forks: 4
# 🛡️ SupplyShield
.. image:: https://github.com/supplyshield/supplyshield/blob/develop/docs/images/logo.png
:alt: SupplyShield Logo
:align: center
SupplyShield 是一个开源的应用安全编排框架,旨在保护您的软件供应链免受漏洞、恶意依赖和未经批准的基础镜像的侵害。它提供了一个全面的解决方案,用于自动化检测、优先级排序和修复开源依赖和容器化应用中的安全问题。
|Python 3.10+| |stability-wip|
.. |Python 3.10+| image:: https://img.shields.io/badge/python-3.10+-green.svg
:target: https://www.python.org/downloads/release/python-3100/
.. |stability-wip| image:: https://img.shields.io/badge/stability-work_in_progress-lightgrey.svg
.. note::
SupplyShield 处于积极开发中,相关发行版可在 GitHub 的 "releases" 部分获取。
📚 请访问 `文档 `_ 以了解更多 SupplyShield 信息。
## 🚀 功能特性
- **自动化 SBOM 生成:** 使用 cdxgen 生成软件物料清单(SBOM),支持多种包管理器(Java、Python、Node.js、Go 等)。
- **全面的软件组成分析(SCA):** 识别开源依赖中的漏洞。
- **基于 EPSS 的漏洞优先级排序:** 利用漏洞利用预测评分系统(EPSS)根据漏洞被利用的可能性进行优先级排序。
- **可操作的安全发现:** 自动识别安全的包版本,并为易受攻击的依赖提供升级建议。
- **GitHub 集成:** 与 GitHub 无缝集成,自动创建包含安全发现的问题。
- **CI/CD 流水线集成:** 通过消息队列处理 CI/CD 流水线中的扫描请求。
- **构建对比:** 对比不同构建之间的漏洞和包变化,以跟踪随时间的安全改进。
- **仓库管理:** 提供包含过滤、统计和跨环境漏洞跟踪的完整仓库列表。
- **多环境支持:** 跨不同部署环境(开发、预生产、生产)跟踪和管理安全发现。
- **基于 Docker 的架构:** 使用 Docker Compose 提供的完全容器化部署,便于设置和扩展。
**技术栈:** 🐍 Python | 🌶️ Flask | 🐘 PostgreSQL | 🐳 Docker
## 🚀 安装与设置
## 先决条件
- 系统中已安装 Docker 和 Docker Compose
- 用于克隆仓库的 Git
- 访问所需的密钥和凭证(请参见下方的配置部分)
## 步骤 1:获取源代码
克隆包含所有子模块的项目仓库并进入项目目录:
.. code-block:: bash
git clone --recurse-submodules https://github.com/supplyshield/supplyshield/
cd supplyshield
## 步骤 2:配置环境变量
在根目录创建一个 `docker.env` 文件。该文件包含运行 SupplyShield 所需的所有配置变量。
### 必需的配置变量
**数据库配置:**
.. code-block:: bash
# PostgreSQL 数据库用于 ScanCode.io
POSTGRES_DB=scancodeio
POSTGRES_USER=scancodeio
POSTGRES_PASSWORD=scancodeio
POSTGRES_HOST_AUTH_METHOD=trust
POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8
# SupplyShield 服务的数据库配置
DB_HOSTNAME=db
DB_USERNAME=scancodeio
DB_PASSWORD=scancodeio
# ScanCode.io 数据库配置
SCANCODEIO_DB_HOST=db
SCANCODEIO_DB_NAME=scancodeio
SCANCODEIO_DB_USER=scancodeio
SCANCODEIO_DB_PASSWORD=scancodeio
# PurlDB 数据库配置(使用相同的数据库实例,不同的模式)
PACKAGEDB_DB_HOST=db
PACKAGEDB_DB_NAME=packagedb
PACKAGEDB_DB_USER=scancodeio
PACKAGEDB_DB_PASSWORD=scancodeio
**AWS 配置(CI/CD 集成和 SBOM 上传必需):**
.. code-block:: bash
AWS_DEFAULT_REGION=ap-south-1
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
S3_BUCKET_NAME=your-s3-bucket-name
SQS_QUEUE_NAME=your-sqs-queue-name
**GitHub 应用配置(仓库克隆和问题创建必需):**
.. code-block:: bash
GIT_PROVIDER=github
GIT_ORG=your-organization
GITHUB_APP_APP_ID=your-github-app-id
GITHUB_APP_INSTALLATION_ID=your-installation-id
**服务 URL:**
.. code-block:: bash
SCANCODEIO_URL=http://scancodeio:8000
SUPPLYSHIELD_BASE=http://web:5000
PURLDB_URL=http://purldb:8000
PURLDB_API_URL=http://purldb:8000/api
VULNERABLECODE_URL=https://public.vulnerablecode.io/
**可选配置:**
.. code-block:: bash
# Jira 集成(可选)
JIRA_URL=https://org_name.atlassian.net
JIRA_USER=your-email@example.com
JIRA_TOKEN=your-jira-token
# 服务元数据 URL(可选)
SERVICE_METADATA_URL=https://your-metapod-url
# 允许的主机
ALLOWED_HOSTS=scancodeio,your-server-ip
# Django 密钥
SECRET_KEY=your-secret-key-here
# Go 私有模块配置(可选)
GO_PRIVATE=your-go-private-config
## 步骤 3:设置 GitHub 应用私钥
SupplyShield 需要 GitHub 应用私钥来验证与 GitHub 的通信。将您的私钥文件放置在以下位置:
.. code-block:: bash
etc/secrets/github_app_private_key.pem
私钥文件应为 PEM 格式,并且必须与 `docker.env` 中配置的 GitHub 应用 ID 匹配。
.. note::
GitHub 应用必须具有以下权限:
- **内容**:读取(用于克隆仓库)
- **问题**:写入(用于创建/更新问题)
- **元数据**:读取(所有 GitHub 应用必需)
## 步骤 4:使用 Docker Compose 启动服务
启动所有 SupplyShield 服务:
.. code-block:: bash
sudo docker compose up -d
此命令将启动以下服务:
- **db**:PostgreSQL 数据库
- **scancode-migrate**:运行 ScanCode.io 的数据库迁移
- **scancodeio**:ScanCode.io 服务(端口 8002)
- **daemon**:SupplyShield 守护服务(端口 8001)
- **crons**:定时任务运行器
- **purldb**:PurlDB 服务(端口 8003)
- **web**:SupplyShield Web 界面(端口 8000)
## 步骤 5:验证安装
检查所有服务是否正在运行:
.. code-block:: bash
sudo docker compose ps
所有服务应显示为“Up”或“Healthy”。您还可以访问:
- Web 界面:http://localhost:8000
- ScanCode.io:http://localhost:8002
- PurlDB API:http://localhost:8003
## 📖 使用指南
## 扫描单个仓库
要扫描单个仓库,请使用 `process-message` 命令。这将:
1. 克隆仓库
2. 生成 SBOM(软件物料清单)
3. 扫描依赖项中的漏洞
4. 将结果存储在数据库中
**命令格式:**
.. code-block:: bash
sudo docker compose run --rm daemon libinv process-message ''
**示例:**
.. code-block:: bash
sudo docker compose run --rm daemon libinv process-message '{
"repository": {
"url": "https://github.com/org/repo.git",
"commit": "da80e73b4376a0c8d3c6404f272b8f04e6568f40",
"tag": "da80e73"
},
"job_url": "https://jenkins/job/XYZ/",
"aws_environment": "prod",
"buildx_enabled":1",
"ecr_image": [],
"type": "Bridge",
"timestamp": "2025-11-22-06:52:17"
}'
**必需的 JSON 字段:**
- ``repository.url``:Git 仓库 URL(必需) - 应以 ``.git`` 结尾
- ``repository.commit``:Git 提交 SHA(必需)
- ``type``:消息类型,必须为 ``"Bridge"`` 用于仓库扫描(必需)
- ``timestamp``:时间戳格式为 ``"YYYY-MM-DD-HH:MM:SS"``(必需)
- ``aws_environment``:环境名称(必需)
- ``job_url``:CI/CD 作业 URL(必需)
**可选的 JSON 字段:**
- ``repository.tag``:Git 标签或分支名称(可选)
- ``buildx_enabled``:是否启用 Docker buildx(可选,默认为 ``"1"``)
- ``ecr_image``:ECR 镜像列表(可选,默认为 ``[]``)
**带调试输出:**
.. code-block:: bash
sudo docker compose run --rm daemon libinv --debug process-message ''
## 查找易受攻击包的安全版本
**填充可操作的 PURL 版本:**
获取并存储可操作包的可用版本:
.. code-block:: bash
sudo docker compose run --rm daemon libinv populate-actionable-purl-versions
**扫描正在使用的版本:**
扫描当前正在使用的所有包版本:
.. code-block:: bash
sudo docker compose run --rm daemon libinv --debug scan-versions-in-use
**扫描最新版本:**
扫描没有已知安全版本的包的最新版本:
.. code-block:: bash
sudo docker compose run --rm daemon libinv --debug scan-latest-versions
**填充下一个安全版本:**
为每个易受攻击的包查找并填充最接近的安全版本:
.. code-block:: bash
sudo docker compose run --rm daemon libinv --debug populate-next-safe-versions
## 更新 EPSS 分数
EPSS(漏洞利用预测评分系统)分数有助于根据漏洞被利用的可能性来优先处理漏洞。SupplyShield 可以更新 CVE 的 EPSS 分数。
**更新所有可操作 CVE 的 EPSS:**
此命令将更新可操作包中所有 CVE 的 EPSS 分数:
.. code-block:: bash
sudo docker compose run --rm daemon libinv --debug epss-update --all-actionable-cves
**计算包 EPSS 分数:**
在更新 CVE 的 EPSS 分数后,计算每个包的最高 EPSS 分数:
.. code-block:: bash
sudo docker compose run --rm daemon libinv --debug calculate-package-epss
此命令将:
1. 获取所有成功扫描的包
2. 提取每个包的 CVE
3. 从这些 CVE 中找到最高的 EPSS 分数
4. 使用最高 EPSS 分数更新包记录
## 将安全问题提升为 Git 问题
SupplyShield 可以自动为仓库创建或更新 GitHub 问题,其中包含可操作的安全发现。
**先决条件:**
- 仓库必须已经过扫描(请先使用 `process-message`)
- 仓库必须在 GitHub 上启用了 Issues
- GitHub 应用必须具有 "Issues: Write" 权限
**命令格式:**
.. code-block:: bash
sudo docker compose run --rm daemon libinv raise-sca-as-git-issue ""
**示例:**
.. code-block:: bash
sudo docker compose run --rm daemon libinv raise-sca-as-git-issue "https://github.com/org/repo.git"
**带调试输出:**
.. code-block:: bash
sudo docker compose run --rm daemon libinv --debug raise-sca-as-git-issue "https://github.com/org/repo.git"
**此命令的作用:**
1. 在数据库中找到仓库
2. 识别可操作的安全发现(易受攻击的包)
3. 创建或更新 GitHub 问题,内容包括:
- 易受攻击的包列表
- 当前使用的版本
- 建议的安全版本
- 用于优先级的 EPSS 分数
- 包详情和升级路径
**故障排除:**
- 如果出现 "Issues has been disabled in this repository",请在仓库设置中启用 Issues
- 如果出现 "Couldn't find in database",请先使用 `process-message` 扫描仓库
- 检查 GitHub 应用权限,确保已启用 "Issues: Write"
## 定时任务
`crons` 服务会自动运行 `docker-compose.yml` 中配置的定时任务。这些任务包括:
- **populate_actionable_purl_versions**:获取可操作包的可用版本(每 2 天)
- **update_latest_version_tag**:为每个包标记最新版本(每 2 天)
- **scan_versions_in_use**:扫描当前正在使用的所有包版本(每 2 天)
- **scan_latest_versions**:扫描没有安全版本的包的最新版本(每 2 天)
- **populate_next_safe_versions**:查找最近的安全版本(每 2 天)
- **epss_update**:更新所有可操作 CVE 的 EPSS 分数(每天)
- **calculate_package_epss**:计算包 EPSS 分数(每天)
这些任务会自动运行,无需人工干预。
## 🏗️ 架构图
以下图表说明了 SupplyShield 的架构:
.. image:: ./docs/images/architecture-simplified.png
:alt: SupplyShield 架构简化图
:align: center
## 👥 贡献者
- Akhil Mahendra
- Hritik Vijay
- Rahul Sunder
- Roshan Kumar
- Yadhu Krishna M
.. note::
我们欢迎贡献!如果您想为 SupplyShield 做出贡献,请查看我们的文档,并随时提交问题或拉取请求。
## 📄 版权声明
Copyright (c) SupplyShield 及其相关方。保留所有权利。
标签:cdxgen, CI/CD 安全, DevSecOps, EPSS, GitHub 安全集成, GPT, Python, SBOM, Web截图, XML 请求, 上游代理, 供应链攻击防护, 依赖安全, 安全优先级, 安全修复建议, 安全开发, 容器安全, 应用安全编排, 开源组件审计, 数据投毒防御, 无后门, 构建对比, 测试用例, 消息队列, 漏洞管理, 硬件无关, 自动化安全扫描, 请求拦截, 软件供应链安全, 远程方法调用, 逆向工具