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