認可ポリシーの適用

アプリケーションをアンビエントメッシュに追加した後、レイヤー4認可ポリシーを使用してアプリケーションアクセスを保護できます。

この機能を使用すると、メッシュ内のすべてのワークロードに自動的に発行されるクライアントワークロードIDに基づいて、サービスへのアクセスとサービスからのアクセスを制御できます。

レイヤー4認可ポリシーの適用

productpageサービスとの通信を許可するサービスを制限する認可ポリシーを作成しましょう。このポリシーは、app: productpageラベルを持つポッドに適用され、サービスアカウントcluster.local/ns/default/sa/bookinfo-gateway-istioからの呼び出しのみを許可します。(これは、前のステップでデプロイしたBookinfoゲートウェイで使用されるサービスアカウントです。)

$ 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:
  - from:
    - source:
        principals:
        - cluster.local/ns/default/sa/bookinfo-gateway-istio
EOF

ブラウザでBookinfoアプリケーション(https://127.0.0.1:8080/productpage)を開くと、以前と同じように製品ページが表示されます。ただし、別のサービスアカウントからproductpageサービスにアクセスしようとすると、エラーが表示されます。

curlポッドからBookinfoアプリケーションにアクセスしてみましょう。

$ kubectl apply -f samples/curl/curl.yaml

curlポッドは異なるサービスアカウントを使用しているため、productpageサービスにアクセスできません。

$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage"
command terminated with exit code 56

レイヤー7認可ポリシーの適用

レイヤー7ポリシーを適用するには、まず、名前空間用のウェイポイントプロキシが必要です。このプロキシは、名前空間に入るすべてのレイヤー7トラフィックを処理します。

$ istioctl waypoint apply --enroll-namespace --wait
waypoint default/waypoint applied
namespace default labeled with "istio.io/use-waypoint: waypoint"

ウェイポイントプロキシを表示し、Programmed=Trueステータスになっていることを確認できます。

$ kubectl get gtw waypoint
NAME       CLASS            ADDRESS       PROGRAMMED   AGE
waypoint   istio-waypoint   10.96.58.95   True         42s

L7認可ポリシーを追加すると、curlサービスがproductpageサービスにGETリクエストを送信することを明示的に許可しますが、他の操作は許可しません。

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

targetRefsフィールドは、ウェイポイントプロキシの認可ポリシーの対象サービスを指定するために使用されることに注意してください。rulesセクションは以前と似ていますが、今回は許可される操作を指定するためにtoセクションを追加しました。

新しいウェイポイントプロキシが更新された認可ポリシーを適用していることを確認します。

$ # This fails with an RBAC error because we're not using a GET operation
$ kubectl exec deploy/curl -- curl -s "http://productpage:9080/productpage" -X DELETE
RBAC: access denied
$ # This fails with an RBAC error because the identity of the reviews-v1 service is not allowed
$ kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage
RBAC: access denied
$ # This works as we're explicitly allowing GET requests from the curl pod
$ kubectl exec deploy/curl -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"
<title>Simple Bookstore App</title>

次のステップ

ウェイポイントプロキシが配置されたことで、名前空間でレイヤー7ポリシーを適用できるようになりました。認可ポリシーに加えて、ウェイポイントプロキシを使用してサービス間のトラフィックを分割できます。これは、カナリアデプロイメントやA/Bテストを行う場合に役立ちます。

この情報は役立ちましたか?
改善のための提案はありますか?

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