全部產品
Search
文件中心

Alibaba Cloud Service Mesh:為TCP流量設定授權策略

更新時間:Jan 13, 2025

當您需要精細控制服務間的TCP流量訪問時,可以為TCP流量設定授權策略,管理服務之間的互動許可權,確保只有經過授權的請求才能訪問特定服務,提高服務的安全性和可靠性。

前提條件

步驟一:部署樣本應用

部署tcp-echo作為被請求的TCP服務,sleep作為發起請求的TCP服務。

  1. 部署被請求的TCP服務。

    1. 使用以下內容,建立tcp-echo.yaml檔案。

      當tcp-echo收到請求後,將在請求內容新增hello首碼,作為返回結果。例如,向tcp-echo發送world,將返回hello world

      展開查看tcp-echo.yaml

      apiVersion: v1
      kind: Service
      metadata:
        name: tcp-echo
        labels:
          app: tcp-echo
          service: tcp-echo
      spec:
        ports:
        - name: tcp
          port: 9000
        - name: tcp-other
          port: 9001
        selector:
          app: tcp-echo
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v1
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v1
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.2
              imagePullPolicy: IfNotPresent
              args: [ "9000,9001,9002", "hello" ]
              ports:
              - containerPort: 9000
              - containerPort: 9001
    2. 使用kubectl串連到叢集,執行以下命令,將tcp-echo服務部署到foo命名空間,作為被請求的TCP服務。

      關於如何使用kubectl串連到叢集,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集

      kubectl apply -f tcp-echo.yaml -n foo
  2. 部署發起請求的TCP服務。

    1. 使用以下內容,建立sleep.yaml檔案。

      展開查看sleep.yaml

      #Sleep service
      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: curlimages/curl
              command: ["/bin/sleep", "3650d"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
    2. 執行以下命令,將sleep服務部署到foo命名空間,用於發起TCP請求。

      kubectl apply -f sleep.yaml -n foo

步驟二:驗證授權前,請求是否成功

  1. 執行以下命令,驗證sleep請求服務能否訪問TCP服務的9000連接埠。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    預期輸出:

    hello port 9000
    connection succeeded

    預期輸出表明sleep請求服務訪問TCP服務的9000連接埠成功。

  2. 執行以下命令,驗證sleep請求服務能否訪問TCP服務的9001連接埠。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    預期輸出:

    hello port 9001
    connection succeeded

    預期輸出表明sleep請求服務訪問TCP服務的9001連接埠成功。

步驟三:配置授權策略

配置可以訪問TCP服務的9000連接埠的授權策略,具體操作步驟如下。

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇網格資訊安全中心 > 授權策略

  3. 任選以下方式建立授權策略。

    重要

    配置TCP授權策略時,不能開啟HTTP方法(Methods)開關。這種配置僅限於HTTP請求使用,不符合TCP的ALLOW規則,為無效配置。服務網格將忽略無效的ALLOW規則,導致請求被拒絕,返回connection rejected

    方式一:使用YAML建立授權策略

    1. 授權策略頁面,單擊使用YAML建立

    2. 建立頁面,選擇命名空間foo,選擇任意情境模版,將以下YAML模板粘貼到YAML地區,然後單擊建立

      kind: AuthorizationPolicy
      apiVersion: security.istio.io/v1beta1
      metadata:
        name: demo
        namespace: foo
      spec:
        action: ALLOW
        rules:
          - to:
              - operation:
                  ports:
                    - '9000'

    方式二:通過圖形化介面建立授權策略

    1. 授權策略頁面,單擊建立

    2. 建立頁面,配置相關資訊,然後單擊建立

      配置項

      說明

      名稱

      本樣本為demo

      策略類型

      選擇允許

      命名空間

      工作負載生效頁簽,選擇foo命名空間。

      生效範圍

      選擇命名空間生效

      請求匹配規則

      添加請求目標地區,開啟連接埠(Ports)開關,設定值為9000

步驟四:驗證授權後,請求是否成功

  1. 執行以下命令,驗證sleep請求服務能否訪問TCP服務的9001連接埠。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    預期輸出:

    connection rejected

    預期輸出表明sleep請求服務訪問TCP服務的9001連接埠失敗。

  2. 執行以下命令,驗證sleep請求服務能否訪問TCP服務的9000連接埠。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    預期輸出:

    hello port 9000
    connection succeeded

    預期輸出表明sleep請求服務訪問TCP服務的9000連接埠成功。

相關文檔