mcpField
I
implementing-container-image-minimal-base-with-distroless

implementing-container-image-minimal-base-with-distroless

github.com/mukul975セキュリティ35.2k72 回インストール8 週間前に更新
リポジトリ

implementing-container-image-minimal-base-with-distroless について

Distroless で最小限のコンテナイメージを構築するための、コンテナ開発者およびセキュリティチーム向け実装ガイドです。マルチステージビルド、イメージの選択、シェルのないコンテナのデバッグ方法を扱います。

主な機能

  1. 01複数言語向けの Distroless イメージを紹介
  2. 02マルチステージビルドのパターンを提示
  3. 03最小イメージのセキュリティ上の影響を説明
  4. 04シェルなしでのデバッグ方法を解説
  5. 05イメージスキャンとレイヤー確認を紹介

活用シーン

  1. 01アプリケーション用の最小ランタイムイメージを構築
  2. 02コンテナ内の不要なシステムコンポーネントを削減
  3. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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-debian12glibc を必要とする動的リンクバイナリ~20MB
gcr.io/distroless/cc-debian12libstdc++ を必要とする C/C++ アプリケーション~25MB
gcr.io/distroless/java21-debian12Java 21 アプリケーション~220MB
gcr.io/distroless/python3-debian12Python 3 アプリケーション~50MB
gcr.io/distroless/nodejs22-debian12Node.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"]

セキュリティ上の利点

攻撃対象領域の比較
コンポーネントUbuntuAlpineDistroless
シェル(bash/sh)ありありなし
パッケージマネージャーaptapkなし
coreutils完全版BusyBoxなし
curl/wgetありありなし
ユーザー管理ありありなし
既知の CVE(通常)50-200+5-200-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)

参考資料

コメント