KatsaounisThanasis/secure-supply-chain

GitHub: KatsaounisThanasis/secure-supply-chain

一个端到端的安全软件供应链参考实现,从代码检查到 Kubernetes 运行时准入控制,提供零信任制品完整性的自动化纵深防御。

Stars: 0 | Forks: 0

安全软件供应链 🛡️

一个经过强化的端到端 CI/CD 流水线,展示了从提交到运行时的零信任制品完整性。

Build Status License Go Version

Cosign Signed SBOM CycloneDX Trivy Scanned SLSA L2

Docker GitHub Actions Sigstore Kyverno

本仓库是生产级安全软件供应链的一个可运行参考实现。它提供了针对依赖项漏洞、机密信息泄露和构建时篡改的自动化纵深防御,并通过 Kubernetes 准入控制进行加密验证,以确保集群中仅运行经过验证且受信任的制品。每个阶段——从代码检查到准入控制——在每次推送时都能自我验证。
目录 - [架构](#architecture) - [演示内容](#what-this-demonstrates) - [流水线概览](#pipeline-at-a-glance) - [快速开始](#quickstart) - [验证已签名的镜像(无需安装)](#verify-a-signed-image-no-setup) - [运行本地扫描](#run-the-local-scan) - [运行时强制执行演示(kind 上的 Kyverno)](#demo-runtime-enforcement-kyverno-on-kind) - [威胁模型](#threat-model) - [技术栈](#tech-stack) - [仓库布局](#repository-layout) - [路线图 / 未来工作](#roadmap--future-work) - [作者](#author) - [许可证](#license)
## 架构 ``` graph TD classDef lint fill:#1E88E5,stroke:#fff,stroke-width:2px,color:#fff; classDef scan fill:#F4511E,stroke:#fff,stroke-width:2px,color:#fff; classDef gate fill:#E53935,stroke:#fff,stroke-width:2px,color:#fff; classDef sign fill:#43A047,stroke:#fff,stroke-width:2px,color:#fff; classDef runtime fill:#8E24AA,stroke:#fff,stroke-width:2px,color:#fff; A[Code Commit] --> B[Lint: Hadolint & Gitleaks]:::lint B --> C[Build Image Locally] C --> D[Trivy Vulnerability Scan]:::scan D -. SARIF Output .-> E[GitHub Security Tab] D --> H[Generate CycloneDX SBOM] H --> F{Enforcement Gate}:::gate F -- HIGH/CRITICAL CVEs --> G[Fail Pipeline]:::gate F -- Pass --> I[Push to GHCR] I --> J[Keyless Sign via Cosign & OIDC]:::sign J --> K[Attest SBOM via Cosign]:::sign K -. Transparency Log .-> L[(Rekor)] K --> M[Image + Signed SBOM] M --> N[Kubernetes Cluster] N --> O{Kyverno Admission Control}:::runtime O -- Signature Verified --> P[Pod Admitted]:::runtime O -- Unsigned/Invalid --> Q[Pod Rejected]:::runtime ``` ## 演示内容 * **DevSecOps 自动化:** 将安全无缝集成到开发生命周期中,且不阻碍部署速度。 * **加密来源证明:** 利用 Sigstore 的无密钥签名(Fulcio)和透明日志来将 CI 身份与制品绑定。 * **软件物料清单 (SBOM):** 通过 in-toto 证明生成 CycloneDX SBOM 并对其进行加密附加。 * **零信任运行时:** 使用 Kubernetes 准入控制器在部署时强制执行制品完整性。 * **安全左移:** 在暴露的机密信息和易受攻击的依赖项进入容器镜像仓库或集群之前发现它们。 ## 流水线概览 1. **代码检查:** 分析 Dockerfile 和仓库历史记录。*防止凭证暴露和不当的容器配置。* 2. **本地镜像构建:** 将应用程序编译为符合 OCI 标准的容器镜像。*在临时的 CI 环境中本地创建制品。* 3. **漏洞扫描(Trivy,JSON + SARIF):** 扫描本地镜像以查找操作系统和应用程序依赖项的 CVE。JSON 进入制品;SARIF 反馈到 GitHub Security 选项卡。*在发布前识别已知漏洞。* 4. **SBOM 生成:** 创建所有组件的机器可读清单。*在关卡之前生成,因此即使构建失败也存在分类数据。* 5. **强制执行关卡:** 针对 HIGH/CRITICAL(高/严重)级别的发现,使用 `exit-code: 1` 重新运行 Trivy。*停止流水线;不会将任何内容推送到 GHCR。* 6. **推送到镜像仓库 (GHCR):** 将经过审查的镜像上传到 GitHub Container Registry。*仅分发通过关卡的制品。* 7. **无密钥签名:** 使用 GitHub OIDC 和 Sigstore 基础设施对镜像进行签名。*提供无可辩驳的来源证明并防止篡改。* 8. **证明:** 将 SBOM 作为 OCI 引用附加到镜像中。*在加密上将组件清单与特定的镜像摘要绑定。* ## 快速开始 ### 验证已签名的镜像(无需安装) 您可以使用 Cosign (v2.0+) 验证我们构建的镜像的加密签名和 SBOM 证明。将 `` 替换为特定的提交或镜像摘要。 **验证镜像签名:** ``` cosign verify \ --certificate-identity-regexp="https://github.com/KatsaounisThanasis/secure-supply-chain/.github/workflows/security.yml@refs/heads/main" \ --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \ ghcr.io/katsaounisthanasis/secure-app: ``` **验证 SBOM 证明:** ``` cosign verify-attestation --type cyclonedx \ --certificate-identity-regexp="https://github.com/KatsaounisThanasis/secure-supply-chain/.github/workflows/security.yml@refs/heads/main" \ --certificate-oidc-issuer="https://token.actions.githubusercontent.com" \ ghcr.io/katsaounisthanasis/secure-app: ``` ### 运行本地扫描 要在本地验证代码是否存在泄露和配置错误: ``` ./scripts/scan.sh ``` ### 运行时强制执行演示(kind 上的 Kyverno) 本仓库包含了 Kubernetes 准入控制防止部署未签名镜像的完整本地演示。 ``` make kyverno-demo ``` *注意:此命令会启动一个本地的 `kind` 集群,安装 Kyverno 准入控制器,应用我们的 `verifyImages` ClusterPolicy(来自 `k8s/kyverno-policy.yaml`),然后尝试部署一个已签名的 Pod(`k8s/demos/pass-signed.yaml`)并成功,接着部署一个未签名的 Pod(`k8s/demos/fail-unsigned.yaml`)并被拒绝。* ## 实时证据 本 README 中的每一项声明都**可以在实时仓库中进行验证**——没有任何捏造的内容。流水线在每次推送时都会进行自我验证。 ### 流水线运行(代码检查 → 构建/扫描/签名 → 运行时强制执行)全部通过 Full pipeline run with three green jobs ### 运行时强制执行作业:已签名准入 + 未签名拒绝,均在 CI 中得到证明 Runtime enforcement job — every step green, including signed-admit and unsigned-reject assertions ### GitHub Container Registry 上的已签名镜像 GHCR package showing signed image versions and SBOM attestations ### 原始文本输出(签名、注解、变异的摘要、拒绝错误) 请参阅 [`docs/DEMO_OUTPUT.md`](docs/DEMO_OUTPUT.md) 以获取本地端到端运行的完整捕获终端输出,包括 cosign 验证详细信息、Kyverno `verify-images: pass` 注解和准入拒绝错误消息。 ### 其他实时链接 - **GitHub Code Scanning**(Trivy SARIF 发现):[/security/code-scanning](https://github.com/KatsaounisThanasis/secure-supply-chain/security/code-scanning) - `commit 55fe507` 的 **Sigstore Rekor 透明日志条目**:[search.sigstore.dev?logIndex=1473402910](https://search.sigstore.dev/?logIndex=1473402910) ## 威胁模型 | 威胁 | 缓解措施 | 阶段 | 类型 | | :--- | :--- | :--- | :--- | | **依赖项 CVE** | Trivy 扫描 + 强制执行关卡 | 扫描/关卡 | 侦探/预防 | | **存在漏洞的基础镜像** | 固定基础镜像 + Trivy 扫描 | 构建/扫描 | 预防 | | **构建时篡改** | SHA 固定的 Actions,临时的 OIDC | 全部 | 预防 | | **机密信息泄露** | Gitleaks 构建前扫描 | 代码检查 | 侦探/预防 | | **Dockerfile 反模式** | Hadolint | 代码检查 | 侦探 | | **镜像仓库受损 / 镜像替换** | Cosign 无密钥签名 + Rekor 透明度 | 签名/验证 | 加密 | | **身份欺骗** | 身份正则表达式 (Issuer/Subject) | 验证/运行时 | 加密 | | **未签名镜像执行** | Kyverno 准入控制 | 运行时 | 预防 | ## 技术栈 | 类别 | 工具 | | :--- | :--- | | **语言** | Go (应用程序),Bash (脚本) | | **CI/CD** | GitHub Actions,GitHub Container Registry (GHCR) | | **容器化** | Docker,kind (Docker 中的 Kubernetes) | | **安全扫描** | Trivy (CVE/SBOM),Hadolint (Dockerfile),Gitleaks (机密信息) | | **签名与来源** | Cosign,Sigstore (Fulcio, Rekor) | | **运行时安全** | Kyverno | ## 仓库布局 ``` . ├── .github/ │ └── workflows/ │ └── security.yml # Full CI/CD pipeline definition ├── app/ │ ├── Dockerfile # Multi-stage optimized Dockerfile │ ├── go.mod # Go dependencies │ ├── main.go # Application code │ └── main_test.go # Unit tests ├── docs/ │ └── SECURITY_DESIGN.md # In-depth architectural security documentation ├── k8s/ │ ├── demos/ │ │ ├── fail-unsigned.yaml # Demo manifest (gets rejected) │ │ └── pass-signed.yaml # Demo manifest (gets admitted) │ ├── kyverno-policy.yaml # Kyverno ClusterPolicy for signature verification │ └── namespace.yaml # Target namespace configuration ├── scripts/ │ ├── kind-config.yaml # Local cluster configuration │ ├── scan.sh # Local linting and scanning wrapper │ ├── verify-image.sh # Local script to run cosign verifications │ └── verify.sh # CI verification test script ├── LICENSE # MIT License ├── Makefile # Targets for local builds and the kyverno-demo └── README.md # This document ``` ## 路线图 / 未来工作 * **SLSA Level 3 来源:** 集成 `slsa-github-generator` 以提供完全不可伪造的构建来源证明。 * **摘要固定的基础镜像:** 从标签固定(`golang:1.26.2-alpine`,`alpine:3.20`)过渡到摘要固定(`@sha256:...`)的基础镜像,以实现完全不可变的构建。 * **变更策略:** 实现带有 `mutateDigest` 的 Kyverno 策略,以便在准入时自动将镜像标签解析为摘要。 * **Policy Controller 替代方案:** 评估并配置 Sigstore `policy-controller` 作为 Kyverno 签名验证的替代方案。 * **可观测性:** 引入 Grafana 仪表板,用于历史 Trivy SARIF 数据和集群策略违规情况。 ## 作者 由 Thanasis Katsaounis 构建并维护。在 [GitHub](https://github.com/KatsaounisThanasis) 上找到我。 ## 许可证 本项目基于 [MIT 许可证](LICENSE) 授权。
标签:Chrome Headless, CI/CD安全, Cosign, CycloneDX, DevSecOps, Docker, GHCR, GitHub Actions, gitleaks, Go语言, hadolint, Kubernetes安全, Llama, SARIF, SBOM, Sigstore, SLSA, Web截图, 上游代理, 代码审查, 参考架构, 安全合规, 安全工程, 安全防御评估, 完整性验证, 容器安全, 应用安全, 日志审计, 硬件无关, 程序破解, 结构化查询, 网络代理, 自动化安全, 自动笔记, 请求拦截, 软件供应链安全, 远程方法调用, 镜像签名, 防御深度, 零信任安全