當您需要對使用HTTP協議通訊的服務進行細粒度的存取控制時,可以使用自訂授權服務功能,根據特定業務需求定製授權機制,在服務間互相通訊時加入鑒權流程,確保只有經過認證和授權的請求才能訪問相應的服務資源,提高服務間通訊的安全性。本文以sleep與httpbin應用為例,介紹如何?接入HTTP協議的自訂授權服務。
前提條件
步驟一:部署自訂授權服務
在ACK叢集中部署自訂授權服務,該服務需遵循Istio自訂鑒權服務介面規範,支援HTTP和gRPC協議,用於實現自訂鑒權邏輯。本文使用的樣本服務需求請求必須帶有x-ext-authz: allow要求標頭,才能通過鑒權訪問成功。
本文提供了自訂授權服務樣本,您也可以參考本樣本應用的代碼,建立自己的自訂授權服務。具體內容,請參見自訂授權。
通過kubectl串連叢集,使用以下內容,建立ext-authz.yaml。
關於如何通過kubectl串連叢集,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
執行以下命令,在叢集中部署自訂授權服務。
kubectl apply -f ext-authz.yaml執行以下命令,查看Pod部署情況。
kubectl get pod預期輸出:
NAME READY STATUS RESTARTS AGE ext-authz-6b5db88f86-2m7c6 2/2 Running 0 79m執行以下命令,驗證應用是否正常工作。
kubectl logs "$(kubectl get pod -l app=ext-authz -n default -o jsonpath={.items..metadata.name})" -n default -c ext-authz預期輸出:
2023/12/20 08:15:39 Starting gRPC server at [::]:9000 2023/12/20 08:15:39 Starting HTTP server at [::]:8000返回以上結果,說明應用正常工作,自訂授權服務部署成功。
擷取ext-authz授權服務的HTTP協議連接埠。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在服務頁面,單擊ext-authz。
在端點地區,可以看到HTTP協議的連接埠為8000。訪問該服務的HTTP地址為ext-authz.default.svc.cluster.local:8000。
步驟二:部署樣本應用
使用以下內容,建立httpbin.yaml。
執行以下命令,在叢集中部署httpbin應用。
kubectl apply -f httpbin.yaml使用以下內容,建立sleep.yaml。
執行以下命令,在叢集中部署sleep應用。
kubectl apply -f sleep.yaml
步驟三:使用HTTP協議對接自訂授權服務
將步驟一部署的服務聲明到Service Mesh中,使Service Mesh可以使用該服務進行鑒權。
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇,然後單擊關聯自訂授權服務。
在關聯自訂授權服務頁面,單擊基於envoy.ext_authz實現的自訂授權服務(HTTP或gRPC協議)頁簽,進行相關配置,然後單擊建立。
類型
配置項
說明
必選參數
協議
選擇自訂授權應用的協議。本文選擇HTTP。
名稱
自訂授權服務名稱。本文設定為test4http。
服務地址
輸入自訂授權應用的服務地址<應用程式名稱>.<命名空間名稱>.svc.<叢集網域名稱>,此處必須為全稱。本文設定為ext-authz.default.svc.cluster.local。
服務連接埠
輸入自訂授權應用的服務連接埠。本文設定為8000。
逾時時間
如果鑒權應用未在該時間內返回,則認為鑒權服務不可用,本文設定為10秒。
選擇性參數
鑒權服務不可用時允許存取請求
是否在鑒權服務不可用時允許存取請求。若啟用該選項,則鑒權服務不可用時請求被允許存取。本文設定為不開啟。
鑒權服務不可用自訂錯誤碼
該選項僅在關閉鑒權服務不可用時允許存取請求時可選。若啟用該選項,需填寫錯誤碼,在鑒權服務不可用時,該錯誤碼將被返回至調用端。本文設定為不開啟。
在鑒權請求中攜帶header
啟用該選項後,需填寫期望攜帶的Header Key,匹配的Header將被設定於傳送至自訂鑒權服務的請求中。本文設定為如在鑒權請求中攜帶Header所示。
說明僅設定協議為HTTP時,才可以設定該參數。
在鑒權請求中新增header
啟用該選項後,需填寫期望在鑒權請求中新增的Header Key和Header Value,這些Header將被增加到鑒權服務的鑒權請求中。
若Header在請求中已經存在,則覆蓋原Header。本文設定為不開啟。
說明僅設定協議為HTTP時,才可以設定該參數。
鑒權通過時覆蓋Header
啟用該選項後,需填寫期望覆蓋的Header Key,自訂鑒權通過時,使用鑒權請求Response中匹配的Header覆蓋目標服務要求中的Header。本文設定如鑒權通過時覆蓋Header所示。
說明僅設定協議為HTTP時,才可以設定該參數。
鑒權失敗時覆蓋Header
啟用該選項後,需填寫期望覆蓋的Header Key,自訂鑒權失敗時,使用鑒權請求Response中匹配的Header覆蓋返回至調用服務Response中的Header。本文設定如鑒權失敗時覆蓋Header所示。
說明僅設定協議為HTTP時,才可以設定該參數。
在鑒權請求中攜帶請求Body
啟用該選項後,需填寫鑒權請求攜帶Body的最大長度。若啟用允許將不完整訊息發往鑒權服務,當被鑒權請求Body大於設定的最大長度時,從最大長度處截取,並將截取後的Body發往鑒權服務。
圖 1. 在鑒權請求中攜帶Header
說明最後一行為新增x-ext-authz。

