NWarila/ubi9-application-template

GitHub: NWarila/ubi9-application-template

Red Hat UBI 9应用镜像构建和安全加固模板

Stars: 0 | Forks: 0

# Ubi9 应用模板 构建最小 Red Hat UBI 9 运行时镜像的OCI镜像仓库的参考模板。构建阶段是 `ubi-minimal`,运行阶段是 `ubi-micro`,两者都使用 `@sha256` 锁定;运行时根文件系统使用 `dnf --installroot` 组装,以便安装的软件包保持可枚举。它作为一个完全工作的示例提供:一个小型 Go 二进制文件,真实的锁定上游摘要,一个由清单驱动的构建管道,以及所有在CI中端到端运行的运行时加固断言。 模板故意不是针对特定应用的。示例应用故意无用,以便关注供应链形状。 ## 前置条件 合约检查只需要 Python;镜像生命周期需要 Docker: - Python 3.12+ - Bash,用于构建和运行时加固脚本 - Docker Buildx,当构建镜像或重新构建示例二进制文件时 ## 快速入门 运行合约检查(无需 Docker): ``` python tools/verify.py ci ``` 从头到尾构建示例镜像(需要 Docker): ``` make image ``` `make image` 在一个摘要锁定的 `golang` 容器中构建示例 Go 二进制文件,验证生成的 SHA256 与提交的清单相匹配,从清单生成 docker buildx 标志,构建 `linux/amd64` 的 UBI 9 镜像,并对其运行运行时加固断言。 要派生真实的镜像仓库,从 `docs/how-to/derive-image-repo.md` 中的完整派生流程开始。第一次编辑是: 1. `examples/image-manifest.json`,或下游仓库的真实清单路径,包括 `base.builder`、`base.runtime` 和 `dnf.packages`。 2. `containers/Dockerfile`,特别是应用工件阶段。 3. 将 `app/` 替换为真实的应用源或使清单指向一个供应商发布二进制文件。 4. `README.md` 和仓库特定的文档。 5. `docs/decision-records/repo/` 用于本地决策。 6. 将发布、证明和签名真实镜像的发布工作流程。 ## 模板形状 | 路径 | 角色 | | --- | --- | | [`contracts/image-manifest.schema.json`](contracts/image-manifest.schema.json) | 可供人类审查的镜像清单模式。 | | [`examples/image-manifest.json`](examples/image-manifest.json) | 具有真实锁定上游值的实际清单。 | | [`app/`](app/) | 模板构建和提供的示例无用 Go 应用程序。 | | [`containers/Dockerfile`](containers/Dockerfile) | 多阶段 UBI 9 模式:摘要锁定的 `ubi-minimal` 构建器运行 `dnf --installroot` 以组装运行时根文件系统(保留 rpm 数据库),然后 `FROM ubi-micro` 将根文件系统和经过验证的应用程序二进制文件复制进来。 | | [`.dockerignore`](.dockerignore) | 默认情况下仅允许审查的应用程序工件的基础构建上下文基线。 | | [`tests/runtime-hardening.sh`](tests/runtime-hardening.sh) | 无 shell、无 dnf/microdnf/rpm/yum、无 curl 或 wget 的运行时断言脚本。 | | [`tools/verify.py`](tools/verify.py) | 本地和 CI 合约检查。 | | [`tools/generate_build_args.py`](tools/generate_build_args.py) | 从审查的清单生成 docker buildx 标志。 | | [`tools/build_app.sh`](tools/build_app.sh) | 确定性重新构建示例应用程序二进制文件。 | | [`tools/build_image.sh`](tools/build_image.sh) | 从清单和渲染的构建参数构建镜像。 | | [`tools/verify_app_shas.py`](tools/verify_app_shas.py) | 验证构建的二进制文件的 SHA256 是否与清单的 SHA256 值匹配。 | | [`docs/`](docs/) | Diataxis 文档以及派生、发布、治理和 org/template/repo ADR 范围。 | | [`.github/workflows/`](.github/workflows/) | `ci.yaml` 运行合约检查并调用图像构建可重用组件;`codeql.yaml`、`scorecard.yaml`、`security.yaml` 和 `repo-hygiene.yaml` 调用 `NWarila/.github` 中的规范可重用工作流程,用于 CodeQL、OpenSSF Scorecard、Trivy + Gitleaks + zizmor 和 org 仓库卫生。 | | [`.github/workflows/reusable-ubi-image-build.yaml`](.github/workflows/reusable-ubi-image-build.yaml) | 模板特定的可重用组件:构建应用程序二进制文件 -> 验证 SHA256 -> 构建 UBI 9 镜像 -> 运行运行时加固。下游仓库调用它(`uses: NWarila/ubi9-application-template/.github/workflows/reusable-ubi-image-build.yaml@`)而不是复制管道。 ## 这是什么,以及它不是什么 | | This repo | A downstream image repo | | --- | --- | --- | | 定义 UBI 9 镜像合约 | 是 | 是 | | 从头到尾构建工作镜像 | 是,一个故意无用的示例 | 是,真实的应用 | | 锁定基础镜像和 dnf 输入 | 示例的真实锁定 | 应用的真实锁定 | | 发布 SBOM、来源、签名和证明 | 记录所需的路径和发布工作流程形状 | 实现完整的发布路径 | | 包含 Vault 特定逻辑 | 否 | 只有当下游镜像为 Vault 时 | 模板不提供共享可变的基础镜像。派生仓库直接从摘要锁定的 `ubi-minimal` 构建器通过 `dnf --installroot` 构建自己的根文件系统,以便审查可以追踪基础镜像、安装的 `dnf.packages`、应用程序工件和运行时策略。 ## 标准化仓库接口 | 命令 | 目的 | | --- | --- | | `make verify` | 运行本地 CI 相似的合约检查。 | | `make build-args` | 从清单生成 docker buildx 标志。 | | `make app-build` | 确定性重新构建示例 Go 二进制文件。 | | `make app-verify` | 检查构建的二进制文件的 SHA256 是否与清单匹配。 | | `make image-build` | 构建 `linux/amd64` 的 OCI 镜像。 | | `make image-test` | 对构建的镜像运行运行时加固断言。 | | `make image` | 运行完整的 app -> image -> hardening 管道。 | ## 构建证据期望 下游镜像仓库应通过摘要发布镜像并附加: - 使用 `--provenance=mode=max` 的 BuildKit 来源。 - 使用 `--sbom=true` 的 BuildKit SBOM 证明。由于运行时镜像在 `/var/lib/rpm` 保留了 rpm 数据库,因此 SBOM 和下游扫描器枚举每个安装的软件包而不是报告空镜像。 - GitHub 艺术品证明对于推送的镜像摘要。BuildKit 携带 SBOM 证明。 - 使用 `--recursive` 签名以覆盖附加的 SBOM 和证明清单的 Cosign/Sigstore 无密钥签名。 - 构建镜像的合规性和扫描网关:OpenSCAP 对 RHEL 9 STIG 配置文件,以及 Trivy 和 Grype 漏洞扫描。 - 从 `tests/runtime-hardening.sh` 的运行时加固证据。 模板的 CI 在本地加载示例镜像进行运行时测试,并明确禁用本地来源,以便测试路径不会与发布证据混淆。BuildKit SBOM、BuildKit 来源、签名和 GitHub 艺术品证明是下游发布关注点,一旦选择了真实的注册表目标。详细的期望在 `docs/reference/supply-chain-evidence.md` 中,而 `docs/how-to/publish-image.md` 携带一个发布工作流程框架,该框架围绕现有的清单驱动管道,将构建 + 推送、Cosign 无密钥签名、GitHub 艺术品证明上传和针对推送摘要的运行时加固连接起来。 ## 许可证 MIT - 查看 [LICENSE](LICENSE).
标签:Buildx, Docker, GitHub Advanced Security, Go语言, NVR-pinning, OpenSCAP, Python, Red Hat, RHEL9, SBOM, Sigstore, STIG, UBI, 安全加固, 安全防御评估, 容器镜像, 应用安全, 应用模板, 文档, 无后门, 日志审计, 最小化镜像, 构建脚本, 硬件无关, 程序破解, 自动化构建, 请求拦截, 软件包管理, 软件开发生命周期, 逆向工具, 镜像仓库, 镜像构建