getbrik/brik-images

GitHub: getbrik/brik-images

专为 Brik CI/CD 预装的签名、扫描、多架构 runner 镜像,消除流水线引导开销并提供透明的供应链安全状况。

Stars: 0 | Forks: 0

Brik

专为 Brik 构建的 CI runner 镜像。
预装了 bash + yq + jq + git 以及你的技术栈工具链。已签名、已认证、已扫描,且支持多架构。
不再需要为每个 CI 任务进行引导初始化。

[![构建](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/e4c991d858183000.svg)](https://github.com/getbrik/brik-images/actions/workflows/build.yml) [![构建出处](https://img.shields.io/badge/build%20provenance-attested-brightgreen?logo=github)](https://github.com/getbrik/brik-images/attestations) [![使用 cosign 签名](https://img.shields.io/badge/cosign-signed-blue?logo=sigstore)](#verifying) [Brik](https://github.com/getbrik/brik) CI/CD runner 的官方 Docker 镜像。 ## 这些镜像解决的问题 原生的编程语言镜像(`node:24-slim`、`python:3.13-slim`)非常适合开发环境,但它们并不是为 CI 构建的: - 每个 CI 任务都会重新安装相同的 `bash 5+`、`yq`、`jq`、`git` 和 `curl`。每条流水线中的每个任务都要耗费 30 到 40 秒。 - 没有签名、没有出处证明、没有 SBOM。你只能盲目相信维护者所声称的镜像内容。 - CVE 补丁严重滞后。原生镜像按照维护者的节奏进行重建,而不是根据你的节奏。 - 缺少专用于 CI 的工具。对于 SAST、SCA、机密扫描和容器 lint:你需要自行准备并在每次任务中手动安装。 brik-images 是 CI runner 镜像。彻底告别初始化引导。出处已签名。每次推送时,都会实时发布每个镜像的 CVE 安全状况。扫描器和分析工具已预装在专用镜像中。 ## 这些镜像的独特之处 ### 🔐 已签名并认证 每个镜像都使用 [cosign](https://github.com/sigstore/cosign)(无密钥,OIDC)进行签名,并携带 SLSA 构建出处证明,你可以使用 `gh attestation verify` 进行验证。杜绝供应链信任缺口。具体命令请参阅[验证](#verifying)。 ### 🔍 真实透明的扫描 在[可用镜像](#available-images)表中提供实时的 CVE 数量,而不是一个静态的“0 个漏洞”徽章。构建过程**仅在存在可用上游修复的严重级别 CVE 时**才会强制失败。其他所有漏洞都会被记录下来,在[安全标签页](https://github.com/getbrik/brik-images/security/code-scanning)中可见,并被视为已知的安全状况而非隐藏风险。完整状况记录在[当前 CVE 状况](#current-cve-posture)中。 ### 🔄 持续重建 每次构建都会应用基础镜像待处理的 OS 安全更新(`apt-get upgrade`)。每周重建会刷新基础镜像。[Renovate](https://github.com/renovatebot/renovate) 会自动合并摘要更新。被抑制的 CVE 会在每周一由自动生成的 [CVE 抑制审查 issue](https://github.com/getbrik/brik-images/issues?q=is%3Aissue+label%3Acve-suppression-review) 进行审查,确保没有任何问题被悄然遗忘。 ### 🧱 专为 Brik 构建 每个镜像都预装了 `bash 5+`、`yq`、`jq`、`git` 和 `curl`。技术栈镜像额外增加了各自的工具链。Brik runtime 本身会在 CI 运行时由共享库的 `before_script` 进行克隆,这使得镜像发布与 Brik 版本发布解耦。 ## 包含内容 每个镜像都包含: - **bash** (5.x) - **yq**:YAML 处理器 - **jq**:JSON 处理器 - **git**:版本控制工具 - **curl**:HTTP 客户端 技术栈镜像还额外包含它们各自的工具链(node/npm、python/pip、java/maven、rust/cargo、dotnet/sdk)。所有捆绑工具的精确锁定版本都在 [`versions.json`](versions.json) 中。 ### 分析镜像与扫描器镜像 扫描工具根据其运行时要求被拆分到两个镜像中: - **analysis**:包含 Python/Ruby runtime,用于深度 SAST 分析、许可证合规性检查和 IaC 扫描。 - **scanner**:仅包含静态编译的 Go 二进制文件,拉取速度快,用于漏洞扫描、机密检测、Dockerfile lint 和容器扫描。 #### Analysis 镜像 (~1.7 GB) | 工具 | 用途 | |------|---------| | semgrep | 静态分析 (SAST) | | checkov | 基础设施即代码扫描 | | scancode-toolkit | 许可证与来源检测 | | license_finder | 许可证合规性检查 | #### Scanner 镜像 (~500 MB) | 工具 | 用途 | |------|---------| | grype | 漏洞扫描 (SCA) | | syft | SBOM 生成 | | osv-scanner | 开源漏洞扫描 | | hadolint | Dockerfile lint | | gitleaks | 机密/凭证泄露检测 | | trufflehog | 机密扫描(基于熵和特征匹配) | | dockle | Docker 镜像最佳实践 lint | ### Deploy 镜像 `brik-runner-deploy`(FROM base)包含了 Brik 的 CD 流程中 deploy-class runner 所使用的 CD 工具链。它在部署工具的基础上增加了 cosign 和 oras,使得流程可以在部署前验证已解析摘要上的签名证明。 | 工具 | 用途 | |------|---------| | helm | Kubernetes 包管理器 | | kubectl | Kubernetes CLI | | argocd | GitOps CD 控制器 CLI | | cosign | 验证镜像签名和出处证明 | | oras | OCI 制品传输(取证) | ## 可用镜像 | 镜像 | 版本 | 安全性 | 拉取命令 | |-------|---------|----------|--------------| | `brik-runner-base` | `3.23` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/base-3.23.json) | `docker pull ghcr.io/getbrik/brik-runner-base` | | `brik-runner-node` | `22` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/node-22.json) | `docker pull ghcr.io/getbrik/brik-runner-node:22` | | `brik-runner-node` | `24` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/node-24.json) | `docker pull ghcr.io/getbrik/brik-runner-node:24` | | `brik-runner-python` | `3.13` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/python-3.13.json) | `docker pull ghcr.io/getbrik/brik-runner-python:3.13` | | `brik-runner-python` | `3.14` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/python-3.14.json) | `docker pull ghcr.io/getbrik/brik-runner-python:3.14` | | `brik-runner-java` | `21` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/java-21.json) | `docker pull ghcr.io/getbrik/brik-runner-java:21` | | `brik-runner-java` | `25` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/java-25.json) | `docker pull ghcr.io/getbrik/brik-runner-java:25` | | `brik-runner-rust` | `1` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/rust-1.json) | `docker pull ghcr.io/getbrik/brik-runner-rust:1` | | `brik-runner-dotnet` | `9.0` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/dotnet-9.0.json) | `docker pull ghcr.io/getbrik/brik-runner-dotnet:9.0` | | `brik-runner-dotnet` | `10.0` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/dotnet-10.0.json) | `docker pull ghcr.io/getbrik/brik-runner-dotnet:10.0` | | `brik-runner-analysis` | `1` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/analysis-1.json) | `docker pull ghcr.io/getbrik/brik-runner-analysis` | | `brik-runner-scanner` | `1` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/scanner-1.json) | `docker pull ghcr.io/getbrik/brik-runner-scanner` | | `brik-runner-deploy` | `1` | ![CVEs](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/getbrik/brik-images/main/docs/badges/deploy-1.json) | `docker pull ghcr.io/getbrik/brik-runner-deploy` | 所有镜像均支持多架构:`linux/amd64` 和 `linux/arm64`。 ## 安全性 每个镜像都经过扫描、签名,并持续重建: - ✅ 每次构建时都使用 [Grype](https://github.com/anchore/grype) 进行扫描。构建**仅在存在可用上游修复的严重级别 CVE 时**才会强制失败。上游尚未修复的严重和高危 CVE 会被记录下来,但不会阻断流程。 - ✅ 扫描结果上传至[安全标签页](https://github.com/getbrik/brik-images/security/code-scanning),实现针对每个镜像的全面可见性。 - ✅ 使用 [Syft](https://github.com/anchore/syft) 生成 CycloneDX 格式的 SBOM。 - ✅ 使用 [cosign](https://github.com/sigstore/cosign)(无密钥,OIDC)对镜像进行签名。 - ✅ 每次构建都会应用基础镜像待处理的 OS 安全更新;每周重建会刷新基础镜像;[Renovate](https://github.com/renovatebot/renovate) 自动合并摘要更新。 ### 当前 CVE 状况 **我们能控制的:** 内置工具(`yq`、`jq`、`git` 以及扫描器/分析二进制文件)均锁定为最新版本并定期升级;如果存在修复补丁,遇到严重级别的 CVE 时构建会自动阻断。 **我们无法控制的:** 编程语言 runtime 本身以及静态链接的 Go 二进制文件中的 CVE;这些只有在 runtime 或工具上游发布修复版本后才会被清除。在生产环境中使用时,请通过摘要固定镜像版本,并根据你自身的风险策略执行扫描门禁检查。 ### 被抑制的 CVE **实时状态**(各工具的细分情况,以及是否已发布修复版本)显示在会自动刷新的 [CVE 抑制审查 issue](https://github.com/getbrik/brik-images/issues?q=is%3Aissue+label%3Acve-suppression-review) 中,该 issue 会在每周一由 [`scripts/review-cve-suppressions.sh`](scripts/review-cve-suppressions.sh) 重新生成。当某工具发布了基于已修复 Go 版本的更新时,请在 [`versions.json`](versions.json) 中升级该工具版本,并从 `.grype.yaml` 和 [`.cve-suppressions.json`](.cve-suppressions.json) 中移除其对应条目。 ### 验证 每个镜像都使用 cosign(无密钥)进行签名,并携带 SLSA 构建出处证明。要自行验证已拉取的镜像(可根据需要调整 tag): ``` # cosign signature cosign verify ghcr.io/getbrik/brik-runner-node:24 \ --certificate-identity-regexp 'https://github.com/getbrik/brik-images/.*' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com # GitHub build-provenance attestation gh attestation verify oci://ghcr.io/getbrik/brik-runner-node:24 --owner getbrik ``` 每份证明也都列在[证明页面](https://github.com/getbrik/brik-images/attestations)上。 ## Tag 命名规范 每个镜像在发布时都带有多个 tag: ``` ghcr.io/getbrik/brik-runner-node:22 # stack version (mutable) ghcr.io/getbrik/brik-runner-node:latest # latest LTS (mutable) ghcr.io/getbrik/brik-runner-node:sha-a1b2c3d # immutable git SHA ghcr.io/getbrik/brik-runner-node:22@sha256:... # digest pin (most secure) ``` ## 使用方法 你无需手动选择镜像,也不需要在其中安装 `brik`。`init` 任务会从你的 `brik.yml` 中读取 `project.stack` 和 `project.stack_version`,并将每个阶段解析为对应的 `ghcr.io/getbrik/brik-runner-:`;共享库会在任务开始时将 Brik runtime 克隆到容器中。 ### GitLab CI 引入 Brik 模板即可。完整的流水线配置如下: ``` # .gitlab-ci.yml include: - project: 'brik/gitlab-templates' ref: v0.7.0 file: '/templates/brik-integrate.yml' ``` 如果在 `brik.yml` 中设置了 `project.stack: node` 和 `stack_version: "22"`,各阶段任务将在 `ghcr.io/getbrik/brik-runner-node:22` 上运行;而扫描、分析和部署阶段将自动在其专用镜像上运行。 ### Jenkins Brik 共享库并调用协调器即可。与前面一样,会自动从 `brik.yml` 中解析镜像: ``` // Jenkinsfile @Library('brik') _ brikIntegrate() ``` ### 本地环境 只要在主机上安装了 Brik CLI,你就可以直接在项目目录中运行流程。Brik 会驱动与 CI 相同的容器化引擎,为每个阶段生成一个 brik-runner 容器(镜像将从你的 `brik.yml` 中解析): ``` brik integrate # full CI flow locally, one container per stage brik stage build # or run a single stage in its runner image ``` ### 使用你自己的镜像(镜像站、私有 registry、自定义 runner) 每个 runner 类别都映射到 runner 类别映射表中的一个镜像。如果需要从镜像站、气隙 registry 或扩展了内部工具的自定义 runner 中拉取,请使用 `BRIK_RUNNER_CLASSES_FILE` 流水线变量(在 GitLab 中是 CI 变量,在 Jenkins 中是构建参数)将 Brik 指向备用映射表,而无需编辑你的 CI 文件: ``` # my-runner-classes.yml,已提交到您的 repo classes: base: { image: registry.example.com/acme/brik-runner-base, tag: "1.4.0" } scanner: { image: registry.example.com/acme/brik-runner-scanner, tag: "1.4.0" } analysis: { image: registry.example.com/acme/brik-runner-analysis, tag: "1.4.0" } deploy: { image: registry.example.com/acme/brik-runner-deploy, tag: "1.4.0" } stack: { image_env: BRIK_CI_IMAGE } # stack image stays resolved from brik.yml ``` 然后为流水线设置 `BRIK_RUNNER_CLASSES_FILE=my-runner-classes.yml`。 ## 本地构建 ### 快速开始 ``` # 构建所有镜像(multi-arch,无 push) ./scripts/build-local.sh # 构建并加载到本地 Docker(仅限 native arch) ./scripts/build-local.sh --load # 构建特定 stacks(扩展至所有版本) ./scripts/build-local.sh --load node python # 构建特定 targets ./scripts/build-local.sh --load analysis-1 scanner-1 ``` ### build-local.sh 选项 | 选项 | 描述 | |--------|-------------| | (无参数) | 构建所有镜像(多架构) | | `` | 构建指定技术栈的所有版本(例如:`node` 会构建 `node-22` + `node-24`) | | `` | 构建指定的目标(例如:`node-22`、`quality-1`) | | `--load` | 将镜像加载到本地 Docker 中(强制使用本机架构) | | `--platform PLAT` | 覆盖目标平台(例如:`linux/amd64`) | | `--no-cache` | 禁用 Docker 构建缓存 | | `--regenerate` | 在构建前重新生成 `docker-bake.hcl` | | `--push` | 将镜像推送到 registry(需要身份验证) | | `--list` | 列出所有可用的目标和栈 | | `--dry-run` | 仅显示命令而不实际执行 | ### 示例 ``` # 列出可用的 targets ./scripts/build-local.sh --list # 从头重新构建 analysis 镜像,单架构 ./scripts/build-local.sh --load --no-cache analysis-1 # 针对特定平台构建 ./scripts/build-local.sh --platform linux/amd64 scanner-1 # 重新生成 bake 文件并构建所有内容 ./scripts/build-local.sh --regenerate --load # 预览命令而不运行它 ./scripts/build-local.sh --dry-run node java ``` ### 其他脚本 ``` # 从 version matrix 生成 bake 文件 ./scripts/generate-bake.sh # 在已构建的镜像上运行 smoke tests ./scripts/smoke-test.sh # Lint Dockerfiles hadolint images/*/Dockerfile ``` ## 版本矩阵 所有工具和栈版本均在 `versions.json` 中定义(唯一事实来源)。要添加或更新版本,请执行: 1. 编辑 `versions.json` 2. 运行 `./scripts/generate-bake.sh`(或在执行 `build-local.sh` 时使用 `--regenerate` 参数) 3. 提交并推送代码;剩下的工作交给 CI 处理 ## 路线图 Brik runtime 目前是在运行时克隆的(由 GitLab 和 Jenkins 适配器以及本地引擎执行),而不是直接预装在镜像中,这使得镜像发布与 Brik 自身的开发解耦。因此,目前你需要使用主机上安装的 CLI 来运行 Brik(参见[本地环境](#local))。一旦 Brik 进入稳定的版本发布节奏,runtime 将会被预装到镜像中,从而实现在无需主机安装的情况下进行零配置使用(`docker run ghcr.io/getbrik/brik-runner-node:22 brik stage build`)以及完全离线的流水线。 ## 许可证 MIT
标签:Docker, LLM防护, 安全防御评估, 容器镜像, 请求拦截