为 Azure Kubernetes 服务 (AKS) 节点池启用美国联邦信息处理标准 (FIPS)

美国联邦信息处理标准 (FIPS) 140-2 是美国政府标准,用于定义信息技术产品和系统中加密模块的最低安全要求。 Azure Kubernetes 服务 (AKS) 允许你创建启用了 FIPS 140-2 的 Linux 和 Windows 节点池。 在已启用 FIPS 的节点池上运行的部署可以使用这些加密模块来增加安全性,并帮助满足 FedRAMP 合规性中的安全控制要求。 有关 FIPS 140-2 的详细信息,请参阅美国联邦信息处理标准 (FIPS) 140

先决条件

  • 安装并配置了 Azure CLI 2.32.0 或更高版本。 要查找版本,请运行 az --version。 若要详细了解如何安装或升级 Azure CLI,请参阅安装 Azure CLI

注意

从代理版本 3.1.17 (Linux)和 Win-3.1.17 (Windows) 开始,AKS 监视加载项通过 Ubuntu、Azure Linux 和 Windows 支持启用了 FIPS 的节点池。

限制

  • 已启用 FIPS 的节点池具有下列限制:

重要

已启用 FIPS 的 Linux 映像与用于基于 Linux 的节点池的默认 Linux 映像不同。

已启用 FIPS 的节点映像的版本号(如内核版本)可能不同于未启用 FIPS 的映像。 已启用 FIPS 的节点池和节点映像的更新周期可能与未启用 FIPS 的节点池和映像不同。

支持的 OS 版本

可以在所有受支持的 OS 类型、Linux 和 Windows 上创建已启用 FIPS 的节点池。 但并非所有 OS 版本都支持已启用 FIPS 的节点池。 发布新的 OS 版本后,通常需要经过一段等待期才能符合 FIPS 要求。

下表包含支持的 OS 版本:

OS 类型 OS SKU FIPS 符合性
Linux Ubuntu 支持
Linux Azure Linux 支持
Windows Windows Server 2019 支持
Windows Windows Server 2022 支持

请求启用 FIPS 的 Ubuntu 时,如果默认 Ubuntu 版本不支持 FIPS,AKS 将默认使用 Ubuntu 的最新 FIPS 支持版本。 例如,Linux 节点池默认使用 Ubuntu 22.04。 由于 22.04 目前不支持 FIPS,因此 AKS 默认对 Linux 已启用 FIPS 的节点池使用 Ubuntu 20.04。

注意

以前,可以使用 GetOSOptions API 来确定给定的 OS 是否支持 FIPS。 GetOSOptions API 现已弃用,从 2024-05-01 开始,新的 AKS API 版本将不再包含它。

创建已启用 FIPS 的 Linux 节点池

  1. 使用带有 --enable-fips-image 参数的 az aks nodepool add 命令创建启用 FIPS 的 Linux 节点池。

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name fipsnp \
        --enable-fips-image
    

    注意

    创建群集时,还可以使用 --enable-fips-image 参数和 az aks create 命令,以启用默认节点池上的 FIPS。 向以此方式创建的群集添加节点池时,仍必须使用 --enable-fips-image 参数,以创建已启用 FIPS 的节点池。

  2. 使用 az aks show 命令验证节点池是否已启用 FIPS,并在 agentPoolProfiles 中查询 enableFIPS 值。

    az aks show \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --query="agentPoolProfiles[].{Name:name enableFips:enableFips}" \
        -o table
    

    以下示例输出表明 fipsnp 节点池已启用 FIPS:

    Name       enableFips
    ---------  ------------
    fipsnp     True
    nodepool1  False  
    
  3. 使用 kubectl get nodes 命令列出节点。

    kubectl get nodes
    

    以下示例输出显示了群集中节点的列表。 以 aks-fipsnp 开头的节点属于已启用 FIPS 的节点池。

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-fipsnp-12345678-vmss000000      Ready    agent   6m4s    v1.19.9
    aks-fipsnp-12345678-vmss000001      Ready    agent   5m21s   v1.19.9
    aks-fipsnp-12345678-vmss000002      Ready    agent   6m8s    v1.19.9
    aks-nodepool1-12345678-vmss000000   Ready    agent   34m     v1.19.9
    
  4. 使用 kubectl debug 命令在已启用 FIPS 的节点池中的某个节点上以交互会话运行部署。

    kubectl debug node/aks-fipsnp-12345678-vmss000000 -it --image=mcr.azk8s.cn/dotnet/runtime-deps:6.0
    
  5. 在交互会话输出中,验证是否已启用 FIPS 加密库。 输出应类似于以下示例输出:

    root@aks-fipsnp-12345678-vmss000000:/# cat /proc/sys/crypto/fips_enabled
    1
    

已启用 FIPS 的节点池还具有 kubernetes.azure.com/fips_enabled=true 标签,可供部署用来针对这些节点池。

创建已启用 FIPS 的 Windows 节点池

  1. 使用带有 --enable-fips-image 参数的 az aks nodepool add 命令创建启用 FIPS 的 Windows 节点池。 与基于 Linux 的节点池不同,Windows 节点池共享相同的映像集。

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name fipsnp \
        --enable-fips-image \
        --os-type Windows
    
  2. 使用 az aks show 命令验证节点池是否已启用 FIPS,并在 agentPoolProfiles 中查询 enableFIPS 值。

    az aks show \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --query="agentPoolProfiles[].{Name:name enableFips:enableFips}" \
        -o table
    
  3. 验证 Windows 节点池能否访问 FIPS 加密库,在已启用 FIPS 的节点池中创建到 Windows 节点的 RDP 连接并检查注册表。

  1. 在注册表中查找 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy
  2. 如果 Enabled 设置为 1,则 FIPS 已启用。

