Ambient模式中,由於4層和7層的分離架構,導致認證和授權的配置模型與原Sidecar模式不同。以ASM 1.18版本為例,本文介紹如何使用4層授權策略。
前提條件
已部署ASM網關和應用,且成功驗證準系統。具體操作,請參見入門樣本的前提條件和步驟一。
使用限制
授權策略在Ztunnel中的使用限制如下:
action
欄位不支援CUSTOM
,即Ztunnel不支援自訂授權服務。source
欄位中不支援requestPrincipals
和remoteIpBlocks
。operation
欄位中除ports
以外的所有欄位均不支援。
當不存在Waypoint代理時,Ztunnel代理是授權策略的執行者。此時,授權策略需要綁定給指定的工作負載。
Ztunnel只是一個4層代理,如果在其上配置包含7層規則的授權策略,只有4層的規則會生效。
樣本一:productpage只允許被網關和sleep訪問
本樣本主要驗證Ztunnel代理能否正確執行principals
鑒權邏輯。具體操作,請參見入門樣本。
測試完成後,請執行以下命令,清除授權策略。
kubectl delete authorizationpolicy productpage-viewer
樣本二:禁止訪問productpage的9080連接埠
本樣本主要驗證Ztunnel代理能否正確執行目標連接埠鑒權邏輯。
使用以下內容,建立productpage-viewer.yaml。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - to: - operation: ports: - "9080"
在ASM執行個體對應的KubeConfig環境下,執行以下命令,建立授權策略。
kubectl apply -f productpage-viewer.yaml
驗證授權策略是否生效。
執行以下命令,進行訪問測試。
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"
預期輸出:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%
執行以下命令,進行訪問測試
kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"
預期輸出:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%
執行以下命令,進行訪問測試
kubectl exec deploy/sleep -- curl -s http://productpage:9080/
預期輸出:
command terminated with exit code 56
執行以下命令,進行訪問測試
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預期輸出:
command terminated with exit code 56
可以看到,所有Pod都不能訪問productpage的9080連接埠。
前兩個測試命令通過網關訪問productpage的請求報錯為
upstream connect error or disconnect/reset before headers. reset reason: connection termination%
,這個錯誤實際由ASM網關返回。網關串連不上後端服務(後端服務拒絕網關串連9080連接埠),就會報一個HTTP錯誤(實際狀態代碼為503)。後兩個測試命令的傳回值為
command terminated with exit code 56
,由curl
命令返回。curl
命令直接和productpage建立串連,但串連失敗,因此沒有HTTP錯誤,和直接通過網關訪問的錯誤有區別。
執行以下命令,清除授權策略。
kubectl delete authorizationpolicy productpage-viewer
樣本三:不允許sleep Pod的IP訪問productpage
本樣本主要驗證Ztunnel代理能否正確執行源IP鑒權邏輯。
執行以下命令,查看sleep Pod的IP。
kubectl get pod -o wide | grep sleep
預期輸出:
notsleep-5fb85fb789-z**** 1/1 Running 0 48m 10.0.67.92 cn-hangzhou.10.0.67.41 <none> <none> sleep-bc9998558-z**** 1/1 Running 0 48m 10.0.67.91 cn-hangzhou.10.0.67.42 <none> <none>
預期輸出表明當前測試環境的sleep Pod的IP為
10.0.67.91
。每個環境裡的實際Pod IP可能不同。使用以下內容,建立productpage-viewer.yaml,限制productpage拒絕來自sleep Pod IP的請求。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - from: - source: ipBlocks: - ${sleep Pod IP}
在ASM執行個體對應的KubeConfig環境下,執行以下命令,建立授權策略。
kubectl apply -f productpage-viewer.yaml
驗證授權策略是否生效。
執行以下命令,進行訪問測試。
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
預期輸出:
<title>Simple Bookstore App</title>
執行以下命令,進行訪問測試。
kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage" | grep -o "<title>.*</title>"
預期輸出:
<title>Simple Bookstore App</title>
執行以下命令,進行訪問測試。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/
預期輸出:
command terminated with exit code 56
執行以下命令,進行訪問測試。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預期輸出:
<title>Simple Bookstore App</title>
可以看到只使用Ztunnel代理,沒有Waypoint代理,並不能實現禁止sleep Pod通過網關訪問productpage。因為授權策略中的
remoteIpBlocks
欄位依賴請求的X-Forwarded-For Header實現,Ztunnel只是一個4層代理。
執行以下命令,清除授權策略。
kubectl delete authorizationpolicy productpage-viewer
樣本四:禁止istio-system命名空間的Pod訪問productpage
本樣本主要驗證Ztunnel代理能否正確執行源命名空間鑒權邏輯。
使用以下內容,建立productpage-viewer.yaml,禁止istio-system命名空間下的Pod訪問productpage。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - from: - source: namespaces: - istio-system
在ASM執行個體對應的KubeConfig環境下,執行以下命令,建立授權策略。
kubectl apply -f productpage-viewer.yaml
驗證授權策略是否生效。
執行以下命令,進行訪問測試。
kubectl exec deploy/sleep -- curl -s "http://$GATEWAY_HOST/productpage"
預期輸出:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%
執行以下命令,進行訪問測試
kubectl exec deploy/notsleep -- curl -s "http://$GATEWAY_HOST/productpage"
預期輸出:
upstream connect error or disconnect/reset before headers. reset reason: connection termination%
執行以下命令,進行訪問測試
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預期輸出:
<title>Simple Bookstore App</title>
執行以下命令,進行訪問測試
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預期輸出:
<title>Simple Bookstore App</title>
ASM網關部署在istio-system命名空間下。可以看到,授權策略建立成功後,sleep和notsleep無法通過網關訪問productpage,但是可以直接存取productpage。
執行以下命令,清除授權策略。
kubectl delete authorizationpolicy productpage-viewer