當您需要對使用gRPC協議通訊的服務進行細粒度的存取控制時,可以使用自訂授權服務功能,根據特定業務需求定製授權機制,在服務間互相通訊時加入鑒權流程,確保只有經過認證和授權的請求才能訪問相應的服務資源,提高服務間通訊的安全性。本文以httpbin應用和sleep應用為例,介紹如何?接入gRPC協議的自訂授權服務。
前提條件
步驟一:部署自訂授權服務
在叢集中部署自訂授服務。該服務需遵循Istio自訂鑒權服務介面規範,支援HTTP和gRPC協議,用於實現自訂鑒權邏輯。本文使用的樣本服務需求請求必須帶有x-ext-authz: allow
要求標頭,才能通過鑒權訪問成功。
本文提供了自訂授權服務樣本。您也可以參考本樣本應用的代碼,建立自己的自訂授權服務。具體內容,請參見自訂授權。
使用以下內容,建立ext-authz.yaml。
通過kubectl串連叢集,執行以下命令,在叢集中部署自訂授權服務。
關於如何通過kubectl串連叢集,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
kubectl apply -f ext-authz.yaml
預期輸出:
service/ext-authz created deployment.apps/ext-authz created
執行以下命令, 驗證應用是否正常工作。
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應用的gRPC協議連接埠。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在服務頁面,單擊ext-authz。
在端點地區,可以看到gRPC協議的連接埠為9000。
步驟二:部署樣本應用
使用以下內容,建立httpbin.yaml。
執行以下命令,在叢集中部署httpbin應用。
kubectl apply -f httpbin.yaml
使用以下內容,建立sleep.yaml。
執行以下命令,在叢集中部署sleep應用。
kubectl apply -f sleep.yaml
步驟三:使用gRPC協議對接自訂授權服務
您需要將步驟一部署的服務聲明到Service Mesh中,使Service Mesh可以使用該服務進行鑒權。
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 ,然後單擊關聯自訂授權服務。
在關聯自訂授權服務頁面,單擊基於envoy.ext_authz實現的自訂授權服務(HTTP或gRPC協議)頁簽,進行相關配置,然後單擊建立。
類型
配置項
說明
必選參數
協議
選擇自訂授權應用的協議。本文選擇GRPC。
名稱
自訂授權服務名稱。本文設定為test。
服務地址
輸入自訂授權應用的服務地址
<應用程式名稱>.<命名空間名稱>.svc.<叢集網域名稱>
。本文設定為ext-authz.default.svc.cluster.local。服務連接埠
輸入自訂授權應用的服務連接埠。本文設定為9000。
逾時時間
如果鑒權應用未在該時間內返回,則認為鑒權服務不可用。本文設定為10秒。
選擇性參數
鑒權服務不可用時允許存取請求
是否在鑒權服務不可用時允許存取請求。若啟用該選項,則鑒權服務不可用時請求被允許存取。
鑒權服務不可用自訂錯誤碼
該選項僅在關閉鑒權服務不可用時允許存取請求時可選。若啟用該選項,需填寫錯誤碼,在鑒權服務不可用時,該錯誤碼將被返回至調用端。
在鑒權請求中攜帶請求Body
啟用該選項後,需填寫鑒權請求攜帶Body的最大長度。若啟用允許將不完整訊息發往鑒權服務,當被鑒權請求Body大於設定的最大長度時,從最大長度處截取,並將截取後的Body發往鑒權服務。
步驟四:建立授權策略
您需要建立授權策略來配置需要鑒權的請求操作。
登入ASM控制台,在左側導覽列,選擇 。
在網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇 ,然後單擊建立。
在建立頁面,進行相關配置,然後單擊建立。
配置項
說明
名稱
自訂授權策略名稱稱,本文設定為test1。
策略類型
選擇自訂授權服務。
自訂授權服務
選擇grpcextauth-test(GRPC)。
命名空間
在工作負載生效頁簽,選擇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
,說明沒有觸發鑒權。執行以下命令,帶有
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
預期輸出:
denied by ext_authz for not found header `x-ext-authz: allow` in the request
預期輸出表明觸發鑒權,但是鑒權未通過。
執行以下命令,帶有
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" } }
預期輸出表明觸發鑒權,並且鑒權通過。訪問
httpbin.default:8000/headers
時,請求中必須帶有x-ext-authz: allow
才能成功訪問,說明自訂授權成功。
相關操作
如果您需要瞭解如何開發基於HTTP協議的自訂授權服務,請參見開發基於HTTP協議的自訂授權服務。
如果您需要瞭解如何開發基於gRPC協議的自訂授權服務,請參見開發基於gRPC協議的自訂授權服務。
如果您需要對使用HTTP協議通訊的服務進行細粒度的存取控制,請參見接入HTTP協議的自訂授權服務。
如果您需要對網格外服務進行授權控制,請參見對網格內服務訪問外部網站進行授權控制和對網格內服務訪問外部資料庫進行授權控制。
您可以啟用網格審計功能,記錄或追溯不同使用者的日常操作,也可以為網格資源操作配置審計警示,在重要資源變動時及時發出警示通知到警示連絡人。具體操作,請參見使用KubeAPIAction Trail和為網格資源操作配置審計警示。