實施授權策略

將應用程式加入環境網格後,您可以使用第 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 測試時非常有用。

此資訊對您有幫助嗎?
您有任何改進建議嗎?

感謝您的回饋!