全部產品
Search
文件中心

Alibaba Cloud Service Mesh:在ASM網關上使用自訂授權服務

更新時間:Jun 30, 2024

當您需要按照自身需求定製存取控制策略時,例如基於HTTP網域名稱、HTTP路徑、HTTP方法等對請求進行鑒權,可以在ASM網關上使用自訂授權服務,確保只有經過認證的使用者才能訪問關鍵服務。

前提條件

功能介紹

用戶端發起業務請求,後端需要驗證使用者請求的合法性。例如,判斷使用者請求是否有該資源存取權限。認證通過後,返回結果中還需要增加一些原始請求中沒有的資訊,例如使用者認證通過後在header中添加業務版本號碼、使用者ID等。ASM提供了自訂授權服務。在ASM網關上加入鑒權流程,以確保只有得到授權的情況下,才能訪問關鍵服務。

自訂授權服務是需要您自行開發的一個授權服務。本文以部署一個已實現的簡易授權服務為例,將到達網關的指定請求導向自訂授權服務,由該授權服務決定是否允許該請求通過,然後網關會根據授權結果決定允許存取或拒絕該請求。您需要配置以下兩部分資訊:

  • 網關和自訂授權服務互相對接的資訊。

  • 指定該網關的哪些請求需要由自訂授權服務進行鑒權。

自訂授權服務屬於Service Mesh的進階安全能力。如果您的需求較為簡單,可以參考網關黑白名單授權策略進行配置;如果您的需求較為複雜,可以參照本文進行配置。

實現流程

ASM對於Istio自訂授權進行了封裝。如果您想瞭解Istio原生的實現流程,可以查看ASM為您產生的原生Istio資源。ASM自訂授權服務實現流程樣本如下:

  1. 在ASM定義自訂授權服務,關聯步驟一建立的自訂授權服務,使ASM可以使用該服務進行鑒權。

  2. 在ASM建立授權策略,配置需要自訂鑒權的應用,並將鑒權指向步驟二配置的自訂授權服務。

基於ASM實現應用請求認證授權

步驟一:部署自訂授權服務

在ACK叢集中部署自訂授權服務,該服務需遵循Istio自訂鑒權服務介面規範,支援HTTP和gRPC協議,用於實現自訂鑒權邏輯。本文使用的樣本服務需求請求必須帶有x-ext-authz: allow要求標頭,才能通過鑒權訪問成功。

說明

本文提供了自訂授權服務樣本,您可以參考本樣本應用的代碼,建立自己的自訂授權服務。具體操作,請參見自訂授權

  1. 使用以下內容,建立ext-authz.yaml

    展開查看ext-authz.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    
    # Example configurations for deploying ext-authz server separately in the mesh.
    
    apiVersion: v1
    kind: Service
    metadata:
      name: ext-authz
      labels:
        app: ext-authz
    spec:
      ports:
      - name: http
        port: 8000
        targetPort: 8000
      - name: grpc
        port: 9000
        targetPort: 9000
      selector:
        app: ext-authz
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ext-authz
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ext-authz
      template:
        metadata:
          labels:
            app: ext-authz
        spec:
          containers:
          - image: istio/ext-authz:0.6
            imagePullPolicy: IfNotPresent
            name: ext-authz
            ports:
            - containerPort: 8000
            - containerPort: 9000
    ---
  2. 執行以下命令,在叢集中部署自訂授權服務。

    關於如何通過kubectl管理叢集和應用,請參見通過kubectl工具串連叢集

    kubectl apply -f ext-authz.yaml
  3. 執行以下命令,查看Pod狀態。

    kubectl get pod

    預期輸出:

    NAME                              READY   STATUS    RESTARTS       AGE
    ext-authz-6d458d5f8f-bh2m9        2/2     Running   0              1m
  4. 執行以下命令,驗證應用是否正常工作。

    kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authz

    預期輸出:

    2023/12/12 10:01:31 Starting HTTP server at [::]:8000
    2023/12/12 10:01:31 Starting gRPC server at [::]:9000

    返回以上結果,說明應用正常工作,自訂授權服務部署成功。

  5. 擷取ext-authz授權服務的gRPC和HTTP協議連接埠。

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 服務

    3. 服務頁面,單擊ext-authz

      端點地區可以看到gRPC協議的連接埠為9000,HTTP協議的連接埠為8000。因此訪問該服務的gRPC地址為ext-authz.default.svc.cluster.local:9000,HTTP地址為ext-authz.default.svc.cluster.local:8000