圖 2. 鑒權通過時覆蓋Header
說明最後一行為新增x-ext-authz-check-result。

圖 3. 鑒權失敗時覆蓋Header
說明最後一行為新增x-ext-authz-check-result。

步驟四:為網格內的服務定義授權策略
您需要建立授權策略來配置需要鑒權的請求操作。
登入ASM控制台,在左側導覽列,選擇。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇,然後單擊建立。
在建立頁面,進行相關配置,然後單擊建立。
配置項
說明
名稱
自訂授權策略名稱稱,本文設定為test1。
策略類型
選擇自訂授權服務。
自訂授權服務
選擇httpextauth-test4http(HTTP)。
命名空間
在工作負載生效頁簽,選擇default命名空間。
生效範圍
選擇Service。
工作負載
選擇httpbin。
請求匹配規則
在添加請求目標地區,開啟HTTP路徑(Paths)開關,設定值為/headers。
步驟五:驗證服務間的自訂授權是否成功
執行以下命令,訪問
httpbin.default:8000/ip。kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/ip" -s -o /dev/null -w "%{http_code}\n"返回
200,說明沒有觸發鑒權。因為訪問的路徑為/ip,不是授權策略中定義的/headers,所以不被授權策略約束。執行以下命令,帶有
x-ext-authz: deny要求標頭訪問httpbin.default:8000/headers。kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -ndefault -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: deny" -s -i預期輸出:
HTTP/1.1 403 Forbidden x-ext-authz-check-result: denied content-length: 76 content-type: text/plain; charset=utf-8 date: Wed, 20 Dec 2023 09:53:28 GMT server: envoy x-envoy-upstream-service-time: 10 denied by ext_authz for not found header `x-ext-authz: allow` in the request返回以上結果,說明觸發鑒權,但是鑒權未通過,返回的結果中存在新定義的回應標頭
x-ext-authz-check-result: denied。因為訪問的路徑是授權策略中定義的/headers,所以會被授權策略約束。執行以下命令,帶有
x-ext-authz: allow要求標頭訪問httpbin.default:8000/headers。kubectl exec "$(kubectl get pod -l app=sleep -n default -o jsonpath={.items..metadata.name})" -c sleep -n default -- curl "http://httpbin.default:8000/headers" -H "x-ext-authz: allow" -s預期輸出:
{ "headers": { "Accept": "*/*", "Host": "httpbin.default:8000", "User-Agent": "curl/8.5.0", "X-Envoy-Attempt-Count": "1", "X-Ext-Authz": "allow", "X-Ext-Authz-Check-Result": "allowed", "X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/default/sa/httpbin;Hash=c3e5364e87add0f4f69e6b0d029f5961b404c8f209bf9004b3d21a82cf67****;Subject=\"\";URI=spiffe://cluster.local/ns/default/sa/sleep" } }返回以上結果,說明觸發鑒權,並且鑒權通過,返回的結果中存在新定義的回應標頭
"X-Ext-Authz-Check-Result": "allowed"。因為訪問的路徑是授權策略中定義的/headers,所以會被授權策略約束。
相關操作
如果您需要瞭解如何開發基於HTTP協議的自訂授權服務,請參見開發基於HTTP協議的自訂授權服務。
如果您需要瞭解如何開發基於gRPC協議的自訂授權服務,請參見開發基於gRPC協議的自訂授權服務。
如果您需要對使用gRPC協議通訊的服務進行細粒度的存取控制,請參見接入gRPC協議的自訂授權服務。
如果您需要對網格外服務進行授權控制,請參見對網格內服務訪問外部網站進行授權控制和對網格內服務訪問外部資料庫進行授權控制。
您可以啟用網格審計功能,記錄或追溯不同使用者的日常操作,也可以為網格資源操作配置審計警示,在重要資源變動時及時發出警示通知到警示連絡人。具體操作,請參見使用KubeAPIAction Trail和為網格資源操作配置審計警示。