本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.27:高效 SELinux 卷標重新標記 (Beta)
問題
在啟用 Security-Enhanced Linux (SELinux) 的 Linux 上,傳統上是由容器執行期將 SELinux 標籤套用至 Pod 及其所有磁碟區。Kubernetes 僅將 SELinux 標籤從 Pod 的 securityContext
欄位傳遞至容器執行期。
然後,容器執行期會以遞迴方式變更 Pod 容器可見的所有檔案上的 SELinux 標籤。如果磁碟區上有許多檔案,尤其當磁碟區位於遠端檔案系統上時,這可能會非常耗時。
注意
如果容器使用磁碟區的subPath
,則只會重新標記整個磁碟區的該 subPath
。這允許兩個具有兩個不同 SELinux 標籤的 Pod 使用相同的磁碟區,只要它們使用不同的子路徑即可。如果 Pod 在 Kubernetes API 中未指派任何 SELinux 標籤,則容器執行期會指派一個唯一的隨機標籤,因此可能逃脫容器邊界的程序無法存取主機上任何其他容器的資料。容器執行期仍然會使用此隨機 SELinux 標籤以遞迴方式重新標記所有 Pod 磁碟區。
使用掛載選項進行改進
如果 Pod 及其磁碟區符合所有下列條件,Kubernetes 將直接掛載具有正確 SELinux 標籤的磁碟區。此類掛載將在恆定時間內發生,並且容器執行期將無需以遞迴方式重新標記其上的任何檔案。
作業系統必須支援 SELinux。
如果未偵測到 SELinux 支援,kubelet 和容器執行期不會針對 SELinux 執行任何操作。
功能閘道
ReadWriteOncePod
和SELinuxMountReadWriteOncePod
必須啟用。這些功能閘道在 Kubernetes 1.27 中為 Beta 版,在 1.25 中為 Alpha 版。如果停用任何這些功能閘道,SELinux 標籤將始終由容器執行期透過遞迴方式遍歷磁碟區(或其子路徑)來套用。
Pod 必須在其Pod 安全性環境設定中至少指派
seLinuxOptions.level
,或者所有 Pod 容器都必須在其安全性環境設定中設定它。Kubernetes 將從作業系統預設值(通常為system_u
、system_r
和container_t
)讀取預設的user
、role
和type
。如果 Kubernetes 至少不知道 SELinux
level
,則容器執行期將在磁碟區掛載後指派一個隨機標籤。在這種情況下,容器執行期仍然會以遞迴方式重新標記磁碟區。磁碟區必須是具有存取模式
ReadWriteOncePod
的持續性磁碟區。這是初始實作的限制。如上所述,兩個 Pod 可以具有不同的 SELinux 標籤,並且仍然可以使用相同的磁碟區,只要它們使用不同的
subPath
即可。當磁碟區掛載了 SELinux 標籤時,此使用案例是不可能的,因為整個磁碟區都被掛載,並且大多數檔案系統都不支援使用多個 SELinux 標籤多次掛載單個磁碟區。如果您的部署中必須執行兩個具有兩個不同 SELinux 環境設定且使用相同磁碟區的不同
subPath
的 Pod,請在 KEP 問題中留言(或為任何現有留言投票 - 最好不要重複)。當此功能擴展到涵蓋所有磁碟區存取模式時,此類 Pod 可能無法執行。負責磁碟區的磁碟區外掛程式或 CSI 驅動程式支援使用 SELinux 掛載選項進行掛載。
這些內建磁碟區外掛程式支援使用 SELinux 掛載選項進行掛載:
fc
、iscsi
和rbd
。支援使用 SELinux 掛載選項進行掛載的 CSI 驅動程式必須在其 CSIDriver 實例中透過設定
seLinuxMount
欄位來宣告。由其他磁碟區外掛程式或未設定
seLinuxMount: true
的 CSI 驅動程式管理的磁碟區將由容器執行期以遞迴方式重新標記。
使用 SELinux 環境設定進行掛載
當滿足所有上述條件時,kubelet 會將 -o context=<SELinux label>
掛載選項傳遞至磁碟區外掛程式或 CSI 驅動程式。CSI 驅動程式供應商必須確保其 CSI 驅動程式支援此掛載選項,並且在必要時,CSI 驅動程式會附加其他掛載選項,這些選項是 -o context
工作所需的。
例如,NFS 可能需要 -o context=<SELinux label>,nosharecache
,因此從相同 NFS 伺服器掛載的每個磁碟區都可以具有不同的 SELinux 標籤值。同樣地,CIFS 可能需要 -o context=<SELinux label>,nosharesock
。
CSI 驅動程式供應商有責任在啟用 SELinux 的環境中測試其 CSI 驅動程式,然後再於 CSIDriver 實例中設定 seLinuxMount: true
。
如何瞭解更多資訊?
容器中的 SELinux:請參閱 Daniel J Walsh 撰寫的精彩視覺化 SELinux 指南。請注意,該指南比 Kubernetes 更舊,它以虛擬機器為例說明了多類別安全性 (MCS) 模式,但是,類似的概念也用於容器。
請參閱一系列部落格文章,以瞭解容器執行期如何將 SELinux 準確地應用於容器
閱讀 KEP:使用掛載加速 SELinux 磁碟區重新標記