Ambient模式中,由于4層和7層的分離架構,導致認證和授權的配置模型與原Sidecar模式不同。本文介紹如何使用7層授權策略。
前提條件
已部署ASM網關和應用,且成功驗證基本功能。具體操作,請參見入門示例的前提條件和步驟一。
使用限制
授權策略在Waypoint代理中的使用限制如下:
action
字段不支持CUSTOM
,即Waypoint代理不支持自定義授權服務。source
字段中不支持ipBlocks
。
存在Waypoint代理時,Ztunnel代理會允許所有來自Waypoint代理的請求通過。此時,授權策略需要綁定給指定的Waypoint代理。
準備工作
ASM 1.21及以下版本
執行以下命令,為productpage部署Waypoint。
istioctl x waypoint apply --service-account bookinfo-productpage
執行以下命令,查看對應的Waypoint Pod。
kubectl get pod --show-labels | grep waypoint
預期輸出:
bookinfo-productpage-istio-waypoint-6c579dd48d-l**** 1/1 Running 0 91s gateway.istio.io/managed=istio.io-mesh-controller,istio.io/gateway-name=bookinfo-productpage,pod-template-hash=6c579dd48d,service.istio.io/canonical-name=bookinfo-productpage-istio-waypoint,service.istio.io/canonical-revision=latest,sidecar.istio.io/inject=false
ASM 1.22及以上版本
使用以下內容,部署Gateway。
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE
執行以下命令,為productpage服務開啟waypoint。
kubectl label service productpage istio.io/use-waypoint=waypoint
示例一:存在Waypoint時,Ztunnel上的授權策略失效
存在Waypoint時,Ztunnel將會允許所有來自當前服務Waypoint的流量通過,此時再將授權策略應用到Ztunnel上(授權策略的selector
選中了業務Pod)時,該授權策略不會生效。
使用以下內容,創建productpage-viewer.yaml。
以下授權策略作用于Ztunnel,禁止訪問productpage的9080端口。
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://productpage:9080/| grep -o "<title>.*</title>"
預期輸出:
command terminated with exit code 56
執行以下命令,進行訪問測試。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
預期輸出:
<title>Simple Bookstore App</title>
本測試和不存在Waypoint的示例二:禁止訪問productpage的9080端口使用了同樣的授權策略,但本測試所有訪問均成功。
以上結果說明當配置Waypoint后,之前Ztunnel上的所有策略都會失效。
將授權策略productpage-viewer.yaml修改為如下內容,然后執行
kubectl apply -f productpage-viewer.yaml
命令進行部署。ASM 1.21及以下
以下YAML修改了
selector
字段。apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: ports: - "9080"
ASM 1.22及以上
以下YAML修改為直接引用Service。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: DENY rules: - to: - operation: ports: - "9080"
驗證授權策略是否生效。
執行以下命令,進行訪問測試。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/
預期輸出:
RBAC: access denied%
執行以下命令,進行訪問測試。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/
預期輸出:
RBAC: access denied%
此處返回的報錯信息
RBAC: access denied%
和L4鑒權的示例二:禁止訪問productpage的9080端口不同。這個錯誤實際由productpage的Waypoint返回。Waypoint發現9080端口不允許訪問,于是返回一個HTTP RBAC錯誤,實際的狀態碼應為403。
執行以下命令,清除授權策略。
kubectl delete authorizationpolicy productpage-viewer
示例二:禁止sleep Pod的IP直接訪問productpage
目前配置在Waypoint上的授權策略不支持ipBlocks
字段,只支持remoteIpBlocks
。請求經過網關只能配置remoteIpBlocks
字段進行匹配。
使用以下內容,創建productpage-viewer.yaml,禁止sleep Pod訪問productpage。
ASM 1.21及以下
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - from: - source: remoteIpBlocks: - "${sleep Pod IP}"
ASM 1.22及以上
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: DENY rules: - from: - source: remoteIpBlocks: - "${sleep Pod IP}"
在ASM實例對應的kubeconfig環境下,執行以下命令,創建授權策略。
kubectl apply -f productpage-viewer.yaml
驗證授權策略是否生效。
執行以下命令,進行訪問測試。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ -I
預期輸出:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Fri, 19 Jul 2024 08:17:08 GMT server: istio-envoy
預期輸出表明sleep Pod不可以直接訪問productpage,也不可以通過網關訪問。
執行以下命令,清除授權策略。
kubectl delete authorizationpolicy productpage-viewer
示例三:限制不允許使用HEAD方法訪問/productpage路徑
使用以下內容,創建productpage-viewer.yaml。
ASM 1.21及以下
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: methods: ["HEAD"] paths: ["/productpage"]
ASM 1.22及以上
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: DENY rules: - to: - operation: methods: - "HEAD" paths: - "/productpage"
在ASM實例對應的kubeconfig環境下,執行以下命令,創建授權策略。
kubectl apply -f productpage-viewer.yaml
驗證授權策略是否生效。
執行以下命令,使用HEAD方法訪問
/productpage
路徑進行測試。kubectl exec deploy/sleep -- curl -s productpage:9080/productpage -I
預期輸出:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 15 Aug 2024 12:20:51 GMT server: istio-envoy
執行以下命令,使用GET方法訪問
/productpage
路徑進行訪問測試。kubectl exec deploy/sleep -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
預期輸出:
<title>Simple Bookstore App</title>
訪問
/productpage
路徑成功執行以下命令,使用HEAD方法訪問
/
路徑進行訪問測試。kubectl exec deploy/sleep -- curl -s productpage:9080/ -I
預期輸出:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 15 Aug 2024 12:23:17 GMT content-type: text/html; charset=utf-8 content-length: 1743 x-envoy-upstream-service-time: 2
執行以下命令,清除授權策略。
kubectl delete authorizationpolicy productpage-viewer