使用 Azure Kubernetes Service (AKS) 中已授權 IP 位址範圍,安全存取 API 伺服器

本文說明如何使用 API 伺服器已授權的 IP 位址範圍功能,來限制哪些 IP 位址和 CIDR 可以存取控制平面。

Kubernetes API 伺服器是 Kubernetes 控制平面的核心,也是與叢集互動及管理叢集的主要方式。 若要改善叢集的安全性,並將攻擊的風險降到最低,建議您限制可存取 API 伺服器的 IP 位址範圍。 若要這樣做,您可以使用 API 伺服器已授權的 IP 範圍功能。

開始之前

  • 您必須安裝並設定 Azure CLI 版本 2.0.76 或以後版本。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI
  • 若要了解在整合 AKS 叢集與 Azure DevOps 時要包含哪些 IP 位址,請參閱 Azure DevOps 允許的 IP 位址和網域 URL 一文。

限制

API 伺服器已授權的 IP 範圍功能有下列限制:

  • API 伺服器已授權的 IP 範圍功能已於 2019 年 10 月從預覽版中移除。 對於在將功能從預覽版中移除之後所建立的叢集,只有標準 SKU 負載平衡器才支援此功能。 已啟用 API 伺服器已授權的 IP 範圍功能之基本 SKU 負載平衡器上的任何現有叢集將會繼續如原樣運作。 不過,這些叢集無法移轉至標準 SKU 負載平衡器。 如果將 Kubernetes 版本和控制平面升級,現有叢集將會繼續運作。
  • 私人叢集不支援 API 伺服器已授權的 IP 範圍功能。
  • 將此功能與使用節點公用 IP 的叢集搭配使用時,使用節點公用 IP 的節點集區必須使用公用 IP 前置詞。 公用 IP 前置詞必須新增為授權範圍。

API 伺服器已授權 IP 範圍的概觀

Kubernetes API 伺服器會公開基礎 Kubernetes API,並提供與 Kubernetes 儀錶板等 kubectl 管理工具的互動。 AKS 提供具有專用 API 伺服器的單一租使用者叢集控制平面。 根據預設,API 伺服器會指派公用IP位址。 您可以使用 Kubernetes 角色型存取控制 (Kubernetes RBAC) 或 Azure RBAC 來控制存取。

若要保護對其他可公開存取 AKS 控制平面/API 伺服器的存取,您可以啟用及使用已授權 IP 範圍。 這些已授權 IP 範圍僅允許定義的 IP 位址範圍與 API 伺服器通訊。 從不屬於這些授權IP範圍的IP位址對API伺服器發出的任何要求,會遭到封鎖。

透過已啟用的 API 伺服器已授權 IP 範圍,建立 AKS 叢集

重要

根據預設,您的叢集會使用標準 SKU 負載平衡器,以供您用來設定輸出閘道。 當您在叢集建立期間啟用 API 伺服器授權的 IP 範圍時,除了您指定的範圍之外,預設也會允許叢集的公用 IP。 如果您為 指定 「或 沒有值 --api-server-authorized-ip-ranges,則會停用 API 伺服器授權的 IP 範圍。 請注意,如果您使用PowerShell,請使用 --api-server-authorized-ip-ranges="" (具有等號)以避免任何剖析問題。

注意

您應該將這些範圍新增至允許清單:

  • 叢集輸出 IP 位址 (防火牆、NAT 閘道或其他地址,視輸出型別而定)。
  • 任何代表您要從中管理叢集之網路的範圍。

您可以指定的 IP 範圍數目上限為 200。

這些規則最多可能需要兩分鐘來傳播。 測試連線時,請預留最多的時間。

建立已啟用 API 伺服器授權 IP 範圍的叢集時,您可以使用 --api-server-authorized-ip-ranges 參數來提供授權的公用 IP 位址範圍清單。 當您指定 CIDR 範圍時,請從範圍中的第一個 IP 位址開始。 例如,137.117.106.90/29 是有效範圍,但請確定您指定範圍中的第一個 IP 位址,例如 137.117.106.88/29

  • 使用 命令搭配 --api-server-authorized-ip-ranges 參數,建立已啟用 API 伺服器授權 IP 範圍的 az aks create AKS 叢集。 下列範例會在名為 myResourceGroup 的資源群組中建立名為 myAKSCluster 的叢集,並啟用 API 伺服器授權的 IP 範圍。 允許的 IP 位址範圍是 73.140.245.0/24

    az aks create --resource-group myResourceGroup --name myAKSCluster --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --api-server-authorized-ip-ranges 73.140.245.0/24 --generate-ssh-keys
    

指定標準 SKU 負載平衡器的輸出 IP

建立已啟用 API 伺服器授權 IP 範圍的叢集時,您也可以使用 --load-balancer-outbound-ips--load-balancer-outbound-ip-prefixes 參數來指定叢集的輸出 IP 位址或前置詞。 參數中提供的所有IP都會與參數中的 --api-server-authorized-ip-ranges IP一起允許。

  • 建立已啟用 API 伺服器授權 IP 範圍的 AKS 叢集,並使用 --load-balancer-outbound-ips 參數指定標準 SKU 負載平衡器的輸出 IP 位址。 下列範例會在名為 myResourceGroup 的資源群組中建立名為 myAKSCluster 的叢集,並啟用 API 伺服器授權的 IP 範圍,以及輸出 IP 位址<public-ip-id-1><public-ip-id-2>

    az aks create --resource-group myResourceGroup --name myAKSCluster --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --api-server-authorized-ip-ranges 73.140.245.0/24 --load-balancer-outbound-ips <public-ip-id-1>,<public-ip-id-2> --generate-ssh-keys
    

