Azure Kubernetes Service (AKS) 中的應用程式和叢集的安全性概念

容器安全性可保護從組建到 Azure Kubernetes Service (AKS) 中所執行應用程式工作負載的整個端對端管線。

安全供應鏈包括組建環境和登錄。

Kubernetes 包括安全性元件,例如「Pod 安全性標準」和「祕密」。 同時,Azure 包括 Active Directory、適用於容器的 Microsoft Defender、Azure 原則、Azure Key Vault、網路安全性群組和協調叢集升級這類元件。 AKS 合併這些安全性元件,以:

  • 提供完整的驗證和授權劇本。
  • 利用 AKS 內建 Azure 原則來保護您的應用程式。
  • 使用適用於容器的 Microsoft Defender 透過應用程式所建置的端對端深入解析。
  • 讓您的 AKS 叢集持續執行最新的 OS 安全性更新和 Kubernetes 版本。
  • 提供安全的 Pod 流量和敏感性認證存取。

本文將介紹對 AKS 中的應用程式進行保護的核心概念:

組建安全性

作為供應鏈的進入點,請務必先執行映像組建的靜態分析,再將其升階到管線。 這包括弱點和合規性評量。 這並不與因有弱點而導致組建失敗有關,因為這將會中斷開發。 這是有關查看「廠商狀態」,以根據開發小組可採取動作的弱點進行區隔。 同時利用「寬限期」,讓開發人員有時間補救已識別到的問題。

登錄安全性

評定登錄中映像的弱點狀態將會偵測漂移,也會攔截不是來自組建環境的映像。 使用 Notary V2 將簽章附加至映像,以確保部署來自信任的位置。

叢集安全性

在 AKS 中,Kubernetes 主機元件是 Microsoft 所提供、管理和維護的受控服務的一部分。 每個 AKS 叢集都有自己的單一租用戶專用 Kubernetes 主機,可提供 API 伺服器、排程器等。

根據預設,Kubernetes API 伺服器會使用公用 IP 位址和完整網域名稱 (FQDN)。 您可以使用已授權的 IP 範圍來限制對 API 伺服器端點的存取。 您也可以建立完全私人叢集,以限制 API 伺服器對虛擬網路的存取。

您可以使用 Kubernetes 角色型存取控制 (Kubernetes RBAC) 和 Azure RBAC 來控制對 API 伺服器的存取。 如需詳細資訊,請參閱 Azure AD 與 AKS 的整合

節點安全性

AKS 節點是您所管理和維護的 Azure 虛擬機器 (VM)。

  • Linux 節點會使用 containerd 或 Docker 容器執行階段來執行最佳化 Ubuntu 發行版本。
  • Windows Server 節點會使用 containerd 或 Docker 容器執行階段來執行最佳化 Windows Server 2019 版本。

當 AKS 叢集建立或相應增加時,節點將會自動以最新的 OS 安全性更新和設定進行部署。

注意

AKS 叢集:

  • 若針對 Linux 節點集區使用 Kubernetes 1.19 版和以上版本,則會使用 containerd 作為其容器執行階段。 使用 containerd 搭配 Windows Server 2019 節點集區目前為預覽狀態。 如需詳細資訊,請參閱使用 containerd 新增 Windows 伺服器節點集區
  • 若針對 Linux 節點集區使用 1.19 版之前的 Kubernetes,則會使用 Docker 作為其容器執行階段。 針對 Windows Server 2019 節點集區,Docker 是預設容器執行階段。

節點安全性修補程式

Linux 節點

每個晚上,AKS 中的 Linux 節點都會透過其散發套件安全性更新通道取得安全性修補程式。 將節點部署至 AKS 叢集時,會自動設定此行為。 為了盡可能減少中斷,並降低對正在執行之工作負載的可能影響,如果安全性修補程式或核心更新需要重新啟動時,節點不會自動重新啟動。 如需如何處理節點重新啟動的詳細資訊,請參閱將安全性和核心更新套用至 AKS 中的節點

夜間更新會將安全性更新套用至節點上的 OS,但用來為叢集建立節點的節點映像會保持不變。 如果將新的 Linux 節點新增至您的叢集,則會使用原始映像來建立節點。 這個新節點會在每天晚上自動檢查期間收到全部可用的安全性和核心更新,但會保持未修補,直到全部檢查和重新啟動都完成為止。 您可以使用節點映像升級來檢查和更新叢集所使用的節點映像。 如需節點映像升級的詳細資料,請參閱 Azure Kubernetes Service (AKS) 節點映像升級

Windows Server 節點

針對 Windows Server 節點,Windows Update 不會自動執行並套用最新的更新。 在一般 Windows Update 發行週期和您自己的驗證程序中,排程 AKS 叢集中的 Windows Server 節點集區升級。 此升級程序會建立節點來執行最新的 Windows Server 映像和修補程式,然後移除較舊的節點。 如需此程序的詳細資訊,請參閱在 AKS 中升級節點集區

節點授權

節點授權是特殊用途的授權模式,專門授權 kubelets 所發出的 API 要求,以防範東-西攻擊。 AKS 1.24 + 叢集預設會啟用節點授權。

節點部署

節點會部署至私人虛擬網路子網路中,且不會指派公用 IP 位址。 為了進行疑難排解和管理,預設會啟用 SSH,而且只能使用內部 IP 位址進行存取。

節點儲存體

若要防止儲存,節點應使用 Azure 受控磁碟。 就大部分的 VM 節點大小而言,Azure 受控磁碟是高效能 SSD 所支援的進階磁碟。 儲存於受控磁碟上的資料會自動加密,並在 Azure 平台內待用。 為了改善備援,會在 Azure 資料中心內安全地複寫 Azure 受控磁碟。

