我相信你肯定遇到過這種情況:你嘗試組裝一個個人使用的容器,你想讓它更安全。 非特權容器 突然間,你發現自己陷入了權限錯誤的迷宮。花費數小時配置使用者主目錄中的資料夾,卻發現容器無法寫入這些資料夾,或即使寫入成功,主機上的檔案也已損壞,這令人沮喪。 無法管理 因為它們屬於一個幽靈用戶。
事實上,容器化雖然加快了軟體交付速度,但也帶來了相當大的風險。根據最新數據,絕大多數生產鏡像都攜帶了[不確定 - 可能是“不確定”或“不確定”] 嚴重漏洞這使得安全成為不可或缺的支柱。它不僅關乎防止駭客攻擊,更關乎理解系統如何運作。 流程隔離 以免我們的基礎設施變成篩子。
了解容器安全生態系統
為了避免權限設定上的猜測,我們首先需要知道我們要保護的是什麼。容器的架構分為幾個關鍵層。首先,我們有… 容器的圖像這是原始藍圖;如果這個藍圖有漏洞,那麼你部署的所有實例都將是不安全的。這就是為什麼使用…至關重要。 受信任的基礎鏡像 並讓他們隨時了解最新情況。
然後是 運行時環境它充當宿主作業系統和應用程式之間的仲裁者。如果運行時環境過時,則存在以下風險: 容器逃逸 顯著增加。為此,我們還需要添加編排工具,例如 Kubernetes,其中 基於角色的存取控制(RBAC) 這是防止未經授權存取管理 API 的唯一真正屏障。
我們不能忘記 主機作業系統如果攻擊者成功攻破主機內核,他們就掌握了整個域的控制權。因此,建議很明確:使用… 最小作業系統 為了縮小攻擊面。最後,網路是最常見的入口點;近30%的攻擊事件是由於連接故障造成的,因此 網路分段和TLS/SSL加密 它們是強制性的。
權限和root使用者的麻煩事
業餘愛好者通常會遇到的問題是卷的工作流程。你建立一個資料夾,掛載它,然後,砰!就出錯了。 沒有權限這是因為預設情況下,許多容器以 root 使用者身分啟動。當您嘗試強制執行此操作時 UID 和 GID 為 0 為了使它們與主機用戶匹配,您正在創建一個危險的橋樑。如果容器不允許您配置這些 ID,您最終可能會浪費一整個下午的時間來弄清楚應用程式正在使用哪個內部使用者來執行操作。 chown 手冊。
有效的解決方案是應用 最小特權原則除非絕對必要,否則不應以 root 使用者身分執行任何命令。要解決容器建立的檔案無法在主機上刪除的問題,必須按照以下說明配置 Dockerfile: USER在應用程式啟動之前定義一個沒有權限的使用者。
如果你使用 Podman,那麼 Podman 的概念是… 無根容器 它原生且非常實用,但需要您了解主機使用者如何對應到容器使用者。為了防止權限失控,理想情況下,應用程式應該設計為寫入特定路由,並且… 體積映射 這是根據啟動該進程的使用者的真實 UID 來完成的。
建構裝甲圖像的策略
如果你想擺脫痛苦,就必須改變你建構圖像的方式。一種極為有效的技巧是… 多階段構建基本上,你使用包含所有建置工具的重量級鏡像來產生二進位文件,然後只將該文件複製到最終鏡像中。 極輕.
你甚至可以利用這張圖片做更多的事情。 劃傷這會創建一個完全空的容器:沒有 shell,沒有套件管理器,只有你的應用程式。這使得攻擊者即使成功進入容器,也幾乎不可能執行惡意命令,因為 沒有命令解釋器 可用。
另一項安全措施是清除鏡像中所有具有權限的二進位。 setuid 或 setgid這些權限允許以文件所有者的權限而不是啟動該文件的使用者的權限來執行文件,這為…提供了便利。 權限提升在鏡像建置過程中,使用簡單的命令搜尋並刪除這些片段可以省去很多麻煩。
特權模式的危險性以及 Linux 的功能
有時,由於無法解決權限問題而感到絕望,我們會忍不住使用標誌。 -特權別這麼做。特權模式會破壞容器的隔離性,讓你完全存取宿主機的裝置。這就像是因為陌生人不知道怎麼打開花園大門,就把家裡的鑰匙交給他一樣。
相反,你應該玩玩 Linux 功能Docker 會指派一組預設權限(例如 CAP_CHOWN 或 CAP_NET_RAW)。如果您的應用程式不需要在底層操作網絡,那麼最明智的做法是… 消除不必要的功能 並且只添加嚴格必需的那些 --cap-add.
對於那些管理更複雜環境的人來說,還有… 授權插件 例如 opa-docker-authz。這些工具允許攔截對 Docker 守護程序 API 的調用,並阻止任何以特權模式啟動容器的嘗試,從而確保即使是無意中也不會讓任何人對主機敞開大門。
環境最佳化和維護
使用 Alpine Linux 時,如果 5MB 的鏡像大小導致庫檔案相容性問題,請不要過於糾結。有時,稍大一些的 Debian 鏡像反而更合適。 穩定且已知 由團隊完成。關鍵在於實施 漏洞掃描 自動化 CI/CD 管線,用於在鏡像進入生產環境之前檢測 CVE。
關於儲存方面,它會阻止應用程式寫入根檔案系統。請配置… 只讀檔案系統(rootfs) 並且僅為需要持久化的資料定義特定的磁碟區。這不僅更安全,還能促使架構更加簡潔。 無家者促進橫向擴展。
對於定時任務,不要將 cron 作業放在網站容器內。黃金法則是: 每個容器一個行程最簡潔的方法是使用應用程式的鏡像啟動一個臨時容器來執行任務,然後自行銷毀;或透過命令呼叫容器引擎,從主機管理 cron。
容器安全性是一個持續的過程,包括消除 root 存取權限、限制核心功能以及從容器映像中移除不必要的工具。透過將非特權使用者與運行時加固和持續監控相結合,可以建立一個功能完善且不會損害宿主系統完整性的環境。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。

