共用方式為


在進階容器網路服務中設定容器網路安全性的 FQDN 篩選功能

本文說明如何在 AKS 叢集中設定具有容器網路安全性功能的進階容器網路服務。

必要條件

  • 具有有效訂用帳戶的 Azure 帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

本文步驟所需的 Azure CLI 最低版本為 2.71.0。 執行 az --version 以尋找版本。 如果您需要安裝或升級,請參閱安裝 Azure CLI

局限性:

  • 部分支援通配符 FQDN 原則。 這表示您可以建立符合特定模式與前置通配符的原則(例如 .example.com),但您無法使用通用通配符 () 來比對字段上的所有網域 spec.egress.toPorts.rules.dns.matchPattern
  • 支援的模式:

    *.example.com - 這可讓流量流向 example.com 下的所有子域。

    app*.example.com - 此規則更具體,而且只允許流量流向以 「app」 開頭的子域,example.com

  • 不支援的模式

    * 此嘗試會比對不受支援的任何網域名稱。

  • 節點本機 DNS 目前不支援 FQDN 篩選。
  • 不支援 Kubernetes 服務名稱。
  • 不支援其他 L7 原則。
  • 處理每秒超過 1,000 個要求時,FQDN Pod 可能會表現出效能降低。
  • 如果停用進階容器網路服務(ACNS)安全性,則會封鎖 FQDN 和 L7 原則(HTTP、HTTPS、Kafka 和 gRPC)。
  • 使用 Cilium 網路原則時,Alpine 型容器映射可能會遇到 DNS 解析問題。 這是因為 musl libc 的搜尋網域反覆運算有限。 若要解決此問題,請使用通配符模式明確定義網路原則 DNS 規則中的所有搜尋網域,如下列範例
rules:
  dns:
  - matchPattern: "*.example.com"
  - matchPattern: "*.example.com.*.*"
  - matchPattern: "*.example.com.*.*.*"
  - matchPattern: "*.example.com.*.*.*.*"
  - matchPattern: "*.example.com.*.*.*.*.*"
- toFQDNs:
  - matchPattern: "*.example.com"

啟用進階容器網路服務

若要繼續,您必須已啟用進階容器網路服務的 AKS 叢集

具有 az aks create 進階容器網路服務旗標的 --enable-acns命令會建立具有所有進階容器網路服務功能的新 AKS 叢集。 這些功能包括:

  • 容器網路可檢視性: 提供網路流量的深入解析。 若要深入瞭解,請造訪 容器網路可觀察性

  • 容器網路安全性: 提供完整功能變數名稱 (FQDN) 篩選等安全性功能。 若要深入瞭解,請造訪 容器網路安全性

# Set an environment variable for the AKS cluster name. Make sure to replace the placeholder with your own value.
export CLUSTER_NAME="<aks-cluster-name>"

# Create an AKS cluster
az aks create \
    --name $CLUSTER_NAME \
    --resource-group $RESOURCE_GROUP \
    --generate-ssh-keys \
    --location eastus \
    --network-plugin azure \
    --network-dataplane cilium \
    --node-count 2 \
    --enable-acns

在現有叢集上啟用進階容器網路服務

具有az aks update進階容器網路服務旗標的--enable-acns命令會使用所有進階容器網路服務功能來更新現有的 AKS 叢集,包括容器網路可檢視性和容器網路安全性功能

注意

只有具有 Cilium 數據平面的叢集支援進階容器網路服務的容器網路安全性功能。

az aks update \
    --resource-group $RESOURCE_GROUP \
    --name $CLUSTER_NAME \
    --enable-acns

取得叢集認證

使用 az aks get-credentials 命令來取得叢集認證。

az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

使用原則測試連線能力

本節示範如何觀察透過 Cilium 代理程式強制執行的原則。 DNS 要求會傳送給允許的 FQDN,以及封鎖它的另一個案例。

建立名為 demo-policy.yaml 的檔案,並貼上下列 YAML 資訊清單:

注意

