使用 Azure Kubernetes 服务 (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

  • 使用具有 --api-server-authorized-ip-ranges 参数的 az aks create 命令创建启用了 API 服务器授权 IP 范围的 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 一起使用。

  • 使用 --load-balancer-outbound-ips 参数创建启用了 API 服务器授权 IP 范围的 AKS 群集,并为标准 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 群集,并使用 --api-server-authorized-ip-ranges 参数以仅允许标准 SKU 负载均衡器的出站公共 IP。 以下示例在名为 myResourceGroup 的资源组中创建一个名为 myAKSCluster 的群集,并启用了 API 服务器授权 IP 范围且仅允许标准 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 范围

  • 使用具有 --api-server-authorized-ip-ranges 参数的 az aks update 命令更新现有群集的 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
    

    在指定 参数以仅允许标准 SKU 负载平衡器的公共 IP 时,也可以使用 0.0.0.0/32。

禁用已授权 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 地址添加到 AKS 群集的已批准 IP 范围列表,以便从该处访问 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

也可以通过在 Internet 浏览器中搜索我的 IP 地址是什么来找到此地址。

后续步骤

在本文中,你启用了 API 服务器已授权 IP 范围。 这是安全运行 AKS 群集的方法之一。 有关详细信息,请参阅 AKS 中应用程序和群集的 安全性概念以及有关 AKS 中群集安全性和升级的最佳做法