使用 Azure Kubernetes 服务 (AKS) 中的已授权 IP 地址范围保护对 API 服务器的访问

Kubernetes API 服务器是 Kubernetes 控制平面的核心,也是与群集交互和管理群集的最重要方式。 为了提高群集的安全性并最大程度地降低攻击风险,我们建议限制可以访问 API 服务器的 IP 地址范围。 为此,可以使用 API 服务器已授权 IP 范围功能。

本文介绍如何使用 API 服务器已授权 IP 地址范围功能来限制哪些 IP 地址和 CIDR 可以访问控制平面。

开始之前

  • 需要安装并配置 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 服务器发出的请求被阻止。 请继续使用 Kubernetes RBAC 或 Azure RBAC 来授权用户及其请求的操作。

有关 API 服务器和其他群集组件的详细信息,请参阅 AKS 的 Kubernetes 核心概念

创建启用 API 服务器已授权 IP 范围的 AKS 群集

使用 az aks create 创建群集,并指定 --api-server-authorized-ip-ranges 参数以提供已授权公共 IP 地址范围的列表。 指定 CIDR 范围时,请先指定该范围内的第一个 IP 地址。 例如,137.117.106.90/29 是有效范围,但请确保指定该范围内的第一个 IP 地址,如 137.117.106.88/29

重要

群集默认使用可用于配置出站网关的标准 SKU 负载均衡器。 在创建群集期间启用 API 服务器已授权 IP 范围时,除了允许指定的范围以外,默认还允许群集的公共 IP。 对于 ,如果指定 "" 或不指定任何值,API 服务器授权的 IP 范围被禁用。 请注意,如果使用的是 PowerShell,请使用 --api-server-authorized-ip-ranges=""(带等于号)来避免任何解析问题。

以下示例在名为 myResourceGroup 的资源组中,创建名为 myAKSCluster、已启用 API 服务器已授权 IP 范围的单节点群集。 允许的 IP 地址范围为 73.140.245.0/24

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

注意

应将以下范围添加到允许列表:

  • 群集出口 IP 地址 (防火墙、NAT 网关或其他地址,具体取决于出站类型)。
  • 代表你要从中管理群集的网络的任何范围

可指定的 IP 范围数的上限为 200。

规则最多可能需要两分钟才生效。 在测试连接时,请等待相应时长的时间。

指定标准 SKU 负载均衡器的出站 IP

创建 AKS 群集时,如果为群集指定出站 IP 地址或前缀,则也会允许这些地址或前缀。 例如:

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

在上面的示例中,允许参数 --load-balancer-outbound-ip-prefixes 中提供的所有 IP 以及 --api-server-authorized-ip-ranges 参数中的 IP。

相反,可以指定 --load-balancer-outbound-ip-prefixes 参数以允许出站负载均衡器 IP 前缀。

仅允许标准 SKU 负载均衡器的出站公共 IP

在创建群集期间启用 API 服务器已授权 IP 范围时,除了允许指定的范围以外,默认还允许群集的标准 SKU 负载均衡器的出站公共 IP。 若要仅允许标准 SKU 负载均衡器的出站公共 IP,请在指定 参数时使用 0.0.0.0/32。

在以下示例中,仅允许标准 SKU 负载均衡器的出站公共 IP,你只能从群集中的节点访问 API 服务器。

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

更新群集的 API 服务器已授权 IP 范围

若要更新现有群集上的 API 服务器授权的 IP 范围,请使用 az aks update命令并使用 --api-server-authorized-ip-ranges--load-balancer-outbound-ip-prefixes--load-balancer-outbound-ips--load-balancer-outbound-ip-prefixes 参数。

以下示例更新名为 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

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

禁用已授权 IP 范围

若要禁用 API 服务器已授权 IP 范围,请使用 az aks update 并指定一个空范围。 例如:

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

重要

使用来自本地计算机的 PowerShell 运行此命令时,--api-server-authorized-ip-rangers 参数的双引号字符串值必须用单引号括起来。 否则,将返回一条错误消息,指示缺少预期的参数。

查找现有的已授权 IP 范围

若要查找已经过授权的 IP 范围,请使用 az aks show,并指定群集的名称和资源组。 例如:

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

使用 Azure 门户来更新、禁用和查找已授权 IP 范围

还可以在 Azure 门户中执行上述添加、更新、查找和禁用已授权 IP 范围的操作。 若要访问,请在群集资源的菜单边栏选项卡中导航到“设置”下的“网络” 。

In a browser, shows the cluster resource's networking settings Azure portal page. The options 'set specified IP range' and 'Specified IP ranges' are highlighted.

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

必须将开发计算机、工具或自动化 IP 地址添加到 AKS 群集的已批准 IP 范围列表,以便从该处访问 API 服务器。

另一种做法是在防火墙虚拟网络中的单独子网内,使用所需的工具配置 Jumpbox。 这假设环境有具有相应网络的防火墙,并且你已将防火墙 IP 添加到授权的范围。 同样,如果已强制建立从 AKS 子网到防火墙子网的隧道,那么也可以在群集子网中设置 jumpbox。

用以下命令将其他 IP 地址添加到已批准的范围。

# Retrieve your IP address
CURRENT_IP=$(dig +short "myip.opendns.com" "@resolver1.opendns.com")
# Add to AKS approved list
az aks update -g $RG -n $AKSNAME --api-server-authorized-ip-ranges $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 中群集安全性和升级的最佳做法