HTTPトラフィック

このタスクでは、Istioメッシュ内のHTTPトラフィックに対して、ALLOWアクションのIstio認可ポリシーを設定する方法を示します。

開始前に

このタスクを開始する前に、次の手順を実行してください

Bookinfoアプリケーションをデプロイした後、http://$GATEWAY_URL/productpageのBookinfo製品ページにアクセスしてください。製品ページには、次のセクションが表示されます。

  • ページの中央にある本の詳細。本の種類、ページ数、出版社などが含まれます。
  • ページの下部にあるBook Reviews

ページをリフレッシュすると、アプリは製品ページにさまざまなバージョンのレビューを表示します。アプリは、赤の星、黒の星、または星なしのレビューをラウンドロビンスタイルで表示します。

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のproductpagehttp://$GATEWAY_URL/productpage)を開きます。"RBAC: access denied"と表示されるはずです。このエラーは、設定されたdeny-allポリシーが意図したとおりに機能しており、Istioにはメッシュ内のワークロードへのアクセスを許可するルールがないことを示しています。

  2. 次のコマンドを実行して、productpageワークロードへのGETメソッドでのアクセスを許可するproductpage-viewerポリシーを作成します。このポリシーでは、rulesfromフィールドが設定されていないため、すべてのソースが許可され、実質的にすべてのユーザーとワークロードが許可されます。

    $ 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のproductpagehttp://$GATEWAY_URL/productpage)を開きます。今度は「Bookinfo Sample」ページが表示されるはずです。ただし、ページに次のエラーが表示されます。

    • 製品詳細の取得エラー
    • 製品レビューの取得エラー

    これらのエラーは、productpageワークロードがdetailsおよびreviewsワークロードへのアクセスを許可されていないため、予期されるものです。次に、これらのワークロードへのアクセスを許可するポリシーを設定する必要があります。

  3. 次のコマンドを実行して、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
    
  4. 次のコマンドを実行して、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のproductpagehttp://$GATEWAY_URL/productpage)を開きます。これで、「Bookinfo Sample」ページの下部左側に「Book Details」が表示され、下部右側に「Book Reviews」が表示されるはずです。ただし、「Book Reviews」セクションには、エラーRatings service currently unavailableが表示されます。

    これは、reviewsワークロードがratingsワークロードへのアクセス許可を持っていないためです。この問題を解決するには、reviewsワークロードにratingsワークロードへのアクセスを許可する必要があります。次に、reviewsワークロードにアクセスを許可するポリシーを設定します。

  5. 次のコマンドを実行して、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のproductpagehttp://$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
この情報は役に立ちましたか?
改善のためのご提案はありますか?

フィードバックありがとうございます!