AKS使用基于FQDN的网络策略保护容器安全性
容器化环境面临着独特的安全挑战。 传统的网络安全方法通常依赖于基于 IP 的筛选,但由于 IP 地址频繁变化,这使得使用 IP 地址的安全策略保护 Pod 的方法会变得繁琐、效率低下且非常困难。 FQDN 筛选允许用户使用域名而不是 IP 地址创建 Pod 级别策略,这样就无需在 IP 地址发生变化时更新策略
FQDN 筛选提供了一种高效且用户友好的方法来管理网络策略。 通过基于域名而不是 IP 地址来定义这些策略,用户可以显著简化策略管理流程。 这种方法消除了需要在 IP 地址改变时频繁更新的需求,从而减轻了管理负担并充分降低了配置错误的风险。
那既然基于FQDN的网络策略如此方便,那在实际的使用场景中该如何进行配置呢?大家可以参考如下的方式
启用FQDN过滤
若要启用FQDN过滤,首先需要启用Azure CLI的预览功能,对于没有启用过的小伙伴可以通过如下命令:
az extension add --name aks-preview
对于已经启用过的小伙伴可以使用如下命令进行更新:
az extension update --name aks-preview
启用后,需要AdvancedNetworkingPreview的Feature,可以参考如下命令:
az feature register --namespace
"Microsoft.ContainerService" --name
"AdvancedNetworkingPreview"
在新群集上启用FQDN过滤
如果是一个新的AKS群集,则可以在部署AKS群集的过程中使用--network-dataplane cilium
配置网络策略为cillium,同时指定--enable-acns 来启用FQDN过滤,具体可以参考如下命令:
az aks create --name $CLUSTER_NAME
--resource-group $RESOURCE_GROUP_NAME --location $LOCATION --network-plugin
azure --vnet-subnet-id
/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_1
--pod-subnet-id
/subscriptions/$SUBSCRIPTION/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Network/virtualNetworks/$VNET_NAME/subnets/$SUBNET_NAME_2
--enable-addons monitoring --network-dataplane cilium --enable-acns --enable-private-cluster
--generate-ssh-keys
在现有群集上启用FQDN过滤
同样也可以在现有集群上启用 ACNS,但要实现此功能,集群必须已运行 Cillium 数据平面。如果没有,则需要重新创建集群。若在现有群集上启用,可以使用如下命令:
az aks update --name <cluster name>
--resource-group <resource group name> --enable-acns
配置FQDN过滤限制流量
集群准备就绪后,还需要创建 Cillium 策略,通过Cillium策略,定义允许哪些流量离开 Pod 的规则。在下面的示例策略中,将阻止Pod所有入站和出站流量,然后明确允许流量到 azure.com。除此之外,在实际的场景中,还必须要允许流量到 Kubernetes 集群 DNS 服务器 (kube-dns)
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: outbound-policy
namespace: demo
spec:
endpointSelector:
matchLabels:
demo: "true"
ingress:
-{}
egress:
- toEndpoints:
- matchLabels:
"k8s:io.kubernetes.pod.namespace": kube-system
"k8s:k8s-app": kube-dns
toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
- toFQDNs:
- matchName: www.baidu.com
一旦将此策略部署到我们的集群,我们将看到“demo”命名空间中带有“demo=true”标签的任何 pod 都可以访问 www.baidu.com,但不能访问其他 URL。
测试FQDN过滤
在demo命名空间创建测试Pod,可参考如下命令:
Kubectl run networktest –image=“wbitt/network-multitool” –namespace=“demo”
Pod创建完成后,运行kubectl get po -n demo查看Pod运行状态,可以看到Pod已经成功运行:
查看当前Pod的Labels,可以看到,当前Pod没有配置“demo=true”的标签,所以Pod可以访问任何地址:
kubectl get po -n demo --show-labels
运行如下命令,进入Pod,然后使用curl访问portal.azure.com,可以看到能够访问成功:
kubectl exec -it networktest -n demo --
/bin/sh
退出当前容器,然后对容器应用“demo=true”的标签:
标签配置好后,在此进入容器,使用curl访问portal.azure.com,可以看到无法访问:
此时,尝试使用curl命令访问www.baidu.com,可以成功访问: