實施授權策略
將應用程式加入環境網格後,您可以使用第 4 層授權策略來保護應用程式存取。
此功能可讓您根據自動發給網格中所有工作負載的用戶端工作負載身分來控制服務的存取。
實施第 4 層授權策略
讓我們建立一個授權策略,限制哪些服務可以與 productpage
服務通訊。此策略會應用於具有 app: productpage
標籤的 Pod,並且只允許來自服務帳戶 cluster.local/ns/default/sa/bookinfo-gateway-istio
的呼叫。(這是您在上一步中部署的 Bookinfo 閘道所使用的服務帳戶。)
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: productpage-viewer
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/bookinfo-gateway-istio
EOF
如果您在瀏覽器中開啟 Bookinfo 應用程式(https://#:8080/productpage
),您將會看到產品頁面,就像之前一樣。但是,如果您嘗試從不同的服務帳戶存取 productpage
服務,您應該會看到錯誤訊息。
讓我們嘗試從 curl
Pod 存取 Bookinfo 應用程式
$ kubectl apply -f samples/curl/curl.yaml
由於 curl
Pod 使用的是不同的服務帳戶,它將無法存取 productpage
服務
$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage"
command terminated with exit code 56
實施第 7 層授權策略
為了強制執行第 7 層策略,您首先需要一個命名空間的Waypoint 代理。此代理將處理所有進入命名空間的第 7 層流量。
$ istioctl waypoint apply --enroll-namespace --wait
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"
您可以檢視 Waypoint 代理,並確保它具有 Programmed=True
狀態
$ kubectl get gtw waypoint
NAME CLASS ADDRESS PROGRAMMED AGE
waypoint istio-waypoint 10.96.58.95 True 42s
新增一個L7 授權策略將明確允許 curl
服務傳送 GET
請求到 productpage
服務,但不執行其他操作
$ kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: productpage-viewer
namespace: default
spec:
targetRefs:
- kind: Service
group: ""
name: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/curl
to:
- operation:
methods: ["GET"]
EOF
請注意,targetRefs
欄位用於指定 Waypoint 代理授權策略的目標服務。規則部分與之前類似,但這次我們新增了 to
部分來指定允許的操作。
確認新的 Waypoint 代理正在強制執行更新後的授權策略
$ # This fails with an RBAC error because we're not using a GET operation
$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
RBAC: access denied
$ # This fails with an RBAC error because the identity of the reviews-v1 service is not allowed
$ kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
RBAC: access denied
$ # This works as we're explicitly allowing GET requests from the curl pod
$ kubectl exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>
後續步驟
有了 Waypoint 代理,您現在可以在命名空間中強制執行第 7 層策略。除了授權策略之外,我們還可以使用 Waypoint 代理在服務之間分割流量。這在進行 Canary 部署或 A/B 測試時非常有用。