屏幕截图显示了 FIPS 算法策略的注册表编辑器的图片,该编辑器正在启用。

已启用 FIPS 的节点池还具有 kubernetes.azure.com/fips_enabled=true 标签,可供部署用来针对这些节点池。

更新现有节点池以启用或禁用 FIPS(预览)

可更新现有节点池以启用或禁用 FIPS。 如果计划将节点池从非 FIPS 迁移到 FIPS,请先验证应用程序在测试环境中正常工作,然后再将其迁移到生产环境。 在测试环境中验证应用程序应可防止由于 FIPS 内核阻止某些弱密码或加密算法(例如不符合 FIPS 的 MD4 算法)而导致的问题。

注意

更新现有 Linux 节点池以启用或禁用 FIPS 时,节点池更新将在 FIPS 和非 FIPS 映像之间移动。 此节点池更新将触发重置映像以完成更新。 这可能会导致节点池更新需要几分钟时间才能完成。

先决条件

  • Azure CLI 版本 2.56.0 或更高版本,以及已安装和配置的 aks-preview 扩展。 要查找版本,请运行 az --version。 如果需要进行安装或升级,请参阅安装 Azure CLI

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

安装 aks-preview Azure CLI 扩展

  • 使用 [az extension add][az-extension-add] 或 [az extension update][az-extension-update] 命令注册或更新 aks-preview 扩展。

    # Register the aks-preview extension
    az extension add --name aks-preview
    
    # Update the aks-preview extension
    az extension update --name aks-preview
    

注册 MutableFipsPreview 功能标志

  1. 使用 [az feature register][az-feature-register] 命令注册 MutableFipsPreview 功能标志。

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

    状态显示为“已注册”需要几分钟时间

  2. 使用 [az feature show][az-feature-show] 命令验证注册状态。

    az feature show --namespace "Microsoft.ContainerService" --name "MutableFipsPreview"
    
  3. 当状态反映为“已注册”时,请使用 [az provider register][az-provider-register] 命令刷新 Microsoft.ContainerService 资源提供程序的注册

    az provider register --namespace Microsoft.ContainerService
    

在现有节点池上启用 FIPS

可更新现有节点池以启用 FIPS。 更新现有节点池时,节点映像将从当前映像更改为同一 OS SKU 的建议 FIPS 映像。

  1. 使用带有 --enable-fips-image 参数的 [az aks nodepool update][az-aks-nodepool-update] 命令更新节点池。

    az aks nodepool update \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name np \
        --enable-fips-image
    

上述命令立即触发节点池的重置映像,以部署符合 FIPS 的操作系统。 此重置映像发生在节点池更新期间。 无需执行其他步骤。

  1. 使用 az aks show 命令验证节点池已启用 FIPS,并在 agentPoolProfiles 中查询 enableFIPS 值

    az aks show \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --query="agentPoolProfiles[].{Name:name enableFips:enableFips}" \
        -o table
    

    以下示例输出表明 np 节点池已启用 FIPS

    Name       enableFips
    ---------  ------------
    np         True
    nodepool1  False  
    
  2. 使用 kubectl get nodes 命令列出节点。

    kubectl get nodes
    

    以下示例输出显示了群集中节点的列表。 以 aks-np 开头的节点属于已启用 FIPS 的节点池。

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-np-12345678-vmss000000          Ready    agent   6m4s    v1.19.9
    aks-np-12345678-vmss000001          Ready    agent   5m21s   v1.19.9
    aks-np-12345678-vmss000002          Ready    agent   6m8s    v1.19.9
    aks-nodepool1-12345678-vmss000000   Ready    agent   34m     v1.19.9
    
  3. 使用 kubectl debug 命令在已启用 FIPS 的节点池中的某个节点上以交互会话运行部署。

    kubectl debug node/aks-np-12345678-vmss000000 -it --image=mcr.azk8s.cn/dotnet/runtime-deps:6.0
    
  4. 在交互会话输出中,验证是否已启用 FIPS 加密库。 输出应类似于以下示例输出:

    root@aks-np-12345678-vmss000000:/# cat /proc/sys/crypto/fips_enabled
    1
    

已启用 FIPS 的节点池还具有 kubernetes.azure.com/fips_enabled=true 标签,可供部署用来针对这些节点池。

在现有节点池上禁用 FIPS

可更新现有 Linux 节点池以禁用 FIPS。 更新现有节点池时,节点映像将从当前 FIPS 映像更改为同一 OS SKU 的建议非 FIPS 映像。 节点映像更改将在重置映像后发生。

  1. 使用带有 --disable-fips-image 参数的 [az aks nodepool update][az-aks-nodepool-update] 命令更新 Linux 节点池。

    az aks nodepool update \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name np \
        --disable-fips-image
    

上述命令立即触发节点池的重置映像,以部署符合 FIPS 的操作系统。 此重置映像发生在节点池更新期间。 无需执行其他步骤。

  1. 使用 az aks show 命令验证节点池未启用 FIPS,并在 agentPoolProfiles 中查询 enableFIPS 值

    az aks show \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --query="agentPoolProfiles[].{Name:name enableFips:enableFips}" \
        -o table
    

    以下示例输出表明 np 节点池未启用 FIPS

    Name       enableFips
    ---------  ------------
    np         False
    nodepool1  False  
    

后续步骤

若要详细了解 AKS 安全性,请参阅有关 Azure Kubernetes 服务 (AKS) 中的群集安全性和升级的最佳做法