HTTP 流量

此任務示範如何在 Istio 網格中為 HTTP 流量設定 ALLOW 操作的 Istio 授權政策。

開始之前

在開始此任務之前,請執行以下操作

部署 Bookinfo 應用程式後,請前往 http://$GATEWAY_URL/productpage 的 Bookinfo 產品頁面。在產品頁面上,您可以看到以下區段

  • 頁面中間的書籍詳細資訊,包括:書籍類型、頁數、出版商等。
  • 頁面底部的書籍評論

當您重新整理頁面時,應用程式會在產品頁面中顯示不同版本的評論。應用程式以循環方式呈現評論:紅色星星、黑色星星或沒有星星。

使用 HTTP 流量設定工作負載的存取控制

使用 Istio,您可以輕鬆地為網格中的工作負載設置訪問控制。此任務將向您展示如何使用 Istio 授權設置訪問控制。首先,您將配置一個簡單的 allow-nothing 策略,該策略會拒絕所有對工作負載的請求,然後逐步增加對該工作負載的訪問權限。

  1. 執行以下命令,在 default 命名空間中建立一個 allow-nothing 策略。該策略沒有 selector 欄位,這表示該策略會應用於 default 命名空間中的每個工作負載。該策略的 spec: 欄位具有空值 {}。該值表示不允許任何流量,實際上是拒絕所有請求。

    $ kubectl apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: allow-nothing
      namespace: default
    spec:
      {}
    EOF
    

    在瀏覽器中開啟 Bookinfo 的 productpage (http://$GATEWAY_URL/productpage)。您應該會看到 "RBAC: access denied"。此錯誤表示已配置的 deny-all 策略正在按預期工作,並且 Istio 沒有任何規則允許對網格中的工作負載進行任何訪問。

  2. 執行以下命令,建立一個 productpage-viewer 策略,允許使用 GET 方法存取 productpage 工作負載。該策略未在 rules 中設定 from 欄位,表示允許所有來源,實際上是允許所有使用者和工作負載。

    $ 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:
      - to:
        - operation:
            methods: ["GET"]
    EOF
    

    在瀏覽器中開啟 Bookinfo 的 productpage (http://$GATEWAY_URL/productpage)。現在,您應該會看到「Bookinfo Sample」頁面。但是,您可以在頁面上看到以下錯誤:

    • 擷取產品詳細資訊時發生錯誤
    • 在頁面上顯示 擷取產品評論時發生錯誤

    這些錯誤是預期的,因為我們尚未授予 productpage 工作負載存取 detailsreviews 工作負載的權限。接下來,您需要配置一個策略,以授予對這些工作負載的訪問權限。

  3. 執行以下命令,建立 details-viewer 策略,以允許使用 cluster.local/ns/default/sa/bookinfo-productpage 服務帳戶發出請求的 productpage 工作負載,透過 GET 方法存取 details 工作負載。

    $ kubectl apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: "details-viewer"
      namespace: default
    spec:
      selector:
        matchLabels:
          app: details
      action: ALLOW
      rules:
      - from:
        - source:
            principals: ["cluster.local/ns/default/sa/bookinfo-productpage"]
        to:
        - operation:
            methods: ["GET"]
    EOF
    
  4. 執行以下命令,建立一個名為 reviews-viewer 的策略,以允許使用 cluster.local/ns/default/sa/bookinfo-productpage 服務帳戶發出請求的 productpage 工作負載,透過 GET 方法存取 reviews 工作負載。

    $ kubectl apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: "reviews-viewer"
      namespace: default
    spec:
      selector:
        matchLabels:
          app: reviews
      action: ALLOW
      rules:
      - from:
        - source:
            principals: ["cluster.local/ns/default/sa/bookinfo-productpage"]
        to:
        - operation:
            methods: ["GET"]
    EOF
    

    在瀏覽器中開啟 Bookinfo 的 productpage (http://$GATEWAY_URL/productpage)。現在,您應該會看到「Bookinfo Sample」頁面,左下角顯示「Book Details」,右下角顯示「Book Reviews」。但是,「Book Reviews」部分中,會出現錯誤 Ratings service currently unavailable

    這是因為 reviews 工作負載沒有存取 ratings 工作負載的權限。若要修正此問題,您需要授予 reviews 工作負載存取 ratings 工作負載的權限。接下來,我們將配置一個策略以授予 reviews 工作負載該權限。

  5. 執行以下命令,建立 ratings-viewer 策略,以允許使用 cluster.local/ns/default/sa/bookinfo-reviews 服務帳戶發出請求的 reviews 工作負載,透過 GET 方法存取 ratings 工作負載。

    $ kubectl apply -f - <<EOF
    apiVersion: security.istio.io/v1
    kind: AuthorizationPolicy
    metadata:
      name: "ratings-viewer"
      namespace: default
    spec:
      selector:
        matchLabels:
          app: ratings
      action: ALLOW
      rules:
      - from:
        - source:
            principals: ["cluster.local/ns/default/sa/bookinfo-reviews"]
        to:
        - operation:
            methods: ["GET"]
    EOF
    

    在瀏覽器中開啟 Bookinfo 的 productpage (http://$GATEWAY_URL/productpage)。您應該會在「Book Reviews」部分看到「黑色」和「紅色」的評級。

    恭喜! 您已成功套用授權策略,以使用 HTTP 流量強制執行工作負載的存取控制。

清理

從您的組態中移除所有授權策略

$ kubectl delete authorizationpolicy.security.istio.io/allow-nothing
$ kubectl delete authorizationpolicy.security.istio.io/productpage-viewer
$ kubectl delete authorizationpolicy.security.istio.io/details-viewer
$ kubectl delete authorizationpolicy.security.istio.io/reviews-viewer
$ kubectl delete authorizationpolicy.security.istio.io/ratings-viewer
此資訊是否有用?
您有任何改進建議嗎?

感謝您的回饋!