當您需要按照自身需求定製存取控制策略時,例如基於HTTP網域名稱、HTTP路徑、HTTP方法等對請求進行鑒權,可以在ASM網關上使用自訂授權服務,確保只有經過認證的使用者才能訪問關鍵服務。
前提條件
功能介紹
用戶端發起業務請求,後端需要驗證使用者請求的合法性。例如,判斷使用者請求是否有該資源存取權限。認證通過後,返回結果中還需要增加一些原始請求中沒有的資訊,例如使用者認證通過後在header中添加業務版本號碼、使用者ID等。ASM提供了自訂授權服務。在ASM網關上加入鑒權流程,以確保只有得到授權的情況下,才能訪問關鍵服務。
自訂授權服務是需要您自行開發的一個授權服務。本文以部署一個已實現的簡易授權服務為例,將到達網關的指定請求導向自訂授權服務,由該授權服務決定是否允許該請求通過,然後網關會根據授權結果決定允許存取或拒絕該請求。您需要配置以下兩部分資訊:
網關和自訂授權服務互相對接的資訊。
指定該網關的哪些請求需要由自訂授權服務進行鑒權。
自訂授權服務屬於Service Mesh的進階安全能力。如果您的需求較為簡單,可以參考網關黑白名單或授權策略進行配置;如果您的需求較為複雜,可以參照本文進行配置。
實現流程
ASM對於Istio自訂授權進行了封裝。如果您想瞭解Istio原生的實現流程,可以查看ASM為您產生的原生Istio資源。ASM自訂授權服務實現流程樣本如下:
步驟一:部署自訂授權服務
在ACK叢集中部署自訂授權服務,該服務需遵循Istio自訂鑒權服務介面規範,支援HTTP和gRPC協議,用於實現自訂鑒權邏輯。本文使用的樣本服務需求請求必須帶有x-ext-authz: allow
要求標頭,才能通過鑒權訪問成功。
本文提供了自訂授權服務樣本,您可以參考本樣本應用的代碼,建立自己的自訂授權服務。具體操作,請參見自訂授權。
使用以下內容,建立ext-authz.yaml。
執行以下命令,在叢集中部署自訂授權服務。
關於如何通過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協議連接埠。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在服務頁面,單擊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單點登入。