HTTP 流量
此任務示範如何在 Istio 網格中為 HTTP 流量設定 ALLOW
操作的 Istio 授權政策。
開始之前
在開始此任務之前,請執行以下操作
閱讀 Istio 授權概念。
依照Istio 安裝指南安裝已啟用雙向 TLS 的 Istio。
部署 Bookinfo 範例應用程式。
部署 Bookinfo 應用程式後,請前往 http://$GATEWAY_URL/productpage
的 Bookinfo 產品頁面。在產品頁面上,您可以看到以下區段
- 頁面中間的書籍詳細資訊,包括:書籍類型、頁數、出版商等。
- 頁面底部的書籍評論。
當您重新整理頁面時,應用程式會在產品頁面中顯示不同版本的評論。應用程式以循環方式呈現評論:紅色星星、黑色星星或沒有星星。
使用 HTTP 流量設定工作負載的存取控制
使用 Istio,您可以輕鬆地為網格中的工作負載設置訪問控制。此任務將向您展示如何使用 Istio 授權設置訪問控制。首先,您將配置一個簡單的 allow-nothing
策略,該策略會拒絕所有對工作負載的請求,然後逐步增加對該工作負載的訪問權限。
執行以下命令,在
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 沒有任何規則允許對網格中的工作負載進行任何訪問。執行以下命令,建立一個
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
工作負載存取details
和reviews
工作負載的權限。接下來,您需要配置一個策略,以授予對這些工作負載的訪問權限。執行以下命令,建立
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
執行以下命令,建立一個名為
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
工作負載該權限。執行以下命令,建立
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