全部產品
Search
文件中心

Alibaba Cloud Service Mesh:在ASM網關中接入OPA執行引擎

更新時間:Jun 30, 2024

當您需要實現動態存取控制時,可以在ASM網關中接入OPA(Open Policy Agent)執行引擎,根據使用者身份或請求內容定製授權策略,即時控制服務間的通訊行為,有效防止未經授權的訪問並降低資料泄露風險,加強網格應用的安全性。以入口網關訪問httpbin應用為例,本文介紹如何在ASM網關上使用OPA執行引擎對到達網關的請求進行認證和鑒權。

前提條件

步驟一:部署OPA執行引擎

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

    YAML檔案部署了一個OPA Service、OPA Deployment和Secret。

    Kind

    說明

    Deployment

    • 鏡像registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static請替換為您實際的叢集地區。

    • 該OPA引擎預設開啟了日誌--set=decision_logs.console=true,方便進行調試。

    Secret

    Secret定義了OPA策略,含義如下:

    • 如果請求路徑是health,允許存取請求。

    • 如果請求的方法是HEAD,允許存取請求。

    • 如果使用者名稱稱是alice,允許存取請求。

      說明

      使用者名稱稱來自請求的AuthorizationHeader,形式為Authorization: Basic ${使用者名稱:密碼字串的base64編碼}

    展開查看asm-opa.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: asm-opa
      labels:
        app: opa
    spec:
      ports:
        - name: grpc
          port: 9191
          targetPort: 9191
          protocol: TCP
        - name: http
          port: 8181
          targetPort: 8181
          protocol: TCP
      selector:
        app: opa
    ---
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: opa
      labels:
        app: opa
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: opa
      template:
        metadata:
          labels:
            app: opa
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers:
            - name: opa
              image: registry-vpc.cn-hangzhou.aliyuncs.com/acs/opa:0.46.1-istio-3-static
              securityContext:
                runAsUser: 1111
              volumeMounts:
                - readOnly: true
                  mountPath: /policy
                  name: opa-policy
              args:
                - "run"
                - "--server"
                - "--addr=0.0.0.0:8181"
                - "--diagnostic-addr=0.0.0.0:8282"
                - "--set=plugins.envoy_ext_authz_grpc.addr=:9191"
                - "--set=plugins.envoy_ext_authz_grpc.path=asm/authz/allow"
                - "--set=decision_logs.console=true"
                - "--ignore=.*"
                - "/policy/policy.rego"
              ports:
                - containerPort: 9191
                  protocol: TCP
              resources:
                limits:
                  cpu: "0"
                  memory: "0"
          volumes:
            - name: opa-policy
              secret:
                secretName: opa-policy
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: opa-policy
    type: Opaque
    stringData:
      policy.rego: |
        package asm.authz
    
        import future.keywords
    
        import input.attributes.request.http as http_request
        import input.parsed_path
    
        default allow := false
    
        allow if {
          parsed_path[0] == "health"
        }
    
        allow if {
          http_request.method == "HEAD"
        }
    
        allow if {
          user_name == "alice"
        }
    
        user_name := parsed if {
          [_, encoded] := split(http_request.headers.authorization, " ")
          [parsed, _] := split(base64url.decode(encoded), ":")
        }
    
  2. 使用ACK叢集的KubeConfig,執行以下命令,部署OPA。

    kubectl apply -f asm-opa.yaml

步驟二:使用ASM網關外部授權功能接入OPA執行引擎

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

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

  3. 入口網關頁面,在需要接入OPA的網關右側,單擊網關安全

  4. 在網關左側導覽列,選擇網關安全 > 自訂授權服務

  5. 配置自訂授權服務相關資訊。

    1. 自訂授權服務配置嚮導,配置OPA作為網關的自訂授權服務,然後單擊下一步

      image.png

    2. 匹配規則設定精靈,配置請求匹配規則,指定哪些請求需要經過OPA認證和授權,然後單擊提交

      image.png

      建立成功後,介面顯示如下。

      image.png

步驟三:對httpbin應用進行訪問測試

  1. 執行以下命令,訪問/路徑。

    curl ${ASM網關IP}/ -I -X GET

    預期輸出:

    HTTP/1.1 200 OK
    server: istio-envoy
    date: Tue, 25 Jul 2023 08:30:58 GMT
    content-type: text/html; charset=utf-8
    content-length: 9593
    access-control-allow-origin: *
    access-control-allow-credentials: true
    x-envoy-upstream-service-time: 2

    預期輸出表明該路徑不需要鑒權,直接通過。

  2. 執行以下命令,未攜帶合法參數,訪問/status/201路徑。

    curl ${ASM網關IP}/status/201 -I -X GET

    預期輸出:

    HTTP/1.1 403 Forbidden
    date: Tue, 25 Jul 2023 08:31:18 GMT
    server: istio-envoy
    content-length: 0
    x-envoy-upstream-service-time: 1

    預期輸出表明未攜帶合法參數,請求被拒絕。

  3. 執行以下命令,攜帶合法參數,訪問/status/201路徑。

    curl ${ASM網關IP}/status/201 -I -X GET --user alice:testpassword

    預期輸出:

    HTTP/1.1 201 Created
    server: istio-envoy
    date: Tue, 25 Jul 2023 08:31:38 GMT
    content-type: text/html; charset=utf-8
    access-control-allow-origin: *
    access-control-allow-credentials: true
    content-length: 0
    x-envoy-upstream-service-time: 3

    預期輸出表明攜帶合法參數,請求通過。

步驟四:更新OPA策略

調用OPA引擎的HTTP介面,更新OPA策略。

  1. 執行以下命令,要求只有bob使用者才可以正常訪問HTTP,之前的alice使用者不能訪問。

    kubectl exec deployment/httpbin -c istio-proxy -- curl asm-opa:8181/v1/policies/policy/policy.rego -XPUT --data-binary 'package asm.authz
    
    import future.keywords
    import input.attributes.request.http as http_request
    import input.parsed_path
    
    default allow := false
    
    allow if {
      parsed_path[0] == "health"
    }
    
    allow if {
      http_request.method == "HEAD"
    }
    
    allow if {
      user_name == "bob"
    }
    
    user_name := parsed if {
      [_, encoded] := split(http_request.headers.authorization, " ")
      [parsed, _] := split(base64url.decode(encoded), ":")
    }'
  2. 執行以下命令,使用bob使用者訪問httpbin。

    curl ${ASM網關IP}/status/201 -I -X GET --user bob:testpassword

    預期輸出:

    HTTP/1.1 201 Created
    server: istio-envoy
    date: Tue, 25 Jul 2023 08:32:16 GMT
    content-type: text/html; charset=utf-8
    access-control-allow-origin: *
    access-control-allow-credentials: true
    content-length: 0
    x-envoy-upstream-service-time: 3

    預期輸出表明bob使用者訪問成功。

  3. 執行以下命令,使用alice使用者訪問httpbin。

    curl ${ASM網關IP}/status/201 -I -X GET --user alice:testpassword  

    預期輸出:

    HTTP/1.1 403 Forbidden
    date: Tue, 25 Jul 2023 08:32:49 GMT
    server: istio-envoy
    content-length: 0
    x-envoy-upstream-service-time: 1

    預期輸出表明alice使用者訪問被禁止。