步驟二:在網關配置HTTP協議的自訂授權服務

ASM網關整合了自訂授權的能力,支援通過ASM控制台進行配置。

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

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇ASM網關 > 入口網關

  3. 入口網關頁面,單擊目標網關名稱。

  4. 在網關概覽導覽列,單擊網關安全 > 自訂授權服務

  5. 自訂授權服務配置設定精靈,開啟啟用網關自訂授權服務開關,任選以下方式,配置自訂授權服務,然後單擊下一步

    方式一:建立自訂授權服務

    基於envoy.ext_authz實現的自訂授權服務(HTTP或gRPC協議)頁簽,進行如下配置。關於配置項的說明,請參見接入HTTP協議的自訂授權服務基於envoy.ext_authz實現的自訂授權服務(HTTP或gRPC協議)headerheader配置

    方式二:匯入已有的自訂授權服務

    匯入已有自訂授權服務頁簽,選擇已有自訂授權服務

  6. 匹配規則設定精靈,進行如下配置,然後單擊提交

    被該規則匹配到的請求,將會執行自訂授權。匹配規則

    配置完成後,頁面會顯示網關自訂授權服務建立成功

步驟三:驗證ASM網關使用自訂授權服務是否成功

  1. 執行以下命令,訪問網關上/api/v1/products路徑的資源。

    關於如何擷取網關地址,請參見擷取入口網關地址

    curl -I http://{您的ASM網關地址}/api/v1/products

    預期輸出:

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Wed, 13 Dec 2023 02:41:20 GMT
    content-type: application/json
    content-length: 395
    x-envoy-upstream-service-time: 1

    返回以上結果,說明沒有觸發鑒權。訪問的路徑為/api/v1/products,不是上文配置的/productpage,所以不被授權策略約束。

  2. 執行以下命令,帶有x-ext-authz: deny要求標頭訪問/productpage路徑的資源。

    curl -I -H "x-ext-authz: deny" http://{您的ASM網關地址}/productpage

    預期輸出:

    HTTP/1.1 403 Forbidden
    x-ext-authz-check-result: denied
    date: Wed, 13 Dec 2023 02:42:59 GMT
    server: istio-envoy
    transfer-encoding: chunked

    返回以上結果,說明觸發鑒權,但是鑒權未通過。返回的結果中包含新定義的回應標頭x-ext-authz-check-result: denied。訪問的路徑是授權策略中定義的/productpage,所以會被授權策略約束。

  3. 執行以下命令,帶有x-ext-authz: allow要求標頭訪問/productpage路徑的資源。

    curl -I -H "x-ext-authz: allow" http://{您的ASM網關地址}/productpage

    預期輸出:

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Wed, 13 Dec 2023 02:50:38 GMT
    content-type: text/html; charset=utf-8
    content-length: 5290
    x-envoy-upstream-service-time: 47

    返回以上結果,說明觸發鑒權,並且鑒權通過。鑒權通過後,網關轉寄給應用的請求中會攜帶x-ext-authz-check-result的header(值為allowed)。攜帶這個header是因為本文自訂授權服務會添加該header,且上文配置中允許授權響應攜帶該header。

相關文檔

  • ASM網關支援從源地址、HTTP網域名稱、連接埠、遠程源IP四個維度配置黑白名單,以保障網格內應用的安全。具體操作,請參見在ASM網關中配置黑白名單

  • 您可以藉助阿里雲IDaaS或其他符合OIDC標準的身份提供者,無需修改應用本身,即可實現一次登入、多次訪問。具體操作,請參見在ASM網關中配置OIDC單點登入