distroless 映象介紹及 基於cbl-mariner的.NET distroless 映象的容器

張善友發表於2022-06-22

1、概述

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

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

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

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

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

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

谷歌和微軟現在通過提供 Distroless 映象向客戶開放這種能力。谷歌和微軟構建的這些映象的目標是隻包含你的應用程式及其依賴項,同時它們將沒有常規 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的.NET映象參考我之前寫的一篇簡短介紹文章.NET 映象之 cbl-mariner

微軟目前只有針對CBL-Mariner Distroless .NET映象支援,具體參考:https://github.com/dotnet/dotnet-docker/issues/3455。如下表所示 6.0.6-cbl-mariner2.0-distroless-amd64 最小隻有25.6M

mcr.microsoft.com/dotnet/aspnet                    6.0.6-alpine3.16                        143cdbb3b431   7 days ago     100MB
mcr.microsoft.com/dotnet/aspnet                    6.0-cbl-mariner2.0-distroless           6c722a6801c2   7 days ago     116MB
mcr.microsoft.com/dotnet/runtime                   6.0.6-alpine3.16-amd64                  f141202484ea   7 days ago     79.7MB
mcr.microsoft.com/dotnet/runtime                   6.0.6-cbl-mariner2.0-distroless-amd64   14a849437c74   7 days ago     96.2MB
mcr.microsoft.com/dotnet/runtime-deps              6.0-cbl-mariner2.0-distroless           c8665469fafc   7 days ago     25.6MB
mcr.microsoft.com/dotnet/runtime-deps              6.0.6-cbl-mariner2.0-distroless-amd64   c8665469fafc   7 days ago     25.6MB

相關文章