全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用ASM安全性原則接入外部OPA執行引擎

更新時間:Jun 30, 2024

ASM對Istio原生安全資源的情境進行封裝,提供ASM安全性原則功能,便於一站式配置常見的安全情境。ASM整合了開放策略代理(OPA)外掛程式,通過OPA定義存取控制策略,可以使您的應用實現細粒度的存取控制。本文介紹如何使用ASM安全性原則接入外部OPA執行引擎。

前提條件

功能介紹

ASM目前預設的OPA部署方式為Sidecar模式。當開啟OPA之後,重啟應用Pod,ASM就會在應用Pod中注入一個OPA容器。此後,業務容器所有的請求都會經過OPA Sidecar校正。Sidecar模式是完全的Pod內部訪問,因此可以實現較低的延遲,適用於一些對延遲比較敏感的業務。

但是Sidecar模式存在一些弊端,例如資源佔用、應用接入需要重啟Pod、接入方式不夠靈活等。集中式OPA在這些方面可以和Sidecar模式的OPA形成互補。集中式OPA可以實現更低的資源佔用、應用無需重啟即可接入、自由決定到達應用的哪些請求執行OPA策略等。下文將介紹如何部署一個集中式的OPA授權服務並將其接入應用。

OPA部署方式.png

步驟一:部署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. ASM安全性原則頁面,單擊建立,在建立ASM安全性原則對話方塊,單擊自訂授權服務卡片,然後單擊確定

  4. 配置自訂授權相關資訊。

    1. 建立自訂授權服務頁面,配置步驟一部署的OPA授權服務資訊,然後單擊下一步

      建立自訂授權服務.png

    2. 工作負載和匹配規則設定精靈,單擊添加工作負載組,然後在建立工作負載組對話方塊,輸入工作負載組名稱,單擊添加工作負載

    3. 添加工作負載對話方塊,選中工作負載生效命名空間選擇default工作負載類型選擇Service,在選擇負載地區選中httpbin,單擊Dingtalk_20230302182310.png表徵圖,然後單擊確定添加工作負載.png

    4. 建立工作負載組對話方塊的匹配規則列表地區匹配模式選擇選中請求必須經過鑒權匹配規則選擇自訂匹配規則,開啟HTTP路徑(Path)開關並配置為/status/*,然後單擊確定

      建立工作負載組.png

    5. 工作負載和匹配規則設定精靈,單擊提交

      建立成功後,介面顯示如下。ASM安全性原則建立成功.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使用者訪問被禁止。