當您需要按照自身需求定制訪問控制策略時,例如基于HTTP域名、HTTP路徑、HTTP方法等對請求進行鑒權,可以在ASM網關上使用自定義授權服務,確保只有經過認證的用戶才能訪問關鍵服務。
前提條件
功能介紹
客戶端發起業務請求,后端需要驗證用戶請求的合法性。例如,判斷用戶請求是否有該資源訪問權限。認證通過后,返回結果中還需要增加一些原始請求中沒有的信息,例如用戶認證通過后在header中添加業務版本號、用戶ID等。ASM提供了自定義授權服務。在ASM網關上加入鑒權流程,以確保只有得到授權的情況下,才能訪問關鍵服務。
自定義授權服務是需要您自行開發的一個授權服務。本文以部署一個已實現的簡易授權服務為例,將到達網關的指定請求導向自定義授權服務,由該授權服務決定是否允許該請求通過,然后網關會根據授權結果決定放行或拒絕該請求。您需要配置以下兩部分信息:
網關和自定義授權服務互相對接的信息。
指定該網關的哪些請求需要由自定義授權服務進行鑒權。
自定義授權服務屬于服務網格的高級安全能力。如果您的需求較為簡單,可以參考網關黑白名單或授權策略進行配置;如果您的需求較為復雜,可以參照本文進行配置。
實現流程
ASM對于Istio自定義授權進行了封裝。如果您想了解Istio原生的實現流程,可以查看ASM為您生成的原生Istio資源。ASM自定義授權服務實現流程示例如下:
步驟一:部署自定義授權服務
在ACK集群中部署自定義授權服務,該服務需遵循Istio自定義鑒權服務接口規范,支持HTTP和gRPC協議,用于實現自定義鑒權邏輯。本文使用的示例服務要求請求必須帶有x-ext-authz: allow
請求頭,才能通過鑒權訪問成功。
本文提供了自定義授權服務示例,您可以參考本示例應用的代碼,創建自己的自定義授權服務。具體操作,請參見自定義授權。
使用以下內容,創建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 ---
執行以下命令,在集群中部署自定義授權服務。
關于如何通過kubectl管理集群和應用,請參見通過kubectl工具連接集群。
kubectl apply -f ext-authz.yaml
執行以下命令,查看Pod狀態。
kubectl get pod
預期輸出:
NAME READY STATUS RESTARTS AGE ext-authz-6d458d5f8f-bh2m9 2/2 Running 0 1m
執行以下命令,驗證應用是否正常工作。
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
返回以上結果,說明應用正常工作,自定義授權服務部署成功。
獲取ext-authz授權服務的gRPC和HTTP協議端口。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在服務頁面,單擊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控制臺進行配置。
登錄ASM控制臺,在左側導航欄,選擇 。
在網格管理頁面,單擊目標實例名稱,然后在左側導航欄,選擇 。
在入口網關頁面,單擊目標網關名稱。
在網關概覽導航欄,單擊 。
在自定義授權服務配置配置向導,打開啟用網關自定義授權服務開關,任選以下方式,配置自定義授權服務,然后單擊下一步。
方式一:新建自定義授權服務
在基于envoy.ext_authz實現的自定義授權服務(HTTP或gRPC協議)頁簽,進行如下配置。關于配置項的說明,請參見接入HTTP協議的自定義授權服務。
方式二:導入已有的自定義授權服務
在導入已有自定義授權服務頁簽,選擇已有自定義授權服務。
在匹配規則配置向導,進行如下配置,然后單擊提交。
被該規則匹配到的請求,將會執行自定義授權。
配置完成后,頁面會顯示網關自定義授權服務創建成功。
步驟三:驗證ASM網關使用自定義授權服務是否成功
執行以下命令,訪問網關上
/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
,所以不被授權策略約束。執行以下命令,帶有
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
,所以會被授權策略約束。執行以下命令,帶有
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單點登錄。