使用 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 並提供管理工具的互動,例如 kubectl 和 Kubernetes 儀表板。 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

  • 使用 az aks create 命令與 --api-server-authorized-ip-ranges 參數,透過已啟用的 API 伺服器已授權 IP 範圍,建立 AKS 叢集。 下列範例會透過已啟用的 API 伺服器已授權 IP 範圍,在名稱為 myResourceGroup 的資源群組中,建立名稱為 myAKSCluster 的叢集。 允許的 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 位址。 下列範例會透過已啟用的 API 伺服器已授權 IP 範圍以及輸出 IP 位址 <public-ip-id-1><public-ip-id-2>,在名稱為 myResourceGroup 的資源群組中,建立名稱為 myAKSCluster 的叢集:

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

    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
    
  • 若要允許多個 IP 位址範圍,您可以列出數個 IP 位址,並以逗號分隔。

    az aks update --resource-group myResourceGroup --name myAKSCluster --api-server-authorized-ip-ranges 73.140.245.0/24,193.168.1.0/24,194.168.1.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 命令並將 --query 參數設定為 apiServerAccessProfile.authorizedIpRanges,尋找現有的已授權 IP 範圍。

    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 範圍使用服務標籤 - (預覽)

服務標籤是指定對應至 Kubernetes Service 之 IP 位址群組的便利方式。 您可以使用服務標籤,以逗號分隔 Kubernetes 服務和 API 伺服器授權 IP 範圍中的特定 IP 位址。

限制

  • 此功能與 API Server VNet 整合不相容

重要

AKS 預覽功能可透過自助服務,以加入方式使用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

安裝 Azure CLI 預覽延伸模組

  1. 使用 [az extension add][az-extension-add] 命令來安裝 Azure CLI 預覽延伸模組。

    az extension add --name aks-preview
    
  2. 更新擴充功能,以確定您有最新版本,請使用 [az extension update][az-extension-update] 命令。

    az extension update --name aks-preview
    

註冊服務標籤授權的IP功能旗標

  1. 使用 [az feature register][az-feature-register] 命令註冊 EnableServiceTagAuthorizedIPPreview 功能旗標。

    az feature register --namespace "Microsoft.ContainerService" --name "EnableServiceTagAuthorizedIPPreview"
    

    需要幾分鐘的時間才能完成註冊。

  2. 使用 [az feature show][az-feature-show] 命令來確認註冊。

    az feature show --namespace "Microsoft.ContainerService" --name "EnableServiceTagAuthorizedIPPreview"
    

建立具有服務標籤授權IP範圍的AKS叢集

使用 --api-server-authorized-ip-ranges 參數搭配服務標籤來建立具有服務標籤 AzureCloud 授權IP範圍的叢集,以允許所有 Azure 服務存取 API 伺服器,並指定額外的IP位址。

注意

參數中 --api-server-authorized-ip-ranges 只允許一個服務標籤。 您無法指定多個服務標籤。

az aks create --resource-group myResourceGroup \
  --name myAKSCluster \
  --api-server-authorized-ip-ranges AzureCloud,20.20.20.20

您應該能夠從屬於服務標籤的 AzureCloud Azure VM 或 Azure 服務來捲曲 API 伺服器。

下一步

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