🎓 レベル:標準 | 重要度:B(推奨) 📎 前提:クラウドの責任共有とIAM
要点(BLUF)
- コンテナは軽量で速いが、ホスト OS のカーネルを共有するため、仮想マシンより分離が弱い。前提に置いて守る。
- 守りはビルド時と実行時の両方。最小イメージ・脆弱性スキャン・信頼できる元イメージ(ビルド)と、非 root・権限制限・読み取り専用(実行)。
- イメージは「不変の成果物」。脆弱性が出たら作り直して入れ替える(パッチ当てでなく置換)。
概念:軽量さの裏にある分離の弱さ
コンテナは OS の機能(名前空間・cgroups)でプロセスを隔離します。仮想マシンが OS ごと分けるのに対し、コンテナは1つのカーネルを共有します。起動が速く密度が高い反面、カーネルの脆弱性を突かれるとホストや他コンテナへ影響が及びうる――この分離の弱さが前提です。だから「コンテナだから安全」ではなく、層を重ねて守ります。
仕組み:守るべき2つの時点
ビルド時(イメージを作るとき)
- 最小イメージ:不要なパッケージ・シェル・ツールを含めない(distroless や slim 系)。攻撃面(脅威モデリング(STRIDEと攻撃面))が小さくなり、脆弱性の母数も減る。
- 信頼できる元イメージ:素性の確かな公式・検証済みイメージから作る。出所不明の利用を避ける。
- 脆弱性スキャン:イメージに含まれる OS パッケージ・ライブラリの既知脆弱性をスキャン(SCA=セキュアコーディングとレビュー)。
- シークレットを焼き込まない:鍵・資格情報をイメージ層に入れない(シークレット管理)。履歴層に残る。
実行時(コンテナを動かすとき)
- 非 root で動かす:コンテナ内 root はホストの権限に近づきうる。一般ユーザーで実行。
- 権限を絞る:特権コンテナを避け、不要な Linux capabilities を落とす。ファイルシステムは読み取り専用を既定に。
- リソース制限:CPU/メモリ上限で、暴走や DoS の影響を抑える(可用性)。
- ネットワーク分離:コンテナ間通信を最小に(セグメンテーション=ファイアウォールとセグメンテーション と同じ発想)。
flowchart LR
BASE["信頼できる最小ベースイメージ"] --> BUILD["ビルド:依存を最小化"]
BUILD --> SCAN{"脆弱性スキャン・シークレット検出"}
SCAN -->|"合格"| REG["レジストリ(署名つき)"]
SCAN -->|"不合格"| FIX["作り直し(パッチでなく置換)"]
REG --> RUN["実行:非root・権限制限・読み取り専用"]
仕組み:イメージは不変の成果物
コンテナイメージはビルドした時点で中身が固定される不変物です。脆弱性が見つかったとき、動いているコンテナにパッチを当てるのではなく、修正したイメージを作り直してデプロイで入れ替えるのが正しい運用です(イミュータブルインフラ)。これにより「どのバージョンに何が入っているか」が常に明確になり、来歴(サプライチェーンセキュリティ)も追えます。
防御側の使い方/設定
- 最小・公式ベース+固定タグ:素性の確かなイメージを、再現可能なよう固定(ダイジェスト指定)。
- CI でスキャンをゲート化:脆弱性・シークレットの検出で不合格はデプロイ不可(セキュアコーディングとレビュー)。
- 非 root・最小権限で実行:特権を与えない。capabilities を絞り、読み取り専用 FS。
- イメージ署名と検証:信頼できるイメージだけを実行(署名=デジタル署名と証明書(PKI))。
- 作り直して置換:脆弱性対応はパッチでなくイメージ更新で。古いイメージを残さない。
なぜ安全か:母数を減らし、被害を閉じ込める
コンテナの守りが効くのは2方向です。(1) 最小イメージと信頼できる元イメージで、そもそも含まれる脆弱性とツールを減らす(攻撃面と母数の削減)。(2) 非 root・権限制限・分離で、万一侵害されてもコンテナの外へ広がりにくくする(封じ込め)。分離が弱い前提を、最小化と権限制限という別原理で補うのが多層防御の形です。
仕組みの直観
コンテナは集合住宅の一室で、壁(カーネル)を全戸で共有しています。だから壁に穴(カーネル脆弱性)があると隣に響く。守りは「部屋に余計な物を置かない(最小イメージ)」「合鍵を部屋に隠さない(シークレットを焼き込まない)」「住人に管理人権限を与えない(非 root)」「各戸の電気・水道に上限を付ける(リソース制限)」。改装はその場の継ぎ接ぎ(パッチ)でなく、きれいな部屋に引っ越す(イメージ置換)方式です。
⚠️ よくある誤解・設定ミス
- 「コンテナ=VM 並みに分離」と思う:カーネル共有で分離は弱い。権限制限で補う。
- 巨大イメージ・余計なツール同梱:攻撃面と脆弱性の母数が増える。最小化する。
- root・特権コンテナで実行:侵害時の影響が大きい。非 root・capabilities 最小化。
- イメージにシークレットを焼き込む:層に残り漏れる。外部のシークレット管理へ(シークレット管理)。
- 古いイメージを使い続ける/出所不明を使う:既知脆弱性や汚染の混入。スキャン+署名検証+作り直し。
対応 lab
コンテナランタイム実環境が前提のため lab は置きません。イメージ署名の検証原理は security-study/labs/digital_signature_demo.py が対応します。
関連
- 取得権限・責任範囲 → クラウドの責任共有とIAM
- イメージにシークレットを入れない → シークレット管理
- 依存・ビルドの汚染対策 → サプライチェーンセキュリティ