distroless 鏡像介紹及 基於cbl-mariner的.NET distroless 鏡像的容器

1、概述

容器改變了我們看待技術基礎設施的方式。這是我們運行應用程式方式的一次巨大飛躍。容器編排和雲服務一起為我們提供了一種近乎無限規模的無縫擴展能力。

根據定義,容器應該包含 應用程式 及其 運行時依賴項。然而,在現實中,它們包含的遠不止這些。標準容器基礎鏡像包含標準 Linux 發行版中可以找到的包管理器、shell 和其他程式。

雖然這些都是構建容器鏡像所必需的,但它們不應該成為最終鏡像的一部分。例如,一旦你把包安裝好了,就不再需要在容器中使用 apt 等包管理工具了。

這不僅使你的容器里充滿了不必要的軟體包和程式,而且還為網路罪犯提供了攻擊特定程式漏洞的機會。

你應該始終了解容器運行時中存在什麼,並且應該精確地限制其只包含應用程式所需的依賴項。

除了那些必要的,你不應該安裝任何東西。一些領先的科技巨頭,如Google、微軟,有多年在生產中運行容器的經驗,已經採用了這種方法。

Google和微軟現在通過提供 Distroless 鏡像向客戶開放這種能力。Google和微軟構建的這些鏡像的目標是只包含你的應用程式及其依賴項,同時它們將沒有常規 Linux 發行版的所有特性,包括 shell

這意味著雖然可以像以前一樣運行應用程式的容器,但不能在容器運行的時候進入容器內。這是一個重大的安全改進,因為你現在已經為黑客通過 shell 進入你的容器關上了大門。

2、Microsoft CBL-Mariner

Microsoft CBL-Mariner 是一個免費的開源 Linux 發行版,適用於 Microsoft 的雲基礎設施和邊緣產品和服務。該發行版的主要目標是在 Microsoft Azure 雲平台上提供 Azure Kubernetes 服務。

此外,CBL-Mainer 在 Azure IoT Edge 中用於在 Windows IoT 上執行 Linux 工作負載,並在後端分發中用於託管 WSLg 的 Weston 合成器。

微軟最近剛發布了CBL-Mariner 2.0 , CBL-Mariner 2.0 僅包含基本組件,專為低記憶體和磁碟空間使用以及快速下載速度而訂製。在底層,CBL-Mariner 使用最新的 Microsoft LSG 5.15 內核。最重要的是,該發行版添加了功能齊全的 eBPF 支援,從而提高了可觀察性、對 Kubernetes 設置的調試以及其他功能。

3、CBL-Mariner Distroless 基礎鏡像

微軟為大多數流行的程式語言和平台提供了 Distroless 的基礎鏡像。

以下基礎鏡像是正式發布的版本:

• mcr.microsoft.com/cbl-mariner/distroless/base:2.0
• mcr.microsoft.com/cbl-mariner/distroless/debug:2.0
• mcr.microsoft.com/cbl-mariner/distroless/minimal:2.0

4、 .NET Distroless 鏡像

官方運行時映像(例如mcr.microsoft.com/dotnet/runtimemcr.microsoft.com/dotnet/aspnet)非常大(runtime:6.0-bullseye-slim為 188 MB)。這不僅增加了整個地方的頻寬和存儲使用量以及啟動時間,而且還增加了攻擊面。而且這些映像默認以 root 身份運行。

雖然 Alpine 已經非常小,但它還包含像 sh 這樣的二進位文件,這些二進位文件沒有被 dotnet 運行時引用或使用。該請求更多的是關於安全問題而不是影像大小。如果我們儘可能多地刪除基礎鏡像中的二進位文件,潛在的安全漏洞就會更少。

微軟目前只有針對CBL-Mariner Distroless .NET鏡像支援,具體參考://github.com/dotnet/dotnet-docker/issues/3455