implementing-container-image-minimal-base-with-distroless について
Distroless で最小限のコンテナイメージを構築するための、コンテナ開発者およびセキュリティチーム向け実装ガイドです。マルチステージビルド、イメージの選択、シェルのないコンテナのデバッグ方法を扱います。
主な機能
- 01複数言語向けの Distroless イメージを紹介
- 02マルチステージビルドのパターンを提示
- 03最小イメージのセキュリティ上の影響を説明
- 04シェルなしでのデバッグ方法を解説
- 05イメージスキャンとレイヤー確認を紹介
活用シーン
- 01アプリケーション用の最小ランタイムイメージを構築
- 02コンテナ内の不要なシステムコンポーネントを削減
- 03シェルを使えないコンテナをデバッグ
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill implementing-container-image-minimal-base-with-distrolessインストール後、Claude Code で/implementing-container-image-minimal-base-with-distrolessを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
Distroless を使用したコンテナイメージの最小ベースの実装
概要
Google の distroless イメージには、アプリケーションとそのランタイム依存関係のみが含まれ、パッケージマネージャー、シェル、標準的な Linux ディストリビューションに含まれるその他のプログラムは含まれていません。不要な OS コンポーネントを排除することで、distroless イメージは ubuntu や debian などの従来のベースイメージと比べて、攻撃対象領域を最大 95% 削減できます。Kubernetes 自体、Knative、Tekton などの主要なプロジェクトが、本番環境で distroless イメージを使用しています。2025 年現在、Docker も最小コンテナベースのオープンソースな代替として Hardened Images(DHI)を提供しています。
使用する場面
- 環境で distroless 機能を使用したコンテナイメージの最小ベースを実装、デプロイ、または構成する場合
- コンプライアンス要件に沿ったセキュリティ制御を確立する場合
- この領域のセキュリティアーキテクチャを構築または改善する場合
- この実装を必要とするセキュリティ評価を実施する場合
前提条件
- Docker 20.10+ または互換性のあるコンテナビルドツール(Buildah、Kaniko)
- マルチステージ Dockerfile の知識
- 静的バイナリとしてコンパイルされたアプリケーション、またはランタイムがバンドルされたアプリケーション
- イメージを保存するためのコンテナレジストリ
利用可能な Distroless イメージ
| イメージ | 用途 | サイズ |
|---|---|---|
gcr.io/distroless/static-debian12 | 静的コンパイルされたバイナリ(Go、Rust) | ~2MB |
gcr.io/distroless/base-debian12 | glibc を必要とする動的リンクバイナリ | ~20MB |
gcr.io/distroless/cc-debian12 | libstdc++ を必要とする C/C++ アプリケーション | ~25MB |
gcr.io/distroless/java21-debian12 | Java 21 アプリケーション | ~220MB |
gcr.io/distroless/python3-debian12 | Python 3 アプリケーション | ~50MB |
gcr.io/distroless/nodejs22-debian12 | Node.js 22 アプリケーション | ~130MB |
マルチステージビルドのパターン
Go アプリケーション
# Build stage
FROM golang:1.22-bookworm AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server
# Runtime stage - static distroless
FROM gcr.io/distroless/static-debian12:nonroot
COPY --from=builder /server /server
USER nonroot:nonroot
ENTRYPOINT ["/server"]
Java アプリケーション
# Build stage
FROM maven:3.9-eclipse-temurin-21 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# Runtime stage - Java distroless
FROM gcr.io/distroless/java21-debian12:nonroot
COPY --from=builder /app/target/app.jar /app.jar
USER nonroot:nonroot
ENTRYPOINT ["java", "-jar", "/app.jar"]
Python アプリケーション
# Build stage
FROM python:3.12-bookworm AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --target=/deps -r requirements.txt
COPY . .
# Runtime stage - Python distroless
FROM gcr.io/distroless/python3-debian12:nonroot
WORKDIR /app
COPY --from=builder /deps /deps
COPY --from=builder /app /app
ENV PYTHONPATH=/deps
USER nonroot:nonroot
ENTRYPOINT ["python3", "/app/main.py"]
Node.js アプリケーション
# Build stage
FROM node:22-bookworm AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
# Runtime stage - Node distroless
FROM gcr.io/distroless/nodejs22-debian12:nonroot
WORKDIR /app
COPY --from=builder /app .
USER nonroot:nonroot
CMD ["server.js"]
セキュリティ上の利点
攻撃対象領域の比較
| コンポーネント | Ubuntu | Alpine | Distroless |
|---|---|---|---|
| シェル(bash/sh) | あり | あり | なし |
| パッケージマネージャー | apt | apk | なし |
| coreutils | 完全版 | BusyBox | なし |
| curl/wget | あり | あり | なし |
| ユーザー管理 | あり | あり | なし |
| 既知の CVE(通常) | 50-200+ | 5-20 | 0-5 |
| イメージサイズ(ベース) | ~77MB | ~7MB | ~2-20MB |
セキュリティ上の影響
- シェルなし:攻撃者はコンテナに exec してコマンドを実行できません
- パッケージマネージャーなし:追加のツールやマルウェアをインストールできません
- coreutils なし:偵察に使われる
cat、ls、find、curlがありません - CVE が最小限:パッケージが少ないほど、修正が必要な脆弱性も少なくなります
- デフォルトで非 root:
:nonrootタグを使用すると、UID 65534 で実行されます
Distroless コンテナのデバッグ
distroless にはシェルがないため、デバッグには次の手法を使用してください。
デバッグ用イメージのバリアント
# Use debug variant in non-production environments only
FROM gcr.io/distroless/base-debian12:debug
# Includes busybox shell at /busybox/sh
# Exec into debug variant
kubectl exec -it pod-name -- /busybox/sh
一時的なデバッグコンテナ(Kubernetes 1.25+)
# Attach a debug container with full tooling
kubectl debug -it pod-name --image=busybox:1.36 --target=app-container
イメージ検査用の Crane/Dive
# Inspect image layers without running
crane export gcr.io/distroless/static-debian12 - | tar -tf - | head -50
# Analyze image layers
dive gcr.io/distroless/static-debian12
イメージスキャンの結果
Trivy を使用した一般的な脆弱性の比較:
# Scan Ubuntu-based image
trivy image myapp:ubuntu
# Result: 47 vulnerabilities (3 CRITICAL, 12 HIGH)
# Scan Distroless-based image
trivy image myapp:distroless
# Result: 2 vulnerabilities (0 CRITICAL, 0 HIGH)
参考資料
コメント
Markdown 対応