Contents
1️⃣ サプライチェーン攻撃の現状と注意点
| 項目 | 内容 | 出典・備考 |
|---|---|---|
| 攻撃件数(概算) | 2024 年に報告された Dockerfile 改ざん事例は 300 件以上 とされるが、公式レポートは未公開。※出典不明 | ⚠️ 具体的な数字はベンダーレポート等で再確認要 |
| 代表的攻撃例 | KubePod(2025 年)――公式イメージに偽装レイヤーを挿入し、数千件の内部ネットワーク侵害が発生。※出典不明 | ⚠️ 実証データが乏しいため、類似事例として SolarWinds 系サプライチェーン攻撃を参照 |
| 主要リスク | • CI/CD の自動化に伴う検知遅延 • 未署名イメージの流入 • SBOM の未管理 |
- |
要点
- 全工程で可視化:イメージ取得・ビルド・デプロイすべてに 署名 と SBOM を必須とする。
- 継続的検証:リポジトリ、レジストリ、ランタイムそれぞれで自動スキャンを走らせ、結果は SIEM へ集約。
2️⃣ ゼロトラスト実現のためのイメージ署名・SBOM
2.1 必要な仕組み
| フェーズ | 実装例 | 推奨ツール(代替含む) |
|---|---|---|
| 署名 | cosign sign <image> → cosign verify |
Cosign (Sigstore)、代替:Notary v2、Docker Content Trust |
| SBOM 生成 | syft <image> -o spdx-json > sbom.json |
Syft, 代替:CycloneDX‑BOM, Anchore Engine |
| ポリシー評価 | OPA Gatekeeper に SBOM をインプット | OPA, 代替:Kyverno、Conftest |
ポイント:ツールはベンダーロックインしない形で選定し、同等機能を持つオープンソース/商用の 2 つ以上 を比較できるようにしておく。
2.2 ツール比較表
| 項目 | Cosign | Notary v2 | Docker Content Trust |
|---|---|---|---|
| 署名方式 | キー/証明書ベース(OIDC 対応) | TUF(The Update Framework) | Notary v1 のレガシー実装 |
| CI/CD 統合 | GitHub OIDC、GitLab CI で標準サポート | 手動設定が必要 | 環境変数 DOCKER_CONTENT_TRUST=1 だけで可 |
| マルチプラットフォーム | ✅(Linux, macOS, Windows) | ❌(限定的) | ✅(Docker CLI に組込) |
| コミュニティ活性度 | 高(Sigstore プロジェクト) | 低 | 中 |
3️⃣ ビルドフェーズのベストプラクティス
3.1 公式ベースイメージの署名検証
|
1 2 3 4 5 6 |
export DOCKER_CONTENT_TRUST=1 # Docker Hub の Notary v2 署名を有効化 docker pull alpine:3.19 # 署名が無い場合はエラーで停止 # 自社レジストリにプッシュ後、Cosign 二重署名を実施 cosign verify --key cosign.pub myregistry.example.com/app:latest |
代替案:Harbor の「Content Trust」機能や AWS ECR の「image scanning + signature」でも同等の検証が可能。
3.2 マルチステージ Dockerfile(最小化と自動更新)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# ---------- Build stage ---------- FROM golang:1.22-alpine AS builder WORKDIR /src COPY . . RUN go mod tidy && \ CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o app # ---------- Runtime stage ---------- FROM alpine:3.19 ARG USERNAME=appuser UID=10001 RUN addgroup -g ${UID} ${USERNAME} && \ adduser -S -u ${UID} -G ${USERNAME} ${USERNAME} USER ${USERNAME} COPY --from=builder /src/app /usr/local/bin/ COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ # 可能ならビルド時に `apk upgrade` を走らせ、ランタイムは最小だけ持ち込む ENTRYPOINT ["app"] |
| メリット | 説明 |
|---|---|
| サイズ削減 | ビルドツール・キャッシュ層を除外 → イメージが 30 % 程度軽くなる |
| 脆弱性低減 | ランタイムに必要最小限のパッケージだけを残す |
| 自動更新 | apk upgrade はビルドステージで実行し、常に最新のベースを取得 |
代替ツール:Bazel や BuildKit のキャッシュ最適化機能も併用すると、再現性がさらに向上する。
4️⃣ CI/CD パイプラインへの自動組み込み
4.1 GitHub Actions(主要フロー)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
name: Secure CI on: push: branches: [main] jobs: security-gate: runs-on: ubuntu-latest permissions: contents: read packages: write id-token: write # Cosign 用 OIDC steps: - uses: actions/checkout@v4 - name: Build image run: | docker build -t ghcr.io/${{ github.repository }}:${{ github.sha }} . - name: Scan with Trivy uses: aquasecurity/trivy-action@0.9 with: image-ref: ghcr.io/${{ github.repository }}:${{ github.sha }} severity: HIGH,CRITICAL exit-code: '1' - name: Sign image (Cosign) env: COSIGN_EXPERIMENTAL: "1" run: | cosign sign --yes ghcr.io/${{ github.repository }}:${{ github.sha }} - name: Generate SBOM (Syft) run: | syft ghcr.io/${{ github.repository }}:${{ github.sha }} -o spdx-json > sbom.json - name: Policy check (OPA) uses: openpolicyagent/opa-action@v2 with: query: data.security.deny input: sbom.json |
4.2 GitLab CI(同等フロー)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
stages: - build - scan - sign - policy variables: IMAGE_TAG: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA" build: stage: build script: - docker build -t $IMAGE_TAG . - docker push $IMAGE_TAG scan: stage: scan image: aquasec/trivy:latest script: - trivy image --severity HIGH,CRITICAL $IMAGE_TAG || exit 1 sign: stage: sign image: ghcr.io/sigstore/cosign:v2.2.0 script: - cosign sign --key $COSIGN_PRIVATE_KEY $IMAGE_TAG policy: stage: policy image: openpolicyagent/opa:latest script: - syft $IMAGE_TAG -o spdx-json > sbom.json - opa eval -i sbom.json -d policies/sbom.rego "data.security.deny" |
4.3 ツール比較(CI/CD 向け)
| カテゴリ | 主なツール | 代替例 | 特徴 |
|---|---|---|---|
| 脆弱性スキャン | Trivy (Aqua) | Anchore, Snyk | DB 更新が高速、CLI が軽量 |
| イメージ署名 | Cosign | Notary v2, Docker Content Trust | OIDC 連携で鍵管理不要 |
| SBOM生成 | Syft | CycloneDX‑BOM, SPDX‑Toolkit | 多形式出力に強い |
| ポリシーエンジン | OPA Gatekeeper | Kyverno, Conftest | Rego 言語は汎用性高し |
5️⃣ ランタイム防御と運用ベストプラクティス
5️⃣1 最小特権・Rootless の実装
|
1 2 3 4 5 6 7 |
# /etc/docker/daemon.json { "userns-remap": "default", "experimental": true, "features": { "buildkit": true } } |
- Rootless:Docker デーモン自体を非特権ユーザーで起動。
- User Namespace:
--user <uid>:<gid>を必ず指定し、ホスト root 権限から隔離。
代替策:Podman はデフォルトで Rootless。Kubernetes 環境では CRI‑O も同様の設定が可能。
5️⃣2 seccomp / AppArmor カスタマイズ
|
1 2 3 4 5 6 7 8 9 10 11 |
// custom-seccomp.json { "defaultAction": "SCMP_ACT_ERRNO", "syscalls": [ { "name": "read", "action": "SCMP_ACT_ALLOW" }, { "name": "write", "action": "SCMP_ACT_ALLOW" }, { "name": "exit", "action": "SCMP_ACT_ALLOW" }, { "name": "execve", "action": "SCMP_ACT_ERRNO" } ] } |
|
1 2 |
docker run --security-opt seccomp=custom-seccomp.json myimage |
| 項目 | 推奨設定 |
|---|---|
| seccomp | デフォルトは広範囲。アプリ固有に絞り、execve など危険系システムコールをブロック |
| AppArmor | プロファイルで capability net_bind_service のみ許可し、機密ファイルへのアクセスは deny |
| Capabilities | --cap-drop ALL → 必要最小限だけ --cap-add |
代替ツール:Falco(eBPF ベースのランタイム監視)や Sysdig Secure の代わりに、オープンソース版 sysdig でも同等の可視化が可能。
5️⃣3 eBPF を活用した行動監視
|
1 2 3 4 5 6 7 8 9 |
# Ubuntu 向け sysdig-agent(eBPF モード)インストール例 curl -sSL https://download.sysdig.com/stable/deb/sysdig-apt.key | sudo apt-key add - echo "deb https://download.sysdig.com/stable/deb stable-$(lsb_release -cs) main" \ | sudo tee /etc/apt/sources.list.d/draios.list sudo apt-get update && sudo apt-get install -y sysdig-agent # eBPF モードで起動 sudo sysdig-agent start --ebpf |
| 機能 | 内容 |
|---|---|
| システムコールレベルの可視化 | コンテナ単位で実行された open, execve などをリアルタイムに取得 |
| 異常検知 | プロファイルと乖離した振る舞いを自動アラート(Slack/メール) |
| 軽量性 | カーネルモジュール不要、アップデートが容易 |
代替案:Tracee(Aqua の eBPF ツール)や Cilium Hubble でも類似のトレースが可能。
6️⃣ シークレット管理と安全な注入
| 方法 | 手順概要 | メリット・デメリット |
|---|---|---|
| Docker Secrets + Vault | 1. Vault にシークレット格納 2. docker secret create で Docker Swarm にインポート3. コンテナ起動時にファイルマウント |
✅ 暗号化転送、✅ ファイルベース注入。 ⚠️ Swarm 限定 |
| AWS Secrets Manager + ECS | aws secretsmanager get-secret-value → /run/secrets/… に書き出し |
✅ IAM で細粒度制御、✅ ローテーション自動化 ⚠️ コストがかかる |
| GCP Secret Manager + GKE | CSI ドライバーで Pod にマウント | ✅ Kubernetes ネイティブ、✅ ポリシー管理が容易 ⚠️ GCP 依存 |
| Kubernetes External Secrets(OSS) | 任意のクラウドシークレットを K8s Secret に同期 | ✅ ベンダーロックフリー、✅ GitOps と相性良好 ⚠️ 別途デプロイが必要 |
ベストプラクティス:
1. 永遠に平文で保持しない(環境変数は避ける)。
2. 最小権限の IAM / RBAC を設定し、シークレット取得を限定。
3. ローテーション:30 日以上の周期で自動更新し、古いトークンは即削除。
7️⃣ ネットワーク分離・リソース制御・ホスト保守
7.1 マイクロセグメンテーション(CNI)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# Calico NetworkPolicy の例:フロントエンドから DB へのみ許可 apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: allow-frontend-to-db spec: selector: all() types: - Ingress - Egress egress: - action: Allow destination: nets: - 10.0.1.0/24 # DB サブネット ingress: - action: Allow source: selector: role == 'frontend' |
- 代替 CNI:Cilium(BPF ベース)や Weave Net でも同様にポリシーが定義可能。
7.2 cgroup v2 によるリソース制限
|
1 2 3 4 5 6 7 |
docker run \ --cpus="1.5" \ --memory="512m" \ --pids-limit=100 \ --device-write-bps="/dev/sda:10mb" \ myimage:latest |
- 設定手順:
/etc/default/grubにsystemd.unified_cgroup_hierarchy=1を追加し、GRUB 更新後に再起動。
7.3 ホストの自動パッチ適用
Docker Engine の自動アップデート(Ubuntu/Debian)
|
1 2 3 4 5 6 7 8 9 10 |
sudo apt-get install -y unattended-upgrades sudo dpkg-reconfigure --priority=low unattended-upgrades cat <<EOF | sudo tee /etc/apt/apt.conf.d/99docker-upgrade Unattended-Upgrade::Allowed-Origins { "\${distro_id}:\${distro_codename}"; "Docker:${distro_codename}"; }; EOF |
カーネル Live Patch(Canonical Livepatch の例)
|
1 2 3 |
sudo snap install canonical-livepatch sudo canonical-livepatch enable <your-token> |
注意:本番環境では ステージングでの事前検証 を必ず実施し、互換性問題が起きた場合はロールバック手順を用意しておくこと。
8️⃣ まとめと「Docker コンテナセキュリティ2026チェックリスト」
| 項目 | 実装要件 | 推奨ツール / 手段 |
|---|---|---|
| サプライチェーンゼロトラスト | イメージ署名+SBOM+ポリシー評価 | Cosign、Syft、OPA/Gatekeeper |
| ビルド時の安全性 | 公式イメージは必ず検証、マルチステージで最小化 | Notary / Cosign、Dockerfile のベストプラクティス |
| CI/CD 自動化 | Trivy → Cosign → OPA(または Kyverno) | GitHub Actions / GitLab CI、代替: Jenkins + plugins |
| ランタイム防御 | Rootless+UserNS、カスタム seccomp/AppArmor、Capabilities 最小化、eBPF 監視 | Podman、Falco、sysdig‑agent |
| シークレット管理 | 外部シークレットストアと Docker/K8s Secrets の組み合わせ | Vault、AWS/GCP Secret Manager、External Secrets |
| ネットワーク・リソース制御 | CNI ポリシーでマイクロセグメンテーション、cgroup v2 でリソース上限設定 | Calico / Cilium、systemd‑unified cgroup |
| ホスト保守 | Docker Engine とカーネルの自動パッチ適用、Live Patch | unattended-upgrades、canonical-livepatch |
最終的な行動指針
1. インフラ全体を「署名・検証・可視化」のサイクルで囲む。
2. ツールはベンダーロックインしない形で 2 つ以上用意し、定期的に比較評価する。
3. CI の失敗はデプロイの阻止とみなし、手動承認フローを設けない(自動化が安全性の鍵)。
これらを踏まえて、組織固有の「Docker コンテナセキュリティ2026チェックリスト」を作成し、毎四半期ごとのレビューとアップデートを実施すれば、サプライチェーンからランタイムまで一貫したゼロトラスト防御が達成できます。