在原則中使用 FQDN 時,spec.egress.toPorts.rules.dns.matchPattern欄位是必要的。 本節會指示 Cilium 檢查 DNS 查詢,並將其與指定的模式比對。 如果沒有本節,Cilium 只會允許 DNS 流量,而不會檢查其內容,以瞭解哪些 IP 與 FQDN 相關聯。 因此,連接到那些 IP地址(即非DNS流量)會遭到封鎖,因為 Cilium 無法將它們與允許的網域產生關聯。

請務必先檢查 限制 區段。

apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "allow-bing-fqdn"
spec:
  endpointSelector:
    matchLabels:
      app: demo-container
  egress:
    - toEndpoints:
      - matchLabels:
          "k8s:io.kubernetes.pod.namespace": kube-system
          "k8s:k8s-app": kube-dns
      toPorts:
        - ports:
           - port: "53"
             protocol: ANY
          rules:
            dns:
              - matchPattern: "*.bing.com"
    - toFQDNs:
      - matchPattern: "*.bing.com"

指定 YAML 指令清單的名稱,並使用 [kubectl apply][kubectl-apply]加以套用:

kubectl create ns demo
kubectl apply -f demo-policy.yaml -n demo

建立示範 Pod

建立執行 Bash 的 client Pod:

kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.43 --labels="app=demo-container" --command -- bash

具有測試 FQDN 之公用程式殼層應該會以下列輸出開啟:

If you don't see a command prompt, try pressing enter.
bash-5.0#

在不同的視窗中,執行下列命令以取得執行中 Pod 的節點。

kubectl get po -n demo --sort-by="{spec.nodeName}" -o wide

輸出應類似下列範例:

NAME     READY   STATUS    RESTARTS   AGE     IP              NODE                                NOMINATED NODE   READINESS GATES
client   1/1     Running   0          5m50s   192.168.0.139   aks-nodepool1-22058664-vmss000001   <none>           <none>

Pod 正在名為 aks-nodepool1-22058664-vmss000001的節點上執行。 取得在該節點上執行的 Cilium 代理程式實例:

kubectl get po -n kube-system -o wide --field-selector spec.nodeName="aks-nodepool1-22058664-vmss000001" | grep "cilium"

預期的 cilium-s4x24 應該在輸出中。

cilium-s4x24                          1/1     Running   0          47m   10.224.0.4      aks-nodepool1-22058664-vmss000001   <none>           <none>

檢查 Cilium 代理程式

cilium使用 CLI 來監視遭到封鎖的流量。

kubectl exec -it -n kube-system cilium-s4x24 -- sh
Defaulted container "cilium-agent" out of: cilium-agent, install-cni-binaries (init), mount-cgroup (init), apply-sysctl-overwrites (init), mount-bpf-fs (init), clean-cilium-state (init), block-wireserver (init)
#

在這裡殼層內執行 : cilium monitor -t drop

Listening for events on 2 CPUs with 64x4096 of shared memory
Press Ctrl-C to quit
time="2024-10-08T17:48:27Z" level=info msg="Initializing dissection cache..." subsys=monitor

驗證原則

從第一個殼層中,建立允許 FQDN 的要求, *.bing.com如原則所指定。 此請求應該會成功並獲得代理人的允許。

./agnhost connect www.bing.com:80

然後,對預期遭到封鎖的 FQDN 建立另一個要求:

./agnhost connect www.example.com:80

Cilium 代理程式封鎖了輸出的要求:

xx drop (Policy denied) flow 0xfddd76f6 to endpoint 0, ifindex 29, file bpf_lxc.c:1274, , identity 48447->world: 192.168.0.149:45830 -> 93.184.215.14:80 tcp SYN

清除資源

如果您不打算使用此應用程式,請使用 az group delete 命令刪除您在本文所建立的其他資源。

  az group delete --name $RESOURCE_GROUP

下一步

在本操作說明文章中,您已瞭解如何使用適用於 AKS 叢集的進階容器網路服務來安裝和啟用安全性功能。