HTTPトラフィック
このタスクでは、Istioメッシュ内のHTTPトラフィックに対して、ALLOWアクションのIstio認可ポリシーを設定する方法を示します。
開始前に
このタスクを開始する前に、次の手順を実行してください
Istio認可の概念をお読みください。
相互TLSを有効にしてIstioをインストールするには、Istioインストールガイドに従ってください。
Bookinfoサンプルアプリケーションをデプロイします。
Bookinfoアプリケーションをデプロイした後、http://$GATEWAY_URL/productpageのBookinfo製品ページにアクセスしてください。製品ページには、次のセクションが表示されます。
- ページの中央にある本の詳細。本の種類、ページ数、出版社などが含まれます。
- ページの下部にあるBook Reviews。
ページをリフレッシュすると、アプリは製品ページにさまざまなバージョンのレビューを表示します。アプリは、赤の星、黒の星、または星なしのレビューをラウンドロビンスタイルで表示します。
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ワークロードへのGETメソッドでのアクセスを許可するproductpage-viewerポリシーを作成します。このポリシーでは、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ワークロードへのアクセスを許可されていないため、予期されるものです。次に、これらのワークロードへのアクセスを許可するポリシーを設定する必要があります。次のコマンドを実行して、
cluster.local/ns/default/sa/bookinfo-productpageサービスアカウントを使用してリクエストを発行するproductpageワークロードが、GETメソッドを通じてdetailsワークロードにアクセスできるようにするdetails-viewerポリシーを作成します。$ 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次のコマンドを実行して、
cluster.local/ns/default/sa/bookinfo-productpageサービスアカウントを使用してリクエストを発行するproductpageワークロードが、GETメソッドを通じてreviewsワークロードにアクセスできるようにするreviews-viewerポリシーを作成します。$ 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ワークロードにアクセスを許可するポリシーを設定します。次のコマンドを実行して、
cluster.local/ns/default/sa/bookinfo-reviewsサービスアカウントを使用してリクエストを発行するreviewsワークロードが、GETメソッドを通じてratingsワークロードにアクセスできるようにするratings-viewerポリシーを作成します。$ 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