認可ポリシーの適用
アプリケーションをアンビエントメッシュに追加した後、レイヤー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テストを行う場合に役立ちます。