コンテナセキュリティはもはや選択肢ではなく必須の要件です。サプライチェーン攻撃が増加する中、コンテナイメージをビルドからランタイムまで保護することは、コンテナ化されたワークロードを運用するすべての組織にとって基本事項です。ランタイムセキュリティだけでは不十分であり、サプライチェーンセキュリティはイメージのビルド段階から始める必要があります。
コンテナサプライチェーンの脅威
コンテナサプライチェーンの攻撃経路には、侵害されたベースイメージ、脆弱な依存関係、漏洩したシークレット、悪意のあるパッケージが含まれます。Codecov侵害による認証情報流出、Dependency confusion攻撃、公開イメージに埋め込まれたクリプトマイナーなどの実際のインシデントがその深刻さを物語っています。共有責任モデルの下で、Dockerなどのプラットフォームが基本インフラを提供する一方、ビルドしたイメージのセキュリティは自己責任となります。
イメージ脆弱性スキャンツール
コンテナイメージのスキャンには複数のツールが利用可能です。Trivyはオープンソースで高速かつ包括的であり、OSパッケージとnpm、pip、gem、Goといった言語別依存関係の両方をスキャンします。Snykは開発者向けCLIとPRチェック、修正提案を備えた商用スキャナーです。GrypeはSyftと統合してSBOMを生成し、Docker ScoutはDocker DesktopとDocker Hubに直接組み込まれています。
| ツール | 種別 | 主な強み |
|---|---|---|
| Trivy | オープンソース | 高速性と広範なカバレッジ |
| Snyk | 商用 | 修正提案とPR統合 |
| Grype | オープンソース | SyftによるSBOM統合 |
| Docker Scout | 内蔵 | Docker Desktopとのシームレス連携 |
セキュリティのためのDockerfileベストプラクティス
最小ベースイメージはセキュアなコンテナの基盤です。フルOSイメージよりもAlpine、Distroless、Scratchを優先します。マルチステージビルドによりビルド依存関係とランタイムアーティファクトを分離し、アプリケーションの実行に必要なものだけを含む最終イメージを生成します。
FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o app .
FROM alpine:3.20
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --from=builder /app/app /app/app
USER appuser
ENTRYPOINT ["/app/app"]
latestタグの使用は避け、再現性のために特定のダイジェストに固定します。非rootユーザーでコンテナを実行し、不要なLinuxケーパビリティを削除し、ルートファイルシステムを読み取り専用でマウントしてtmpfsを書き込み可能ディレクトリに使用します。
コンテナ内のシークレット管理
シークレットをイメージに焼き付けてはいけません。DockerfileでENVやCOPYを使って認証情報を埋め込むことを避け、代わりにDocker BuildKitの–secretフラグをビルド時のシークレットに使用します。ランタイムシークレットにはDocker SecretsやKubernetes Secrets、HashiCorp VaultやAWS Secrets Managerなどの外部ストアを利用します。
# ビルド時シークレット(イメージレイヤーに残らない)
DOCKER_BUILDKIT=1 docker build \
--secret id=mysecret,src=./secret.txt \
-t myapp:latest .
適切に設定された.dockerignoreファイルにより、.envファイルやSSH鍵、その他の認証情報がビルドコンテキストに誤って含まれるのを防ぎます。
Cosignによるイメージ署名
イメージ署名は、信頼できるソースによってイメージが生成されたことを暗号学的に検証します。SigstoreプロジェクトのCosignは、GitHub、Google、MicrosoftなどのOIDCプロバイダを使用した鍵なし署名をサポートしています。Fulcio認証局を通じて一時鍵を生成し、Rekor透過ログに署名を記録します。
# 鍵なし署名
cosign sign ghcr.io/myorg/myapp:latest
cosign verify ghcr.io/myorg/myapp:latest
in-totoメタデータを使用したイメージアテステーションによりSLSA準拠が可能になり、KyvernoやConnaisseurなどのポリシー強制ツールでKubernetesクラスタにデプロイする前に署名検証を要求できます。
ランタイムセキュリティ
ランタイムセキュリティ層は実行中のコンテナを保護します。Seccompプロファイルはコンテナが利用可能なシステムコールを制限し、AppArmorやSELinuxは必須アクセス制御を適用し、読み取り専用ファイルシステムはランタイム時の変更を防止します。メモリとCPUのリソース制限はDoSリスクを軽減し、RootlessモードはDockerデーモンをroot権限なしで実行します。高度な脅威検出には、CNCFのFalcoがコンテナの異常な動作を監視します。
CI/CD統合
セキュリティスキャンはパイプラインのすべての段階で統合する必要があります。開発端末でのtrivy fs、PRでのアクション実行、ビルド時、レジストリ、デプロイ前の各段階でスキャンを実施します。ポリシーアズコードにより脆弱性の重要度しきい値を定義し、ビルドのパスまたは失敗を判断します。
name: Container Security Scan
on: [pull_request]
jobs:
trivy-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
scan-type: fs
severity: CRITICAL,HIGH
exit-code: 1
SyftによるSBOM生成でSPDXまたはCycloneDX形式の部品表を作成し、監査可能性とベンダー準拠のためにリリースに添付します。
最小ベースイメージ比較
| イメージ | サイズ | シェル | パッケージマネージャ | 最適な用途 |
|---|---|---|---|---|
| Alpine | 5 MB | あり | apk | 汎用 |
| Distroless | 12-20 MB | なし | なし | 本番アプリ |
| Chainguard | 15-25 MB | なし | apk(最小限) | セキュリティ重視 |
| Scratch | 0 MB | なし | なし | 静的リンクバイナリ |
継続的監視とコンプライアンス
レジストリスキャンはDocker Hub、ECR、GCR、Harbor内のイメージを継続的に監視し、新しいCVEを検出します。脆弱性データベースの鮮度は重要であり、Trivyはデータベースを毎時更新しています。Exploit Prediction Scoring Systemを活用したCVEトリアージにより、悪用可能な脆弱性と理論上の脆弱性を区別します。CIS Docker Benchmark、NIST SP 800-190、SOC 2などのコンプライアンスフレームワークが構造化されたガイドラインを提供し、DependabotやRenovateがパッチ適用済みベースイメージのPRを自動作成します。
結論
多層的なコンテナセキュリティ戦略は、ビルド時スキャン、ランタイム監視、ポリシー強制を組み合わせます。CI/CDでのTrivy導入から始め、マルチステージビルドによる最小ベースイメージを採用し、本番レジストリにはCosignによるイメージ署名を実装し、脆弱性データベースを継続的に監視してください。セキュリティはコンテナライフサイクルの最終工程ではなく、開発とデプロイのすべてのフェーズに統合される継続的なプラクティスです。
