AKS使用基于FQDN的网络策略保护容器安全性

容器化环境面临着独特的安全挑战。 传统的网络安全方法通常依赖于基于 IP 的筛选,但由于 IP 地址频繁变化,这使得使用 IP 地址的安全策略保护 Pod 的方法会变得繁琐、效率低下且非常困难。 FQDN 筛选允许用户使用域名而不是 IP 地址创建 Pod 级别策略,这样就无需在 IP 地址发生变化时更新策略

AKS使用基于FQDN的网络策略保护容器安全性_Cilium

FQDN 筛选提供了一种高效且用户友好的方法来管理网络策略。 通过基于域名而不是 IP 地址来定义这些策略,用户可以显著简化策略管理流程。 这种方法消除了需要在 IP 地址改变时频繁更新的需求,从而减轻了管理负担并充分降低了配置错误的风险。

那既然基于FQDN的网络策略如此方便,那在实际的使用场景中该如何进行配置呢?大家可以参考如下的方式


启用FQDN过滤

若要启用FQDN过滤,首先需要启用Azure CLI的预览功能,对于没有启用过的小伙伴可以通过如下命令:

az extension add --name aks-preview

AKS使用基于FQDN的网络策略保护容器安全性_Azure AKS_02

对于已经启用过的小伙伴可以使用如下命令进行更新:

az extension update --name aks-preview

AKS使用基于FQDN的网络策略保护容器安全性_安全_03

启用后,需要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

AKS使用基于FQDN的网络策略保护容器安全性_K8S_04


在现有群集上启用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

AKS使用基于FQDN的网络策略保护容器安全性_K8S_05

一旦将此策略部署到我们的集群,我们将看到“demo”命名空间中带有“demo=true”标签的任何 pod 都可以访问 www.baidu.com,但不能访问其他 URL。

 

测试FQDN过滤

在demo命名空间创建测试Pod,可参考如下命令:

Kubectl run networktest –image=“wbitt/network-multitool” –namespace=“demo”

AKS使用基于FQDN的网络策略保护容器安全性_Azure AKS_06

Pod创建完成后,运行kubectl get po -n demo查看Pod运行状态,可以看到Pod已经成功运行:

AKS使用基于FQDN的网络策略保护容器安全性_Azure AKS_07

查看当前Pod的Labels,可以看到,当前Pod没有配置“demo=true”的标签,所以Pod可以访问任何地址:

kubectl get po -n demo --show-labels

AKS使用基于FQDN的网络策略保护容器安全性_Azure AKS_08

运行如下命令,进入Pod,然后使用curl访问portal.azure.com,可以看到能够访问成功:

kubectl exec -it networktest -n demo --
/bin/sh

AKS使用基于FQDN的网络策略保护容器安全性_Azure AKS_09

退出当前容器,然后对容器应用“demo=true”的标签:

AKS使用基于FQDN的网络策略保护容器安全性_K8S_10

标签配置好后,在此进入容器,使用curl访问portal.azure.com,可以看到无法访问:

 

AKS使用基于FQDN的网络策略保护容器安全性_网络策略_11

此时,尝试使用curl命令访问www.baidu.com,可以成功访问:

AKS使用基于FQDN的网络策略保护容器安全性_网络策略_12