只允許標準 SKU 負載平衡器的輸出公用 IP

當您在叢集建立期間,啟用 API 伺服器的已授權 IP 範圍時,除了您指定的範圍之外,依預設也會允許叢集之標準 SKU 負載平衡器的輸出公用 IP。 若要只允許標準 SKU 負載平衡器的輸出公用 IP,請在指定 --api-server-authorized-ip-ranges 參數時使用 0.0.0.0/32

  • 建立已啟用 API 伺服器授權 IP 範圍的 AKS 叢集,並使用 參數只允許標準 SKU 負載平衡器的 --api-server-authorized-ip-ranges 輸出公用 IP。 下列範例會在已啟用 API 伺服器授權 IP 範圍的資源群組中建立名為 myAKSCluster 的叢集,只允許標準 SKU 負載平衡器的輸出公用 IP:

    az aks create --resource-group myResourceGroup --name myAKSCluster --vm-set-type VirtualMachineScaleSets --load-balancer-sku standard --api-server-authorized-ip-ranges 0.0.0.0/32 --generate-ssh-keys
    

更新現有叢集的 API 伺服器授權 IP 範圍

  • 使用 az aks update 命令搭配 --api-server-authorized-ip-ranges 參數,更新現有叢集的 API 伺服器授權 IP 範圍。 下列範例會在名稱為 myResourceGroup 的資源群組中,在名稱為 myAKSCluster 的叢集上,更新 API 伺服器的已授權 IP 範圍。 要授權的 IP 位址範圍是 73.140.245.0/24

    az aks update --resource-group myResourceGroup --name myAKSCluster --api-server-authorized-ip-ranges 73.140.245.0/24
    

    您也可以在指定 --api-server-authorized-ip-ranges 時,使用 0.0.0.0/32,以便僅允許標準 SKU 負載平衡器的公用 IP。

停用已授權 IP 範圍

  • 使用 az aks update 命令停用授權的IP範圍,並指定 參數的--api-server-authorized-ip-ranges空白範圍""

    az aks update --resource-group myResourceGroup --name myAKSCluster --api-server-authorized-ip-ranges ""
    

尋找現有的已授權 IP 範圍

  • 使用 命令尋找 az aks show 現有的授權 IP 範圍, --query 並將 參數設定為 apiServerAccessProfile.authorizedIpRanges

    az aks show --resource-group myResourceGroup --name myAKSCluster --query apiServerAccessProfile.authorizedIpRanges
    

如何尋找要包含在 --api-server-authorized-ip-ranges 中的 IP?

您必須將開發機器、工具或自動化 IP 位址新增至已核准 IP 範圍的 AKS 叢集清單,才能從該處存取 API 伺服器。

另一個選項是在防火牆虛擬網路中的個別子網路內,使用必要的工具來設定 Jumpbox。 這假設您環境具有的防火牆具有個別網路,而且您已在授權範圍內新增防火牆 IP。 同樣地,如果您已強制從 AKS 子網路通道至防火牆子網路,則叢集子網路中的 Jumpbox 也沒問題。

  1. 使用下列命令擷取您的 IP 位址:

    # Retrieve your IP address
    CURRENT_IP=$(dig +short "myip.opendns.com" "@resolver1.opendns.com")
    
  2. 使用 Azure CLI 或 Azure PowerShell 將 IP 位址新增至核准的列表:

    # Add to AKS approved list using Azure CLI
    az aks update --resource-group $RG --name $AKSNAME --api-server-authorized-ip-ranges $CURRENT_IP/24,73.140.245.0/24
    
    # Add to AKS approved list using Azure PowerShell
    Set-AzAksCluster -ResourceGroupName $RG -Name $AKSNAME -ApiServerAccessAuthorizedIpRange '$CURRENT_IP/24,73.140.245.0/24'
    

注意

上述範例會將另一個 IP 位址新增至核准的範圍。 注意,仍包含 更新叢集 API 伺服器已授權 IP 範圍 的 IP 位址。 如果您不包含現有的 IP 位址,此命令會將其取代為新的 IP 位址,而不是將其新增至授權範圍。 若要停用已授權 IP 範圍,請使用 az aks update,並指定空範圍 ""。

另一個選項是,在 Windows 系統上使用下列命令來取得公用 IPv4 位址,或者您可以遵循尋找 IP 位址中的步驟。

Invoke-RestMethod http://ipinfo.io/json | Select -exp ip

您也可以在網際網路瀏覽器中搜尋「我的 IP 位址是什麼」來尋找此位址。

下一步

在本文中,您已啟用 API 伺服器的已授權 IP 範圍。 此方法是如何安全執行 AKS 叢集的一部分。 如需詳細資訊,請參閱 AKS 中應用程式和叢集的安全性概念,以及 AKS 中叢集安全性和升級的最佳做法