全部產品
Search
文件中心

Alibaba Cloud Service Mesh:為應用配置授權策略

更新時間:Jul 18, 2025

為ASM開啟Ambient模式後,您可以使用4層或7層授權策略保護應用程式訪問,並根據工作負載的ServiceAccount對流量實施存取控制。本文介紹如何為Bookinfo應用配置4層和7層授權策略。

前提條件

已完成部署應用程式範例並開啟ambient實現加密通訊中的全部操作。

準備工作

開始本文的配置前,您需要在叢集中部署Sleep應用作為另一個用戶端。

kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: sleep
---
apiVersion: v1
kind: Service
metadata:
  name: sleep
  labels:
    app: sleep
    service: sleep
spec:
  ports:
  - port: 80
    name: http
  selector:
    app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sleep
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sleep
  template:
    metadata:
      labels:
        app: sleep
    spec:
      terminationGracePeriodSeconds: 0
      serviceAccountName: sleep
      containers:
      - name: sleep
        image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
        command: ["/bin/sleep", "infinity"]
        imagePullPolicy: IfNotPresent
        volumeMounts:
        - mountPath: /etc/sleep/tls
          name: secret-volume
      volumes:
      - name: secret-volume
        secret:
          secretName: sleep-secret
          optional: true
EOF

配置4層授權策略

4層代理稱為Ztunnel,使用Rust語言開發,旨在處理3層和4層流量,比如mTLS、身分識別驗證、4層鑒權和可觀測。它以Daemonset的形式部署,同一節點上的Pod共用一個Ztunnel,所有進出這些Pod的流量都會被Ztunnel處理。

  1. 為帶有app: productpage標籤的Pod建立授權策略,僅允許來自istio-ingressgateway ServiceAccount的用戶端訪問productpage服務。

    kubectl apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: productpage-ztunnel
      namespace: default
    spec:
      selector:
        matchLabels:
          app: productpage
      action: ALLOW
      rules:
      - from:
        - source:
            principals:
            - cluster.local/ns/istio-system/sa/istio-ingressgateway
    EOF
  2. 在瀏覽器中訪問http://{入口網關的IP地址}/productpage查看Bookinfo應用,可以看到流量正常。

  3. 通過sleep應用訪問Bookinfo應用。

    kubectl exec deployment/sleep -- curl -s "http://productpage:9080/productpage" -I

    預期輸出:

    command terminated with exit code 56

    可以看到訪問被拒絕。由於Ztunnel的授權策略工作在4層,所以您並不會看到被拒絕的HTTP狀態代碼。

配置7層授權策略

配置7層授權策略需要部署一個Waypoint代理,然後為命名空間配置istio.io/use-waypoint=waypoint標籤,使命名空間內所有Service的流量都必須通過Waypoint。

  1. 部署Waypoint。

    kubectl apply -f - <<EOF
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: waypoint
    spec:
      gatewayClassName: istio-waypoint
      listeners:
      - name: mesh
        port: 15008
        protocol: HBONE
    EOF
  2. 查看Waypoint代理的狀態,直到PROGRAMMEDTrue

    kubectl get gtw

    預期輸出:

    NAME       CLASS            ADDRESS        PROGRAMMED   AGE
    waypoint   istio-waypoint   172.16.99.15   True         2m29s
  3. 為命名空間添加標籤。

    kubectl label namespace default istio.io/use-waypoint=waypoint --overwrite
  4. 配置授權策略,明確允許sleep應用只能通過GET方法訪問productpage應用。

    1. 建立7層授權策略。

      kubectl apply -f - <<EOF
      apiVersion: security.istio.io/v1
      kind: AuthorizationPolicy
      metadata:
        name: productpage-waypoint
        namespace: default
      spec:
        targetRefs:
        - kind: Service
          group: ""
          name: productpage
        action: ALLOW
        rules:
        - from:
          - source:
              principals:
              - cluster.local/ns/default/sa/sleep
          to:
          - operation:
              methods: ["GET"]
      EOF
      說明

      7層授權策略不再使用標籤來選擇生效的服務,而是通過targetRefs來表示在Waypoint上對哪個服務執行當前策略。規則的前半部分和Ztunnel的授權策略類似,但是新增了to欄位來限制HTTP方法。

    2. 更新4層授權策略,允許接受來自Waypoint的流量。

      kubectl apply -f - <<EOF
      apiVersion: security.istio.io/v1
      kind: AuthorizationPolicy
      metadata:
        name: productpage-ztunnel
        namespace: default
      spec:
        selector:
          matchLabels:
            app: productpage
        action: ALLOW
        rules:
        - from:
          - source:
              principals:
              - cluster.local/ns/istio-system/sa/istio-ingressgateway
              - cluster.local/ns/default/sa/waypoint
      EOF
  5. 驗證授權策略。

    1. 使用非GET方法從sleep應用訪問Bookinfo應用。

      kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" -X DELETE

      預期輸出:

      RBAC: access denied
    2. 從reviews-v1服務訪問Bookinfo應用。

      kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage

      預期輸出:

      RBAC: access denied
    3. 使用GET方法從sleep應用訪問Bookinfo應用。

      kubectl exec deploy/sleep -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"

      預期輸出:

      <title>Simple Bookstore App</title>

    可以看到,上述請求的結果與策略配置預期一致,策略正常生效。