Minimal: Hình Ảnh Container Bảo Mật
Một bộ sưu tập hình ảnh container sẵn sàng cho sản xuất với CVE tối thiểu, được làm mới hàng ngày bằng cách sử dụng Chainguard’s apko và các gói Wolfi. Bằng cách chỉ bao gồm các gói cần thiết, những hình ảnh này duy trì một bề mặt tấn công giảm và thường không có hoặc gần như không có lỗ hổng.
Hình Ảnh Có Sẵn
| Image | Lệnh Pull | Shell | Sử Dụng |
|---|---|---|---|
| Python | docker pull ghcr.io/rtvkiz/minimal-python:latest | No | Ứng dụng Python, microservices |
| Node.js | docker pull ghcr.io/rtvkiz/minimal-node:latest | Yes | Ứng dụng Node.js, JavaScript |
| Bun | docker pull ghcr.io/rtvkiz/minimal-bun:latest | No | Runtime JavaScript/TypeScript nhanh |
| Go | docker pull ghcr.io/rtvkiz/minimal-go:latest | No | Phát triển Go, CGO builds |
| Nginx | docker pull ghcr.io/rtvkiz/minimal-nginx:latest | No | Proxy ngược, tệp tĩnh |
| HTTPD | docker pull ghcr.io/rtvkiz/minimal-httpd:latest | Maybe* | Máy chủ web Apache |
| Jenkins | docker pull ghcr.io/rtvkiz/minimal-jenkins:latest | Yes | Tự động hóa CI/CD |
| Redis-slim | docker pull ghcr.io/rtvkiz/minimal-redis-slim:latest | No | Kho dữ liệu trong bộ nhớ |
| PostgreSQL-slim | docker pull ghcr.io/rtvkiz/minimal-postgres-slim:latest | No | Cơ sở dữ liệu quan hệ |
*HTTPD, Jenkins, Node.js có thể bao gồm shell (sh, busybox) thông qua phụ thuộc Wolfi chuyển tiếp. CI xử lý sự hiện diện shell như thông tin.
Tại Sao Điều Này Quan Trọng
Các lỗ hổng container là một vector tấn công hàng đầu. Phần lớn các hình ảnh cơ bản có hàng tá CVE chưa được vá:
Traditional images: Your containers:
┌──────────────────┐ ┌──────────────────┐
│ debian:latest │ │ minimal-python │
│ 127 CVEs │ │ 0-5 CVEs │
│ Patched: ~30 days│ │ Patched: <48 hrs │
└──────────────────┘ └──────────────────┘
Tác Động:
- Đạt được các cuộc kiểm toán bảo mật và yêu cầu tuân thủ (SOC2, FedRAMP, PCI-DSS)
- Giảm bề mặt tấn công với các hình ảnh tối giản, không có distro
- Nhận vá CVE trong vòng 24-48 giờ từ khi công bố (so với vài tuần đối với Debian/Ubuntu)
- Hình ảnh được ký mã hóa với SBOM đầy đủ cho bảo mật chuỗi cung ứng
Khởi Đầu Nhanh
# Python - chạy ứng dụng của bạn
docker run --rm -v $(pwd):/app ghcr.io/rtvkiz/minimal-python:latest /app/main.py
# Node.js - chạy ứng dụng của bạn
docker run --rm -v $(pwd):/app -w /app ghcr.io/rtvkiz/minimal-node:latest index.js
# Bun - runtime JavaScript nhanh
docker run --rm ghcr.io/rtvkiz/minimal-bun:latest --version
# Go - build ứng dụng của bạn
docker run --rm -v $(pwd):/app -w /app ghcr.io/rtvkiz/minimal-go:latest build -o /tmp/app .
# Nginx - proxy ngược
docker run -d -p 8080:80 ghcr.io/rtvkiz/minimal-nginx:latest
# HTTPD - phục vụ nội dung tĩnh
docker run -d -p 8080:80 ghcr.io/rtvkiz/minimal-httpd:latest
# Jenkins - CI/CD controller
docker run -d -p 8080:8080 -v jenkins_home:/var/jenkins_home ghcr.io/rtvkiz/minimal-jenkins:latest
# Redis - kho dữ liệu trong bộ nhớ
docker run -d -p 6379:6379 ghcr.io/rtvkiz/minimal-redis-slim:latest
# PostgreSQL - cơ sở dữ liệu quan hệ
docker run -d -p 5432:5432 -v pgdata:/var/lib/postgresql/data ghcr.io/rtvkiz/minimal-postgres-slim:latest
Đặc Điểm Hình Ảnh
| Image | Version | User | Entrypoint | Workdir |
|---|---|---|---|---|
| Python | 3.13.x | nonroot (65532) | /usr/bin/python3 | /app |
| Node.js | 22.x LTS | nonroot (65532) | /usr/bin/dumb-init -- /usr/bin/node | /app |
| Bun | latest | nonroot (65532) | /usr/bin/bun | /app |
| Go | 1.25.x | nonroot (65532) | /usr/bin/go | /app |
| Nginx | mainline | nginx (65532) | /usr/sbin/nginx -g "daemon off;" | / |
| HTTPD | 2.4.x | www-data (65532) | /usr/sbin/httpd -DFOREGROUND | /var/www/localhost/htdocs |
| Jenkins | 2.541.x LTS | jenkins (1000) | tini -- java -jar jenkins.war | /var/jenkins_home |
| Redis | 8.4.x | redis (65532) | /usr/bin/redis-server | / |
| PostgreSQL | 18.x | postgres (70) | /usr/bin/postgres | / |
Hình Ảnh Được Xây Dựng Như Thế Nào
┌─────────────────────────────────────────────────────────────────────┐
│ BUILD PIPELINE │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ Package Source Image Assembly Verification │
│ ────────────── ────────────── ────────────── │
│ │
│ ┌─────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Wolfi │─────────▶│ apko │─────────▶│ Trivy │ │
│ │ (pre-built) │ install │ (OCI image)│ scan │ (CVE gate) │ │
│ │ Python, Go, │ │ │ │ │ │
│ │ Node, etc. │ │ │ │ │ │
│ └─────────────┘ └─────┬──────┘ └─────┬──────┘ │
│ │ │ │
│ ┌─────────────┐ │ ▼ │
│ │ melange │────────────────┘ ┌────────────────┐ │
│ │ (Jenkins, │ build from │ cosign + SBOM │ │
│ │ Redis) │ source │ (sign & publish│ │
│ └─────────────┘ └────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘
Lịch Cập Nhật
| Trigger | Khi nào | Mục đích |
|---|---|---|
| Scheduled | Hàng ngày lúc 2:00 AM UTC | Nhận các bản vá CVE mới nhất từ Wolfi |
| Push | Trên merge vào main | Triển khai các thay đổi cấu hình |
| Manual | Phát hành thủ công | Tái tạo gấp |
Tất cả các bản xây dựng phải vượt qua cổng CVE (không có lỗ hổng ở mức CRITICAL/HIGH) trước khi công bố.
Xây Dựng Tại Chỗ
# Yêu cầu
cài đặt `chainguard.dev/apko@latest`
cài đặt `chainguard.dev/melange@latest` # cần cho Jenkins, Redis
brew cài đặt trivy # hoặc: apt cài đặt trivy
# Xây dựng tất cả hình ảnh
make build
# Xây dựng hình ảnh cụ thể
make python
make node
make bun
make go
make nginx
make httpd
make jenkins
make redis-slim
make postgres-slim
# Quét CVE
make scan
# Chạy thử nghiệm
make test
Cấu Trúc Dự Án
minimal/
├── python/apko/python.yaml # Hình ảnh Python (Wolfi pkg)
├── node/apko/node.yaml # Hình ảnh Node.js (Wolfi pkg)
├── bun/apko/bun.yaml # Hình ảnh Bun (Wolfi pkg)
├── go/apko/go.yaml # Hình ảnh Go (Wolfi pkg)
├── nginx/apko/nginx.yaml # Hình ảnh Nginx (Wolfi pkg)
├── httpd/apko/httpd.yaml # Hình ảnh HTTPD (Wolfi pkg)
├── jenkins/
│ ├── apko/jenkins.yaml # Hình ảnh Jenkins
│ └── melange.yaml # jlink JRE build
├── redis-slim/
│ ├── apko/redis.yaml # Hình ảnh Redis
│ └── melange.yaml # Redis source build
├── postgres-slim/apko/postgres.yaml # Hình ảnh PostgreSQL (Wolfi pkg)
├── .github/workflows/
│ ├── build.yml # CI pipeline hàng ngày
│ ├── update-jenkins.yml # Cập nhật phiên bản Jenkins
│ ├── update-redis.yml # Cập nhật phiên bản Redis
│ └── update-wolfi-packages.yml # Cập nhật gói Wolfi
├── Makefile
└── LICENSE
Tính Năng Bảo Mật
- CVE gate - Xây dựng thất bại nếu phát hiện lỗ hổng CRITICAL/HIGH
- Hình ảnh đã ký - Tất cả hình ảnh được ký với cosign
- Sinh SBOM - Bản kê phần mềm đầy đủ dưới định dạng SPDX
- Người dùng không bảo mật - Tất cả hình ảnh chạy dưới quyền người dùng không bảo mật
- Bề mặt tấn công tối thiểu - Chỉ bao gồm các gói cần thiết
- Hình ảnh không có shell - Đa số hình ảnh không có shell
- Xây dựng tái tạo - Cấu hình apko chuẩn
Xác Minh Chữ Ký Hình Ảnh
Tất cả hình ảnh được ký bằng cosign không có khóa qua Sigstore. Để xác minh:
cosign verify \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-identity-regexp https://github.com/rtvkiz/minimal/ \
ghcr.io/rtvkiz/minimal-python:latest
Thay thế minimal-python bằng tên hình ảnh bất kỳ. Kết quả thành công xác nhận rằng hình ảnh được xây dựng bởi CI của tư liệu này và chưa bị can thiệp.
Giấy Phép
Dự án này được cấp phép theo MIT License - xem tệp LICENSE để biết chi tiết.
Gói Bên Thứ Ba
Hình ảnh container bao gồm các gói từ Wolfi và các nguồn khác, mỗi gói với giấy phép riêng (Apache-2.0, MIT, GPL, LGPL, BSD, v.v.). Thông tin giấy phép đầy đủ được bao gồm trong SBOM của từng hình ảnh:
# Xem giấy phép gói trong một hình ảnh
cosign download sbom ghcr.io/rtvkiz/minimal-python:latest | jq '.packages[].licenseConcluded'