Ambient Meshモードにおける認証と認可の構成モデルは、レイヤー 4 とレイヤー 7 が分離されているため、元のSidecarモードとは異なります。このトピックでは、レイヤー 7 認証ポリシーの使用方法について説明します。
前提条件
イングレスゲートウェイと関連アプリケーションがデプロイされ、基本機能が検証されていること。詳細については、スタートガイドの「前提条件」と「手順 1」をご参照ください。
制限事項
ウェイポイントプロキシの認証ポリシーには、次の制限が適用されます。
action
フィールドをCUSTOM
に設定することはできません。これは、ウェイポイントプロキシがカスタム認証サービスをサポートしていないことを示します。source
フィールドでは、ipBlocks
はサポートされていません。
ウェイポイントプロキシがデプロイされている場合、対応するztunnelはウェイポイントプロキシからのすべての要求を通過させます。この場合、認証ポリシーを有効にするには、認証ポリシーをウェイポイントプロキシにバインドする必要があります。
準備
V1.21 以前の Service Mesh(ASM)インスタンスの場合
次のコマンドを実行して、productpage サービスのウェイポイントプロキシをデプロイします。
istioctl x waypoint apply --service-account bookinfo-productpage
次のコマンドを実行して、ウェイポイントプロキシのポッドを表示します。
kubectl get pod --show-labels | grep waypoint
期待される出力:
bookinfo-productpage-istio-waypoint-6c579dd48d-l**** 1/1 Running 0 91s gateway.istio.io/managed=istio.io-mesh-controller,istio.io/gateway-name=bookinfo-productpage,pod-template-hash=6c579dd48d,service.istio.io/canonical-name=bookinfo-productpage-istio-waypoint,service.istio.io/canonical-revision=latest,sidecar.istio.io/inject=false
V1.22 以降の ASM インスタンスの場合
次の内容を使用して、ゲートウェイをデプロイします。
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: labels: istio.io/waypoint-for: service name: waypoint namespace: default spec: gatewayClassName: istio-waypoint listeners: - name: mesh port: 15008 protocol: HBONE
次のコマンドを実行して、productpage サービスのウェイポイントプロキシをデプロイします。
kubectl label service productpage istio.io/use-waypoint=waypoint
例 1:productpage サービスにウェイポイントプロキシがデプロイされている場合、ztunnel の認証ポリシーは有効になりません。
productpage サービスにウェイポイントプロキシがデプロイされている場合、対応する ztunnel は productpage サービスのウェイポイントプロキシからのすべてのトラフィックを通過させます。この場合、認証ポリシーが ztunnel に適用されている(アプリケーションポッドが認証ポリシーの selector
によって選択されている)場合、認証ポリシーは有効になりません。
次の内容を使用して、productpage-viewer.yaml ファイルを作成します。
次の認証ポリシーは、対応する ztunnel に適用され、productpage サービスのポート 9080 へのアクセスを禁止します。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: app: productpage action: DENY rules: - to: - operation: ports: - "9080"
kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して認証ポリシーを作成します。
kubectl apply -f productpage-viewer.yaml
認証ポリシーが有効になっているかどうかを確認します。
次のコマンドを実行して、アクセステストを実行します。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/| grep -o "<title>.*</title>"
期待される出力:
command terminated with exit code 56
次のコマンドを実行して、アクセステストを実行します。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/ | grep -o "<title>.*</title>"
期待される出力:
<title>Simple Bookstore App</title>
上記のテストと例 2:productpage サービスのポート 9080 へのアクセスを禁止する(ウェイポイントプロキシがデプロイされていない)のテストでは、同じ認証ポリシーを使用しています。ただし、上記のテストでは、productpage サービスのポート 9080 へのすべてのアクセスが成功しました。
上記の結果は、ウェイポイントプロキシをデプロイした後、ztunnel のすべての認証ポリシーが無効になることを示しています。
productpage-viewer.yaml ファイルを次の内容に変更し、
kubectl apply -f productpage-viewer.yaml
コマンドを実行して認証ポリシーをデプロイします。V1.21 以前の ASM インスタンスの場合
次の YAML ファイルでは、
selector
フィールドの構成が変更されています。apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: ports: - "9080"
V1.22 以降の ASM インスタンスの場合
次の YAML ファイルでは、目的のサービスが指定されています。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: DENY rules: - to: - operation: ports: - "9080"
認証ポリシーが有効になっているかどうかを確認します。
次のコマンドを実行して、アクセステストを実行します。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/
期待される出力:
RBAC: access denied%
次のコマンドを実行して、アクセステストを実行します。
kubectl exec deploy/notsleep -- curl -s http://productpage:9080/
期待される出力:
RBAC: access denied%
ここで返されるエラーメッセージは
RBAC: access denied%
で、「レイヤー 4 認証と認可」トピックの例 2:productpage サービスのポート 9080 へのアクセスを禁止するとは異なります。このエラーは、実際には productpage サービスのウェイポイントプロキシによって返されます。ウェイポイントプロキシは、ポート 9080 へのアクセスが拒否されていることを検出すると、HTTP 403 ステータスコードで HTTP RBAC エラーを返します。
次のコマンドを実行して、認証ポリシーを削除します。
kubectl delete authorizationpolicy productpage-viewer
例 2:sleep ポッドの IP アドレスが productpage サービスに直接アクセスすることを禁止する
現在、ウェイポイントプロキシで構成された認証ポリシーは、ipBlocks
フィールドをサポートしておらず、remoteIpBlocks
フィールドのみをサポートしています。ゲートウェイを通過するリクエストと一致させるには、remoteIpBlocks
フィールドのみを構成できます。
次の内容で productpage-viewer.yaml ファイルを作成し、sleep ポッドが productpage サービスにアクセスすることを禁止します。
V1.21 以前の ASM インスタンスの場合
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - from: - source: remoteIpBlocks: - "${sleep Pod IP}"
V1.22 以降の ASM インスタンスの場合
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: DENY rules: - from: - source: remoteIpBlocks: - "${sleep Pod IP}"
kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して認証ポリシーを作成します。
kubectl apply -f productpage-viewer.yaml
認証ポリシーが有効になっているかどうかを確認します。
次のコマンドを実行して、アクセステストを実行します。
kubectl exec deploy/sleep -- curl -s http://productpage:9080/ -I
期待される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Fri, 19 Jul 2024 08:17:08 GMT server: istio-envoy
期待される出力は、sleep ポッドが productpage サービスに直接アクセスすることも、ゲートウェイ経由でアクセスすることもできないことを示しています。
次のコマンドを実行して、認証ポリシーを削除します。
kubectl delete authorizationpolicy productpage-viewer
例 3:HEAD メソッドが /productpage パスにアクセスすることを禁止する
次の内容を使用して productpage-viewer.yaml ファイルを作成します。
V1.21 以前の ASM インスタンスの場合
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: selector: matchLabels: istio.io/gateway-name: bookinfo-productpage action: DENY rules: - to: - operation: methods: ["HEAD"] paths: ["/productpage"]
V1.22 以降の ASM インスタンスの場合
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: productpage-viewer namespace: default spec: targetRefs: - kind: Service group: "" name: productpage action: DENY rules: - to: - operation: methods: - "HEAD" paths: - "/productpage"
kubeconfig ファイルの情報に基づいて kubectl を使用して ASM インスタンスに接続し、次のコマンドを実行して認証ポリシーを作成します。
kubectl apply -f productpage-viewer.yaml
認証ポリシーが有効になっているかどうかを確認します。
次のコマンドを実行して、HEAD メソッドを使用して
/productpage
パスにアクセスします。kubectl exec deploy/sleep -- curl -s productpage:9080/productpage -I
期待される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 15 Aug 2024 12:20:51 GMT server: istio-envoy
次のコマンドを実行して、GET メソッドを使用して
/productpage
パスにアクセスします。kubectl exec deploy/sleep -- curl -s productpage:9080/productpage | grep -o "<title>.*</title>"
期待される出力:
<title>Simple Bookstore App</title>
/productpage
パスへのアクセスは成功です。次のコマンドを実行して、HEAD メソッドを使用して
/
パスにアクセスします。kubectl exec deploy/sleep -- curl -s productpage:9080/ -I
期待される出力:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 15 Aug 2024 12:23:17 GMT content-type: text/html; charset=utf-8 content-length: 1743 x-envoy-upstream-service-time: 2
次のコマンドを実行して、認証ポリシーを削除します。
kubectl delete authorizationpolicy productpage-viewer