隨著容器化和微服務架構的普及,容器安全成為雲原生應用開發的關鍵環節。理解容器的本質以及潛在的安全風險,才能構建更安全的容器化應用。本文從容器的基本元件切入,探討容器執行時、映像檔和核心能力等概念,並深入講解無根執行時和容器執行時保護機制,例如使用 Docker 無根模式、Podman 和 Falco 等工具提升安全性。此外,文章也涵蓋了 Kubernetes 漏洞掃描、容器映像檔 CVE 掃描等重要議題,提供全面的容器安全防護策略。
雲原生安全:容器與協調器安全
雲原生安全是現代軟體開發和佈署的關鍵議題,特別是在容器化和微服務架構日益普及的今天。本篇文章將探討雲原生安全的核心概念,特別是容器和協調器的安全問題。
什麼是容器?
容器是一種輕量級的虛擬化技術,允許開發者在同一台主機上執行多個隔離的應用程式。與傳統虛擬機器相比,容器分享同一個作業系統核心,因此更加輕便和高效。
常見誤解
許多人對容器存在誤解,例如認為容器就是輕量級的虛擬機器,或者認為容器內部可以執行任何作業系統。事實上,容器分享主機的作業系統核心,因此容器內的作業系統必須與主機的作業系統相容。
容器元件
容器的基本元件包括:
- 容器執行時:負責執行和管理容器的軟體,例如 Docker 和 Podman。
- 容器映像檔:包含了應用程式及其依賴項的只讀範本,用於建立容器。
- 核心能力:Linux 核心提供了一系列的能力(Capabilities),允許容器在不擁有 root 許可權的情況下執行特定操作。
核心能力
Linux 核心能力是容器安全的一個重要方面。透過限制容器的核心能力,可以降低容器的許可權,從而提高安全性。例如,可以使用 --cap-drop 引數來移除容器的某些核心能力。
docker run --cap-drop=ALL myimage
內容解密:
此命令用於執行一個 Docker 容器,並移除所有核心能力,以提高容器的安全性。
docker run:啟動一個新的 Docker 容器。--cap-drop=ALL:移除容器內所有預設的核心能力,降低容器的許可權,避免潛在的安全風險。myimage:指定要執行的容器映像檔名稱。
無根執行時
無根執行時(Rootless Runtimes)是一種允許在沒有 root 許可權的情況下執行容器的技術。這種方法可以提高安全性,因為即使容器被攻破,攻擊者也無法獲得主機的 root 許可權。
Docker 無根模式
Docker 提供了一種無根模式,允許使用者在沒有 root 許可權的情況下執行 Docker 守護程式。這可以透過設定特定的環境變數和使用特殊的安裝指令碼來實作。
dockerd-rootless.sh --experimental
內容解密:
此命令用於以無根模式啟動 Docker 守護程式。
dockerd-rootless.sh:這是 Docker 提供的無根模式啟動指令碼。--experimental:啟用實驗性功能,允許使用無根模式執行 Docker。
Podman 無根執行
Podman 是另一種流行的容器執行時,它天生支援無根執行。Podman 不需要守護程式,因此更加安全和易於使用。
podman run myimage
內容解密:
此命令用於使用 Podman 執行一個容器。
podman run:使用 Podman 啟動一個新的容器。myimage:指定要執行的容器映像檔名稱。
容器執行時保護
容器執行時保護是指在容器執行過程中採取的安全措施,以防止容器被攻破或濫用。Falco 是一種流行的開源工具,用於監控和保護容器執行時。
執行 Falco
Falco 可以檢測容器的異常行為,例如未經授權的檔案存取或網路活動。Falco 的規則引擎允許使用者自定義檢測規則,以適應特定的安全需求。
falco -c falco.yaml
內容解密:
此命令用於啟動 Falco,並指定組態檔案。
falco:啟動 Falco 監控工具。-c falco.yaml:指定 Falco 的組態檔案,用於定義檢測規則和行為。
雲原生安全架構
此圖示展示了雲原生安全架構的主要元件,包括容器、容器執行時、Falco 監控工具和無根執行時的關係。
圖表解密:
- 容器 是雲原生應用的基本單元。
- 容器執行時 負責管理容器的生命週期。
- Falco 用於監控和檢測容器的異常行為,提供實時的安全威脅檢測。
- 無根執行時 以非 root 許可權執行容器,提高了容器的安全性,降低了潛在的許可權濫用風險。
雲原生安全:複雜多面體的挑戰
近年來,軟體應用程式的開發和佈署方式發生了戲劇性的變化。回顧過去十年,容器技術的興起、雲端平台的成熟、容器協調器的普及,以及軟體應用程式被拆解為可攜式的微服務,都對開發者提供了全新的工具箱和可靠的佈署平台。
雲原生技術的演進
雲原生技術的快速發展,使其在電腦歷史上佔據了一席之地。然而,隨著新技術的出現,不同型別的安全挑戰也隨之浮現,需要及時解決。
雲原生安全的複雜性
雲原生安全是一個複雜、多面體的主題,要想正確理解並實施安全措施非常困難。原因在於需要保護的多樣化元件,包括雲端平台、底層主機作業系統、容器執行環境、容器協調器,以及應用程式本身,每個元件都需要專門的安全關注。
需要持續監控的安全元件
- 雲端平台
- 底層主機作業系統
- 容器執行環境
- 容器協調器
- 應用程式
這些關鍵技術堆積疊的安全性和監控需要在每天24小時、全年無休的基礎上進行。對於那些不熟悉雲原生技術的安全從業人員來說,這是一個巨大的挑戰。
多元化的安全挑戰
為了應對這些挑戰,我們需要深入瞭解雲原生安全的各個方面,並採取有效的安全措施。只有這樣,才能確保雲原生技術的安全性和可靠性。
內容解密:
本章節主要介紹了雲原生技術的發展和其帶來的安全挑戰。雲原生技術使軟體開發和佈署方式發生了重大變化,但也帶來了複雜的安全問題。需要保護的元件包括雲端平台、主機作業系統、容器執行環境、容器協調器和應用程式等。這些元件需要持續的安全監控和保護,以確保整個技術堆積疊的安全性。
雲原生安全導論
在高階攻擊者中,存在許多極具適應性、智慧且極具耐心的個人,他們具備豐富的開發和系統經驗,能夠完成極為複雜的入侵,包括對最高知名度的線上服務的入侵。這些人可能資金充足,極難被擋在雲端環境之外。只有透過不斷修補每個安全漏洞,並採用多層防禦,才能有望做到這一點。然而,這些攻擊者通常可以被保持在一定的距離。最高階別的所謂國家級攻擊者已經足夠先進,以至於許多安全團隊難以辨別是否已經成功入侵。
除了令人擔憂的問題之外,好訊息是,透過結合開源工具和將安全性向軟體生命週期左移,可以顯著提高攻擊者成功利用漏洞的難度。這樣做可以使開發人員對威脅有更大的可見性,從而使他們對進入生產的程式碼承擔更多的責任。
挑戰的解決方案
《雲原生安全》的作者在技術和安全領域工作超過20年,從不同的角度來面對這些挑戰。因此,本文分為四個不同的部分,共同為讀者提供足夠的安全工具知識,以及專業的know-how,以改善任何雲原生基礎設施的安全態勢。
本文詳細探討的關鍵領域是前言中已經提到的高階構建模組。第一部分重點關注容器執行時和協調器安全,第二部分關注DevSecOps工具,第三部分關注雲平台的安全和監控,最後第四部分探討高階Kubernetes安全。
本文內容概覽
以下是《雲原生安全》各章節的摘要:
第一章:什麼是容器?
第一章討論了組成Linux容器的元件。透過實踐範例,本章從Linux系統的角度探討了這些元件,並討論了目前常用的容器型別。
第二章:無根執行時
本章探討了執行容器的聖杯——不使用root使用者執行容器。探討了Docker的實驗性無根模式,接著…
重點內容解析
本文強調了將安全性向左移的重要性,如DevSecOps方法論所倡導的那樣。當與CI/CD管道中的安全邏輯閘門結合使用時,這種方法非常有效,並且已經呈指數級增長。
程式碼安全管理
# 示例程式碼:檢查容器執行時的組態
docker inspect -f '{{ .HostConfig.Privileged }}' <container_id>
內容解密:
此命令用於檢查指定容器的執行時組態,特別是檢查容器是否以特權模式執行。其中:
docker inspect用於顯示Docker物件的詳細資訊。-f引數允許我們根據特定的範本格式化輸出。{{ .HostConfig.Privileged }}是Go範本語法,用於提取容器的Privileged組態。<container_id>是容器的ID,需要替換為實際容器的ID。
透過這種方式,可以更好地理解容器的執行時組態,從而提高容器的安全性。
結語
本文旨在為安全專業人員和開發人員提供所需的專業知識,以保護雲原生環境。透過對容器、DevSecOps工具、雲平台安全和Kubernetes安全的探討,讀者將能夠更好地應對雲原生環境中的安全挑戰。
本文目錄導讀
本文探討了雲原生安全領域的各個導向,從容器執行時安全到Kubernetes叢集的漏洞掃描,再到雲端操作的監控與防護。以下為本文各章節的簡介:
第一部分:容器與執行時安全
第三章:容器執行時保護
本章介紹了一款強大的開源工具,能夠為容器提供有效的防護措施。透過自定義策略,可以監控並阻止容器中的異常行為。
第四章:取證日誌記錄
本章探討了Linux內建的稽核系統,該系統能夠提供極為詳細的日誌記錄。透過稽核系統,可以逐步回溯事件,深入瞭解攻擊發生的過程,並識別組態錯誤和效能問題。
第五章:Kubernetes漏洞掃描
本章介紹了一款工具,能夠對Kubernetes叢集進行詳細的安全檢查,並提供合規性修復建議。這些建議對於安裝時和持續性的安全稽核都非常有幫助。
第六章:容器映像檔CVE掃描
透過結合多款常見的漏洞掃描工具,可以對靜態容器映像檔中的漏洞進行全面掃描,從而獲得需要修補的漏洞的詳細資訊。
第二部分:DevSecOps工具
第七章:基準掃描(ZAP您的應用程式)
本章探討了在CI/CDPipeline中執行基準測試的好處,以突出應用程式中的問題。
第八章:安全編碼
本章介紹了一款工具,能夠利用自定義策略模擬攻擊,測試新構建的服務和應用程式中的漏洞,並將其整合到CI/CD測試中。
第九章:Kubernetes合規性檢查
本章詳細介紹了一款與CI/CD測試相容的工具,能夠使用數百種不同的測試標準檢查Kubernetes叢集的安全性,並提供修復建議。
第十章:保護您的Git儲存函式庫
本章介紹了兩款流行的工具,用於防止敏感資訊(如令牌、證書和密碼)被意外儲存在程式碼倉函式庫中。這兩款工具都適合在CI/CDPipeline中呼叫。
第十一章:自動化主機安全
本章探討了雲原生安全中經常被忽視的一個方面——Linux主機本身的安全。透過使用Ansible等組態管理工具自動化主機的安全加固,可以有效防止攻擊者獲得立足點,並建立可預測、可靠和更安全的主機。
第三部分:雲端安全
第十二章:使用Nikto進行伺服器掃描
本章介紹了一款工具,能夠對主機上執行的應用程式進行數千次測試,以提高其安全性。同時,該工具也可以輕鬆整合到CI/CDPipeline測試中。
第十三章:監控雲端操作
本章提出了一些解決方案,用於日常監控雲端基礎設施並改善雲端安全態勢管理(CSPM)。透過使用開源工具,可以建立出具有高度自定義指標的儀錶板,同時降低營運成本。
第十四章:雲端監護
本章探討了一款強大的工具,能夠自動執行自定義策略,以防止雲端環境中的不安全組態。透過瞭解該工具的工作原理,可以在AWS、Azure和Google Cloud平台上佈署軟體中包含的許多示例。
第十五章:雲端稽核
本章介紹了流行的稽核工具的安裝和使用方法,這些工具可以執行數百項Linux和雲端平台合規性測試,其中一些測試根據流行的CIS基準。
第十六章:AWS雲端儲存
本章探討了攻擊者如何竊取雲端儲存中的大量敏感資料,並強調了惡意訪客如何輕易判斷儲存是否公開可存取,然後潛在地下載該儲存中的資產。此外,本章還介紹了一項付費服務,該服務可以幫助攻擊者使用自動化手段實作上述目的。
第四部分:進階Kubernetes和執行時安全
第十七章:Kubernetes外部攻擊
本章探討了API伺服器攻擊,這是攻擊者常用的利用Kubernetes的方式,同時也探討了Kubernetes叢集的其他核心元件。
第十八章:使用RBAC進行Kubernetes授權
本章討論了Kubernetes叢集中用於授權的根據角色的存取控制功能。透過定義細粒度的存取控制,可以顯著限制允許的存取級別。
第十九章:網路加固
本章探討了攻擊者在Kubernetes叢集中針對網路的攻擊方式,以及限制應用程式或使用者在網路名稱空間之間移動的現代方法。
第二十章:工作負載加固
本章在前幾章知識的基礎上,進一步探討了Kubernetes中工作負載加固的進階方法。
第一章:什麼是容器?
Linux 容器技術的發展歷經了一系列創新,這些創新來自不同的技術先驅。容器技術已經對現代軟體開發方式產生了重大影響,並且這種影響在未來將會更加深遠。
簡單來說,容器是一種獨立且相對隔離的程式單元,具有特定的功能。容器的基本理念是專注於一個關鍵程式(如網頁伺服器)及其相關程式。如果網頁伺服器需要升級或更改,那麼其他軟體元件(如相關的資料函式庫容器)不會受到影響,這使得技術堆積疊的建構更加模組化。
在本章中,我們將探討容器的建構及其基本元件。沒有這些背景知識,很難成功地確保容器化伺服器的安全性。我們將首先關注執行容器的軟體,即容器執行時。我們將重點介紹兩種最主要的執行時:Docker 和 Podman。對後者的探討也將為我們提供對容器執行時最新進展的寶貴見解。
常見誤解
2014-2015 年間,Docker Inc. 對系統和核心元件的巧妙封裝引發了人們對 Linux 容器的極大興趣。隨著 Docker 的流行,一個常見的誤解是容器可以像虛擬機器(VM)一樣被對待。雖然隨著技術的發展,這種看法在一定程度上變得正確,但讓我們來看看這種誤解涉及哪些內容,以幫助說明與容器相關的一些安全挑戰。
與大多數 VM 一樣,不太瞭解的使用者相信,如果每個客戶執行自己的容器,那麼客戶 A 就無法存取客戶 B 的資源。這種隱含的信任是可以理解的。硬體虛擬化經常在 Linux 系統上使用,例如使用流行的根據核心的虛擬機器(KVM)等工具實作。使用這種技術的虛擬機器可以在同一台實體機器上執行,並且確實分享了相當程度的隔離,從而顯著提高了其安全態勢。
這種虛擬化不應與半虛擬化混淆,後者由 Xen 等軟體使用,其中客戶作業系統可以在修改的主機作業系統上分享硬體。
圖 1.1:容器與虛擬機器的區別
圖 1.1 顯示了容器和虛擬機器之間的區別。所顯示的程式是與執行應用程式相關的程式。使用我們的網頁伺服器範例,一個程式可能正在執行一個監聽 HTTP 連線埠的網頁伺服器,另一個程式則監聽 HTTPS。如前所述,為了保持所需的模組化,容器應該服務於一個特定的單一任務(如網頁伺服器)。通常,它們將只執行主應用程式的程式,以及任何所需的相關程式。
容器的組成元件
在接下來的章節中,我們將從更進階的角度再次探討這一領域,並牢牢關注安全緩解措施。本章旨在識別容器中應該引起安全人員關注的元件,而不是研究 Linux 容器的歷史進展。
內容解密:
本章節介紹了容器的基本概念,包括其定義、常見誤解以及與虛擬機器的比較。接下來,我們將探討容器的建構及其基本元件,以幫助讀者瞭解如何確保容器的安全性。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 容器安全探討核心技術與實踐
package "Kubernetes Cluster" {
package "Control Plane" {
component [API Server] as api
component [Controller Manager] as cm
component [Scheduler] as sched
database [etcd] as etcd
}
package "Worker Nodes" {
component [Kubelet] as kubelet
component [Kube-proxy] as proxy
package "Pods" {
component [Container 1] as c1
component [Container 2] as c2
}
}
}
api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2
note right of api
核心 API 入口
所有操作經由此處
end note
@enduml此圖示展示了容器的基本特性及其優點。
容器與虛擬機器的比較
容器和虛擬機器都是用於佈署應用程式的技術,但它們在實作方式和特性上存在顯著差異。虛擬機器透過硬體虛擬化技術,在一台實體機器上執行多個作業系統,每個作業系統都擁有自己的核心和系統函式庫。相比之下,容器則是在同一台實體機器的作業系統上執行多個隔離的應用程式,它們分享同一核心,但擁有自己的應用程式和依賴函式庫。
為什麼容器比虛擬機器更輕量?
- 分享核心:容器分享主機作業系統的核心,而虛擬機器則需要為每個虛擬機器安裝一個完整的作業系統。
- 資源佔用:由於容器不需要為每個應用程式執行個體安裝完整的作業系統,因此它們佔用的磁碟空間和記憶體資源較少。
- 啟動速度:容器的啟動速度遠快於虛擬機器,因為它們不需要啟動整個作業系統。
內容解密:
本文比較了容器和虛擬機器的不同之處,闡述了容器更加輕量的原因,包括分享核心、資源佔用少以及啟動速度快等優點。這有助於讀者瞭解為何容器在現代軟體開發中越來越受歡迎。