惡意多租用戶工作負載

目前,如果惡意使用多租用戶,則 Kubernetes 環境不安全。 適用於節點的額外安全性功能 (例如「Pod 安全性原則」或 Kubernetes RBAC) 會有效率地封鎖惡意探索。 執行惡意多租用戶工作負載時,若要真正確保安全性,應該只信任 Hypervisor。 Kubernetes 的安全性網域會成為整個叢集,而非個別節點。

對於這些類型的惡意多租用戶工作負載,您應使用實際隔離的叢集。 如需如何隔離工作負載的詳細資訊,請參閱 AKS 中叢集隔離的最佳做法

計算隔離

基於合規性或法規需求,某些工作負載可能需要與其他客戶工作負載高度隔離。 針對這些工作負載,Azure 提供隔離 VM 以用作 AKS 叢集中的代理程式節點。 這些 VM 不受特定硬體類型的限制,並且專用於單一客戶。

在建立 AKS 叢集或新增節點集區時,請選取其中一個隔離 VM 大小作為「節點大小」。

叢集升級

Azure 提供升級協調流程工具來升級 AKS 叢集和元件、維護安全性和合規性,以及存取最新功能。 此升級協調流程包含 Kubernetes 主要元件和代理程式元件。

若要啟動升級程序,請指定其中一個列出的可用 Kubernetes 版本。 然後,Azure 會安全地隔離和清空每個 AKS 節點,並升級。

隔離和清空

在升級程序期間,AKS 節點會個別與叢集隔離,防止對其排程新的 Pod。 這些節點接著會清空並升級,如下所示:

  1. 新的節點會部署至節點集區。
    • 此節點會執行最新的 OS 映像和修補程式。
  2. 已識別其中一個現有節點以進行升級。
  3. 已識別節點上的 Pod 會正常終止,並排程於節點集區中的其他節點。
  4. 從 AKS 叢集刪除已清空的節點。
  5. 除非在升級程序期間成功取代所有節點,否則會重複執行步驟 1-4。

如需詳細資訊,請參閱升級 AKS 叢集

網路安全性

針對內部部署網路的連線和安全性,您可以將 AKS 叢集部署到現有的 Azure 虛擬網路子網路中。 這些虛擬網路可能會使用 Azure 站對站 VPN 或 Express Route 連線回您的內部部署網路。 使用私人內部 IP 位址來定義 Kubernetes 輸入控制器,以限制服務對內部網路連線的存取。

Azure 網路安全性群組

為了篩選虛擬網路流量流程,Azure 會使用網路安全性群組規則。 這些規則可定義允許或拒絕存取資源的來源和目的地 IP 範圍、連接埠和通訊協定。 系統會建立預設規則,以允許 Kubernetes API 伺服器的 TLS 流量。 您可以使用負載平衡器、連接埠對應或輸入路由來建立服務。 AKS 會自動針對流量修改網路安全性群組。

如果您為 AKS 叢集提供您自己的子網路 (無論是使用 Azure CNI 還是 Kubenet),則請「不」要修改 AKS 所管理的 NIC 層級網路安全性群組。 您應建立更多子網路層級的網路安全性群組,以修改流量的流程。 請確定這些群組不會干擾到管理叢集所需的流量,例如負載平衡器存取、與控制平面的通訊,以及輸出

Kubernetes 網路原則

為了限制叢集中 Pod 之間的網路流量,AKS 支援 Kubernetes 網路原則。 透過網路原則,您可以根據命名空間和標籤選取器,允許或拒絕叢集內的特定網路路徑。

應用程式安全性

若要保護在 AKS 上執行的 Pod,請利用適用於容器的 Microsoft Defender 來偵測和限制對 Pod 中所執行應用程式的網路攻擊。 執行持續掃描以偵測應用程式弱點狀態的漂移,並實作「藍色/綠色/canary」程序來修補和取代易受攻擊的映像。

Kubernetes 秘密

使用 Kubernetes「祕密」,您可以將敏感性資料插入至 Pod,例如存取認證或金鑰。

  1. 使用 Kubernetes API 來建立祕密。
  2. 定義 Pod 或部署,並要求特定的祕密。
    • 祕密只會提供給已排程 Pod 所需要的祕密節點。
    • 祕密會儲存至 tmpfs,而不會寫入至磁碟。
  3. 當您刪除節點上最後一個需要祕密的 Pod 時,即該節點的 tmpfs 祕密就會被刪除。
    • 祕密儲存在指定的命名空間內,且僅供相同命名空間中的 Pod 存取。

使用祕密可減少 Pod 或服務 YAML 資訊清單中所定義的敏感性資訊。 秘密會以 YAML 資訊清單的形式儲存在 Kubernetes API 伺服器中,供您要求。 此方法僅可供特定 Pod 存取祕密。

注意

原始祕密資訊清單檔案包含 base64 格式的祕密資料 (請參閱官方文件以取得詳細資料)。 請將這些檔案視為敏感性資訊,並且永遠都不要將其認可至原始檔控制。

Kubernetes 祕密會儲存至 etcd,這是分散式的鍵值存放區。 Etcd 存放區完全由 AKS 管理,並在 Azure 平台內將資料待用加密

後續步驟

若要開始保護您的 AKS 叢集,請參閱升級 AKS 叢集

如需相關聯的最佳做法,請參閱 AKS 中叢集安全性和升級的最佳做法以及 AKS 中 Pod 安全性的最佳做法

如需 Kubernetes 及 AKS 核心概念的詳細資訊,請參閱: