为 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 的节点池需要 Kubernetes 1.19 及更高版本。
- 若要更新用于 FIPS 的基础包或模块,必须使用 节点映像升级。
- 尚未评估 FIPS 节点上的容器映像的 FIPS 符合性。
- 装载 CIFS 共享失败,因为 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 节点池
使用带有
--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 的节点池。使用
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
使用
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
使用
kubectl debug
命令在已启用 FIPS 的节点池中的某个节点上以交互会话运行部署。kubectl debug node/aks-fipsnp-12345678-vmss000000 -it --image=mcr.azk8s.cn/dotnet/runtime-deps:6.0
在交互会话输出中,验证是否已启用 FIPS 加密库。 输出应类似于以下示例输出:
root@aks-fipsnp-12345678-vmss000000:/# cat /proc/sys/crypto/fips_enabled 1
已启用 FIPS 的节点池还具有 kubernetes.azure.com/fips_enabled=true 标签,可供部署用来针对这些节点池。
创建已启用 FIPS 的 Windows 节点池
使用带有
--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
使用
az aks show
命令验证节点池是否已启用 FIPS,并在 agentPoolProfiles 中查询 enableFIPS 值。az aks show \ --resource-group myResourceGroup \ --name myAKSCluster \ --query="agentPoolProfiles[].{Name:name enableFips:enableFips}" \ -o table
验证 Windows 节点池能否访问 FIPS 加密库,在已启用 FIPS 的节点池中创建到 Windows 节点的 RDP 连接并检查注册表。
- 在注册表中查找
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\FIPSAlgorithmPolicy
。 - 如果
Enabled
设置为 1,则 FIPS 已启用。
已启用 FIPS 的节点池还具有 kubernetes.azure.com/fips_enabled=true 标签,可供部署用来针对这些节点池。
更新现有节点池以启用或禁用 FIPS
可更新现有 Linux 节点池以启用或禁用 FIPS。 如果计划将节点池从非 FIPS 迁移到 FIPS,请先验证应用程序在测试环境中正常工作,然后再将其迁移到生产环境。 在测试环境中验证应用程序应可防止由于 FIPS 内核阻止某些弱密码或加密算法(例如不符合 FIPS 的 MD4 算法)而导致的问题。
注意
更新现有 Linux 节点池以启用或禁用 FIPS 时,节点池更新将在 FIPS 和非 FIPS 映像之间移动。 此节点池更新将触发重置映像以完成更新。 这可能会导致节点池更新需要几分钟时间才能完成。
先决条件
- Azure CLI 版本 2.64.0 或更高版本。 要查找版本,请运行
az --version
。 如果需要进行安装或升级,请参阅安装 Azure CLI。
在现有节点池上启用 FIPS
可更新现有 Linux 节点池以启用 FIPS。 更新现有节点池时,节点映像将从当前映像更改为同一 OS SKU 的建议 FIPS 映像。
使用带有
--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 的操作系统。 此重置映像发生在节点池更新期间。 无需执行其他步骤。
使用
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
使用
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
使用
kubectl debug
命令在已启用 FIPS 的节点池中的某个节点上以交互会话运行部署。kubectl debug node/aks-np-12345678-vmss000000 -it --image=mcr.azk8s.cn/dotnet/runtime-deps:6.0
在交互会话输出中,验证是否已启用 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 映像。 节点映像更改将在重置映像后发生。
使用带有
--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 的操作系统。 此重置映像发生在节点池更新期间。 无需执行其他步骤。
使用
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) 中的群集安全性和升级的最佳做法。