為ASM開啟Ambient模式後,您可以使用4層或7層授權策略保護應用程式訪問,並根據工作負載的ServiceAccount對流量實施存取控制。本文介紹如何為Bookinfo應用配置4層和7層授權策略。
前提條件
已完成部署應用程式範例並開啟ambient實現加密通訊中的全部操作。
準備工作
開始本文的配置前,您需要在叢集中部署Sleep應用作為另一個用戶端。
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
service: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
terminationGracePeriodSeconds: 0
serviceAccountName: sleep
containers:
- name: sleep
image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
command: ["/bin/sleep", "infinity"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: true
EOF配置4層授權策略
4層代理稱為Ztunnel,使用Rust語言開發,旨在處理3層和4層流量,比如mTLS、身分識別驗證、4層鑒權和可觀測。它以Daemonset的形式部署,同一節點上的Pod共用一個Ztunnel,所有進出這些Pod的流量都會被Ztunnel處理。
為帶有
app: productpage標籤的Pod建立授權策略,僅允許來自istio-ingressgateway ServiceAccount的用戶端訪問productpage服務。kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: productpage-ztunnel namespace: default spec: selector: matchLabels: app: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/istio-system/sa/istio-ingressgateway EOF在瀏覽器中訪問
http://{入口網關的IP地址}/productpage查看Bookinfo應用,可以看到流量正常。通過sleep應用訪問Bookinfo應用。
kubectl exec deployment/sleep -- curl -s "http://productpage:9080/productpage" -I預期輸出:
command terminated with exit code 56可以看到訪問被拒絕。由於Ztunnel的授權策略工作在4層,所以您並不會看到被拒絕的HTTP狀態代碼。
配置7層授權策略
配置7層授權策略需要部署一個Waypoint代理,然後為命名空間配置istio.io/use-waypoint=waypoint標籤,使命名空間內所有Service的流量都必須通過Waypoint。
部署Waypoint。
kubectl apply -f - <<EOF apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: waypoint spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE EOF查看Waypoint代理的狀態,直到
PROGRAMMED為True。kubectl get gtw預期輸出:
NAME CLASS ADDRESS PROGRAMMED AGE waypoint istio-waypoint 172.16.99.15 True 2m29s為命名空間添加標籤。
kubectl label namespace default istio.io/use-waypoint=waypoint --overwrite配置授權策略,明確允許
sleep應用只能通過GET方法訪問productpage應用。建立7層授權策略。
kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: productpage-waypoint namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/default/sa/sleep to: - operation: methods: ["GET"] EOF說明7層授權策略不再使用標籤來選擇生效的服務,而是通過
targetRefs來表示在Waypoint上對哪個服務執行當前策略。規則的前半部分和Ztunnel的授權策略類似,但是新增了to欄位來限制HTTP方法。更新4層授權策略,允許接受來自Waypoint的流量。
kubectl apply -f - <<EOF apiVersion: security.istio.io/v1 kind: AuthorizationPolicy metadata: name: productpage-ztunnel namespace: default spec: selector: matchLabels: app: productpage action: ALLOW rules: - from: - source: principals: - cluster.local/ns/istio-system/sa/istio-ingressgateway - cluster.local/ns/default/sa/waypoint EOF
驗證授權策略。
使用非
GET方法從sleep應用訪問Bookinfo應用。kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" -X DELETE預期輸出:
RBAC: access denied從reviews-v1服務訪問Bookinfo應用。
kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage預期輸出:
RBAC: access denied使用
GET方法從sleep應用訪問Bookinfo應用。kubectl exec deploy/sleep -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"預期輸出:
<title>Simple Bookstore App</title>
可以看到,上述請求的結果與策略配置預期一致,策略正常生效。