【ディストロレス】

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 配下で提供されているよ。
← 用語集にもどる