隨著容器化和微服務架構的普及,容器安全成為雲原生應用開發的關鍵環節。理解容器的本質以及潛在的安全風險,才能構建更安全的容器化應用。本文從容器的基本元件切入,探討容器執行時、映像檔和核心能力等概念,並深入講解無根執行時和容器執行時保護機制,例如使用 Docker 無根模式、Podman 和 Falco 等工具提升安全性。此外,文章也涵蓋了 Kubernetes 漏洞掃描、容器映像檔 CVE 掃描等重要議題,提供全面的容器安全防護策略。

雲原生安全:容器與協調器安全

雲原生安全是現代軟體開發和佈署的關鍵議題,特別是在容器化和微服務架構日益普及的今天。本篇文章將探討雲原生安全的核心概念,特別是容器和協調器的安全問題。

什麼是容器?

容器是一種輕量級的虛擬化技術,允許開發者在同一台主機上執行多個隔離的應用程式。與傳統虛擬機器相比,容器分享同一個作業系統核心,因此更加輕便和高效。

常見誤解

許多人對容器存在誤解,例如認為容器就是輕量級的虛擬機器,或者認為容器內部可以執行任何作業系統。事實上,容器分享主機的作業系統核心,因此容器內的作業系統必須與主機的作業系統相容。

容器元件

容器的基本元件包括:

  1. 容器執行時:負責執行和管理容器的軟體,例如 Docker 和 Podman。
  2. 容器映像檔:包含了應用程式及其依賴項的只讀範本,用於建立容器。
  3. 核心能力: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 監控工具和無根執行時的關係。

圖表解密:

  1. 容器 是雲原生應用的基本單元。
  2. 容器執行時 負責管理容器的生命週期。
  3. Falco 用於監控和檢測容器的異常行為,提供實時的安全威脅檢測。
  4. 無根執行時 以非 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

此圖示展示了容器的基本特性及其優點。

容器與虛擬機器的比較

容器和虛擬機器都是用於佈署應用程式的技術,但它們在實作方式和特性上存在顯著差異。虛擬機器透過硬體虛擬化技術,在一台實體機器上執行多個作業系統,每個作業系統都擁有自己的核心和系統函式庫。相比之下,容器則是在同一台實體機器的作業系統上執行多個隔離的應用程式,它們分享同一核心,但擁有自己的應用程式和依賴函式庫。

為什麼容器比虛擬機器更輕量?

  1. 分享核心:容器分享主機作業系統的核心,而虛擬機器則需要為每個虛擬機器安裝一個完整的作業系統。
  2. 資源佔用:由於容器不需要為每個應用程式執行個體安裝完整的作業系統,因此它們佔用的磁碟空間和記憶體資源較少。
  3. 啟動速度:容器的啟動速度遠快於虛擬機器,因為它們不需要啟動整個作業系統。

內容解密:

本文比較了容器和虛擬機器的不同之處,闡述了容器更加輕量的原因,包括分享核心、資源佔用少以及啟動速度快等優點。這有助於讀者瞭解為何容器在現代軟體開發中越來越受歡迎。