【ディストロレス】

Distroless とは?

💡 シェルもパッケージマネージャも捨てた、攻撃者が入れないコンテナ
📌 このページのポイント
Distroless:通常イメージとの比較 通常のコンテナイメージ bash / sh(シェル) apt / yum(パッケージMGR) curl / wget / ls など アプリ+ランタイム 脆弱性の対象が多い Distrolessイメージ シェルなし パッケージMGRなし ユーティリティなし アプリ+ランタイムのみ 攻撃面が最小・CVE激減 マルチステージビルドで本番ステージをDistrolessにするのが定番
通常イメージとDistrolessイメージの構成比較
ひよこ ひよこ

Distrolessって何がDistroless(ディストリビューションなし)なの?

ペンギン先生 ペンギン先生

通常のコンテナイメージUbuntuやDebianなどのLinuxディストリビューションを丸ごと含んでいるよね。Distrolessはそのディストリビューション部分——シェル、パッケージマネージャ(apt/yumなど)、各種ユーティリティ——を全部除いたイメージなんだよ。

ひよこ ひよこ

シェルがないと何かいいことがあるの?

ペンギン先生 ペンギン先生

セキュリティが格段に上がるんだよ。攻撃者がコンテナに侵入してもシェルがないから操作できないし、bashの脆弱性もaptの脆弱性も関係なくなるんだ。CVEの対象になるソフトウェアが激減するから、脆弱性スキャンの結果もずっとクリーンになるよ。

ひよこ ひよこ

でもデバッグするときに困りそうじゃない?

ペンギン先生 ペンギン先生

そうなんだよね。シェルがないのでコンテナに入って `ls` とか `cat` もできないんだ。だからDistrolessは本番環境専用と割り切って使う形が多いよ。開発・テスト用には通常のイメージを使って、本番だけDistrolessにするのが定番パターンだよ。

ひよこ ひよこ

どうやって本番だけDistrolessにするの?

ペンギン先生 ペンギン先生

マルチステージビルドを使うんだよ。最初のステージ(builderステージ)で通常イメージを使ってコンパイルやビルドをして、最後のステージで `FROM gcr.io/distroless/java` などに切り替えてビルド成果物だけコピーするんだ。イメージサイズも劇的に小さくなるよ。

ひよこ ひよこ

どんな言語に対応しているの?

ペンギン先生 ペンギン先生

JavaPythonNode.js・Go・C/C++など主要な言語のランタイムがそれぞれ用意されているよ。Goのように静的バイナリを生成できる言語なら、ランタイムすら必要ない `distroless/static` という最も素の形も使えるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Distroless」って出てきたら「シェルなし・ツールなしの超ミニマルな本番用コンテナベースイメージ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Distroless」 = ディストリビューションなし
💬 distribution(Linuxディストリビューション)+ less(なし)を合わせた造語だよ。GoogleがOSSとして公開しており、gcr.io/distroless 配下で提供されているよ。
← 用語集にもどる