Pod 和容器的 Linux 核心安全性限制
本頁說明 Linux 核心中內建的一些安全功能,您可以在 Kubernetes 工作負載中使用這些功能。若要瞭解如何將這些功能套用至您的 Pod 和容器,請參閱為 Pod 或容器配置 SecurityContext。您應該已經熟悉 Linux 和 Kubernetes 工作負載的基礎知識。
在沒有 root 權限的情況下執行工作負載
當您在 Kubernetes 中部署工作負載時,請使用 Pod 規格來限制該工作負載以 root 使用者身分在節點上執行。您可以使用 Pod securityContext
來定義 Pod 中程序的特定 Linux 使用者和群組,並明確限制容器以 root 使用者身分執行。在 Pod 資訊清單中設定這些值會優先於容器映像檔中的類似值,如果您執行的是您不擁有的映像檔,這特別有用。
注意
請確保您指派給工作負載的使用者或群組具有應用程式正常運作所需的權限。將使用者或群組變更為沒有正確權限的使用者或群組可能會導致檔案存取問題或作業失敗。在本頁上配置核心安全功能可對叢集中程序可以採取的動作提供細緻的控制,但大規模管理這些配置可能具有挑戰性。以非 root 身分執行容器,或者在您需要 root 權限時在使用者命名空間中執行容器,有助於降低您需要強制執行已配置核心安全功能的可能性。
Linux 核心中的安全功能
Kubernetes 可讓您配置和使用 Linux 核心功能,以改善隔離並強化您的容器化工作負載。常見的功能包括以下各項
- 安全運算模式 (seccomp):篩選程序可以進行的系統呼叫
- AppArmor:限制個別程式的存取權限
- Security Enhanced Linux (SELinux):將安全標籤指派給物件,以更輕鬆地管理安全政策強制執行
若要配置其中一個功能的設定,您為節點選擇的作業系統必須在核心中啟用該功能。例如,Ubuntu 7.10 及更新版本預設會啟用 AppArmor。若要瞭解您的作業系統是否啟用特定功能,請查閱作業系統文件。
您可以使用 Pod 規格中的 securityContext
欄位來定義適用於這些程序的限制。securityContext
欄位也支援其他安全設定,例如特定 Linux 功能或使用 UID 和 GID 的檔案存取權限。若要瞭解更多資訊,請參閱為 Pod 或容器配置 SecurityContext。
seccomp
您的部分工作負載可能需要權限,才能以節點主機上的 root 使用者身分執行特定動作。Linux 使用功能將可用權限劃分為不同類別,以便程序可以在無需被授予所有權限的情況下,取得執行特定動作所需的權限。每個功能都有一組程序可以進行的系統呼叫 (syscall)。seccomp 可讓您限制這些個別的系統呼叫。它可以用來沙箱化程序的權限,限制程序從使用者空間向核心發出的呼叫。
在 Kubernetes 中,您在每個節點上使用容器執行階段來執行容器。範例執行階段包括 CRI-O、Docker 或 containerd。預設情況下,每個執行階段僅允許 Linux 功能的子集。您可以使用 seccomp 設定檔進一步個別限制允許的系統呼叫。容器執行階段通常包含預設的 seccomp 設定檔。Kubernetes 可讓您自動將載入到節點上的 seccomp 設定檔套用到您的 Pod 和容器。
注意
Kubernetes 也具有 Pod 和容器的allowPrivilegeEscalation
設定。當設定為 false
時,這會阻止程序取得新的功能,並限制非特權使用者將套用的 seccomp 設定檔變更為更寬鬆的設定檔。若要瞭解如何在 Kubernetes 中實作 seccomp,請參閱使用 seccomp 限制容器的系統呼叫或Seccomp 節點參考文件
若要深入瞭解 seccomp,請參閱 Linux 核心文件中的Seccomp BPF。
seccomp 的考量
seccomp 是一種低階安全設定,只有在您需要對 Linux 系統呼叫進行細微控制時,才應自行設定。使用 seccomp,尤其是在大規模環境中,具有以下風險:
- 組態可能會在應用程式更新期間中斷
- 攻擊者仍然可以使用允許的系統呼叫來利用漏洞
- 個別應用程式的設定檔管理在大規模環境中變得具有挑戰性
建議:使用容器執行階段預先封裝的預設 seccomp 設定檔。如果您需要更隔離的環境,請考慮使用沙箱,例如 gVisor。沙箱解決了自訂 seccomp 設定檔的前述風險,但需要在您的節點上使用更多運算資源,並且可能與 GPU 和其他特殊硬體存在相容性問題。
AppArmor 和 SELinux:基於策略的強制存取控制
您可以使用 Linux 基於策略的強制存取控制 (MAC) 機制,例如 AppArmor 和 SELinux,來強化您的 Kubernetes 工作負載。
AppArmor
AppArmor 是一個 Linux 核心安全模組,它補充了標準 Linux 使用者和群組型權限,將程式限制在一組有限的資源中。可以為任何應用程式設定 AppArmor,以減少其潛在的攻擊面並提供更深入的防禦。它透過針對特定程式或容器所需存取權限而調整的設定檔進行設定,例如 Linux 功能、網路存取和檔案權限。每個設定檔都可以在強制模式 (會封鎖對不允許資源的存取) 或抱怨模式 (僅回報違規行為) 下執行。
AppArmor 可以透過限制容器允許執行的操作,和/或透過系統日誌提供更好的稽核,來協助您執行更安全的部署。您使用的容器執行階段可能會隨附預設的 AppArmor 設定檔,或者您可以使用自訂設定檔。
若要瞭解如何在 Kubernetes 中使用 AppArmor,請參閱使用 AppArmor 限制容器對資源的存取。
SELinux
SELinux 是一個 Linux 核心安全模組,可讓您限制特定主體 (例如程序) 對系統上檔案的存取權限。您可以定義套用至具有特定 SELinux 標籤的主體的安全策略。當具有 SELinux 標籤的程序嘗試存取檔案時,SELinux 伺服器會檢查該程序的安全策略是否允許存取,並做出授權決策。
在 Kubernetes 中,您可以在資訊清單的 securityContext
欄位中設定 SELinux 標籤。指定的標籤會指派給這些程序。如果您已設定影響這些標籤的安全策略,則主機作業系統核心會強制執行這些策略。
若要瞭解如何在 Kubernetes 中使用 SELinux,請參閱將 SELinux 標籤指派給容器。
AppArmor 和 SELinux 之間的差異
Linux 節點上的作業系統通常包含 AppArmor 或 SELinux 其中之一。這兩種機制都提供類似類型的保護,但存在以下差異:
- 組態:AppArmor 使用設定檔來定義對資源的存取。SELinux 使用套用至特定標籤的策略。
- 策略套用:在 AppArmor 中,您可以使用檔案路徑定義資源。SELinux 使用資源的索引節點 (inode) 來識別資源。
功能摘要
下表說明每個安全控制的使用案例和範圍。您可以將所有這些控制項一起使用,以建構更強化的系統。
安全功能 | 描述 | 如何使用 | 範例 |
---|---|---|---|
seccomp | 限制使用者空間中的個別核心呼叫。降低使用受限系統呼叫的漏洞危害系統的可能性。 | 在 Pod 或容器規格中指定載入的 seccomp 設定檔,以將其限制套用到 Pod 中的程序。 | 拒絕 unshare 系統呼叫,該呼叫在 CVE-2022-0185 中使用。 |
AppArmor | 限制程式對特定資源的存取。減少程式的攻擊面。改善稽核記錄。 | 在容器規格中指定載入的 AppArmor 設定檔。 | 限制唯讀程式寫入系統中的任何檔案路徑。 |
SELinux | 使用標籤和安全策略限制對資源 (例如檔案、應用程式、連接埠和程序) 的存取。 | 指定特定標籤的存取限制。使用這些標籤標記程序,以強制執行與標籤相關的存取限制。 | 限制容器存取其自身檔案系統之外的檔案。 |
注意
AppArmor 和 SELinux 等機制可以提供超出容器範圍的保護。例如,您可以使用 SELinux 來協助減輕 CVE-2019-5736 的影響。管理自訂組態的考量
seccomp、AppArmor 和 SELinux 通常具有提供基本保護的預設組態。您也可以建立符合工作負載需求的自訂設定檔和策略。大規模管理和散佈這些自訂組態可能具有挑戰性,尤其是在您同時使用所有三個功能時。為了協助您大規模管理這些組態,請使用 Kubernetes Security Profiles Operator 等工具。
核心層級安全功能和特權容器
Kubernetes 可讓您指定某些受信任的容器可以在特權模式下執行。Pod 中的任何容器都可以在特權模式下執行,以使用原本無法存取的作業系統管理功能。這適用於 Windows 和 Linux。
特權容器明確覆寫您可能在工作負載中使用的部分 Linux 核心限制,如下所示:
- seccomp:特權容器以
Unconfined
seccomp 設定檔執行,覆寫您在資訊清單中指定的任何 seccomp 設定檔。 - AppArmor:特權容器忽略任何套用的 AppArmor 設定檔。
- SELinux:特權容器以
unconfined_t
網域執行。
特權容器
如果您在容器的 securityContext
欄位中設定 privileged: true
欄位,則 Pod 中的任何容器都可以啟用特權模式。特權容器會覆寫或還原許多其他強化設定,例如套用的 seccomp 設定檔、AppArmor 設定檔或 SELinux 限制。特權容器會被授予所有 Linux 功能,包括它們不需要的功能。例如,特權容器中的 root 使用者可能能夠在節點上使用 CAP_SYS_ADMIN
和 CAP_NET_ADMIN
功能,繞過執行階段 seccomp 組態和其他限制。
在大多數情況下,您應該避免使用特權容器,而是使用 securityContext
欄位中的 capabilities
欄位授予容器所需的特定功能。只有在您擁有無法使用 securityContext 授予的功能時,才使用特權模式。這對於想要使用作業系統管理功能 (例如操作網路堆疊或存取硬體裝置) 的容器很有用。
在 Kubernetes 1.26 版及更高版本中,您也可以透過在 Pod 規格的安全性環境定義中設定 windowsOptions.hostProcess
旗標,以類似的特權模式執行 Windows 容器。如需詳細資訊和指示,請參閱建立 Windows HostProcess Pod。
建議與最佳實務
- 在設定核心層級安全功能之前,您應該考慮實作網路層級隔離。如需更多資訊,請閱讀安全檢查清單。
- 除非必要,否則請以非 root 使用者身分執行 Linux 工作負載,方法是在您的 Pod 資訊清單中設定特定的使用者和群組 ID,並指定
runAsNonRoot: true
。
此外,您可以透過在 Pod 資訊清單中設定 hostUsers: false
,在使用者命名空間中執行工作負載。這可讓您在使用者命名空間中以 root 使用者身分執行容器,但在節點上的主機命名空間中以非 root 使用者身分執行。這仍處於開發的早期階段,可能沒有您需要的支援層級。如需指示,請參閱將使用者命名空間與 Pod 搭配使用。