Service Mesh (ASM) のアンビエントモードでは、権限付与が 2 つのレイヤーで実施されます。レイヤー 4 ポリシーは ztunnel によって処理され、トランスポート層におけるワークロード ID を基準としたアクセス制御を実行します。一方、レイヤー 7 ポリシーはウェイポイントプロキシによって処理され、HTTP メソッドやパス制限など、HTTP レベルでの制御機能を追加します。ID を基準としたアクセス制御で十分な場合は、レイヤー 4 ポリシーをご利用ください。細かい HTTP リクエストフィルタリングが必要な場合は、ウェイポイントプロキシとレイヤー 7 ポリシーを追加してください。
本チュートリアルでは、Bookinfo サンプルアプリケーションを用いて両レイヤーの設定手順を説明します:まずレイヤー 4 でアクセスを制限し、その後ウェイポイントプロキシをデプロイしてレイヤー 7 ルールを適用します。
仕組み
ASM アンビエントモードでは、権限付与の実施を以下の 2 つのレイヤーに分離しています:
レイヤー 4(ztunnel): DaemonSet として各ノードにデプロイされる Rust 製のノード単位プロキシです。ztunnel はレイヤー 3/レイヤー 4 トラフィック(mTLS、本人確認、レイヤー 4 権限付与、およびノード上のすべての Pod の可観測性を含む)を処理します。このレイヤーのポリシーは、送信元 ID、名前空間、IP アドレスをマッチング対象としますが、HTTP 属性は対象外です。
レイヤー 7(ウェイポイントプロキシ): HTTP トラフィックを処理するオプションの Envoy 製プロキシです。HTTP メソッド、パス、またはヘッダーに基づくルールを適用する必要がある場合に、ウェイポイントをデプロイします。
両レイヤーが有効な場合、トラフィックはまず ztunnel を通過した後、ウェイポイントを通過します。このとき、レイヤー 4 ポリシーはウェイポイントの ServiceAccount を明示的に許可する必要があります。そうでない場合、ztunnel がターゲット Pod に到達する前にウェイポイントのトラフィックをブロックします。
サポートされるレイヤー 4 ポリシー属性
ztunnel は以下の属性のみを評価します。このリストに含まれない属性については、レイヤー 7 の適用には必ずウェイポイントプロキシが必要です。
| タイプ | 属性 | 肯定一致 | 否定マッチ |
|---|---|---|---|
| ソース | ピア ID | principals | notPrincipals |
| 送信元 | 名前空間 | namespaces | notNamespaces |
| 送信元 | IP ブロック | ipBlocks | notIpBlocks |
| 操作 | 宛先ポート | ports | notPorts |
レイヤー 4 とレイヤー 7 のポリシー対象指定の比較
| 項目 | レイヤー 4(ztunnel) | レイヤー 7(ウェイポイント) |
|---|---|---|
| 対象指定メカニズム | selector と matchLabels | targetRefs(サービスを指す) |
| 実施主体 | ztunnel(ノード単位の DaemonSet) | ウェイポイントプロキシ(Envoy) |
| サポートされる属性 | ID、名前空間、IP、ポート | すべてのレイヤー 4 属性 + HTTP メソッド、パス、ヘッダー |
| デプロイ要件 | なし(アンビエントモードでは常に有効) | ウェイポイントプロキシのデプロイが必要 |
HTTP レベルの属性(例:methods や paths)を含むポリシーを、selector を用いてレイヤー 4 で適用した場合(targetRefs ではなく)、ztunnel はそのポリシーを評価できず、該当するすべてのトラフィックを安全のために拒否します。HTTP レベルのルールを含むポリシーは、必ず targetRefs を使用してください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
アンビエントモードが有効化された Bookinfo サンプルアプリケーションが実行中であること。詳細については、「サンプルアプリケーションのデプロイと暗号化通信のためのアンビエントモードの有効化」をご参照ください。
テストクライアントのデプロイ
クラスター内にテストクライアントとして Sleep アプリケーションをデプロイします。
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
service: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
terminationGracePeriodSeconds: 0
serviceAccountName: sleep
containers:
- name: sleep
image: registry.cn-hangzhou.aliyuncs.com/acs/curl:8.1.2
command: ["/bin/sleep", "infinity"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: true
EOFレイヤー 4 アクセス制御の適用
レイヤー 4 ポリシーは ztunnel によって適用されます。以下の手順では、productpage へのアクセスを制限し、イングレスゲートウェイの ServiceAccount のみがアクセスできるようにします。
ステップ 1:レイヤー 4 ポリシーの適用
AuthorizationPolicy を作成し、istio-ingressgateway のみが app: productpage ラベルを持つ Pod にアクセスできるようにします。
kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: productpage-waypoint
namespace: default
spec:
targetRefs:
- kind: Service
group: ""
name: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/sleep
to:
- operation:
methods: ["GET"]
EOFステップ 2:ブラウザによるアクセスの確認
ブラウザで http://<ingress-gateway-ip>/productpage を開きます。このページは正常にロードされます。これは、リクエストがイングレスゲートウェイを経由して到達するためであり、その ServiceAccount はポリシーで許可されているからです。
ステップ 3:Sleep クライアントがブロックされることの確認
Sleep アプリケーションからリクエストを送信します。
kubectl exec deployment/sleep -- curl -s "http://productpage:9080/productpage" -I期待される出力:
command terminated with exit code 56接続はトランスポート層で拒否されます。ztunnel はレイヤー 4 で動作するため、HTTP ステータスコードは返されず、接続自体が切断されます。
ウェイポイントプロキシによるレイヤー 7 アクセス制御の追加
レイヤー 7 ポリシーにはウェイポイントプロキシが必要です。ウェイポイントをデプロイした後、名前空間にラベルを付けて、すべてのサービストラフィックをこのウェイポイント経由でルーティングするようにします。これにより、HTTP レベルでの権限付与ルールが有効になります。
ステップ 1:ウェイポイントプロキシのデプロイ
kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: waypoint
spec:
gatewayClassName: istio-waypoint
listeners:
- name: mesh
port: 15008
protocol: HBONE
EOFステップ 2:ウェイポイントの準備完了を待機
kubectl get gtwPROGRAMMED 列に True が表示されるまで待機します。
NAME CLASS ADDRESS PROGRAMMED AGE
waypoint istio-waypoint 172.16.99.15 True 2m29sステップ 3:名前空間トラフィックをウェイポイント経由でルーティング
すべてのサービストラフィックがウェイポイントを経由するよう、default 名前空間にラベルを付与します。
kubectl label namespace default istio.io/use-waypoint=waypoint --overwriteステップ 4:レイヤー 7 ポリシーの作成
このポリシーでは、Sleep アプリケーションからのみ productpage へのアクセスを許可し、かつ GET メソッドのみを許可します。
kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: productpage-waypoint
namespace: default
spec:
targetRefs:
- kind: Service
group: ""
name: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/sleep
to:
- operation:
methods: ["GET"]
EOFレイヤー 7 ポリシーでは、レイヤー 4 ポリシーで使用される selector ラベルではなく、特定のサービスにウェイポイント上でアタッチするための targetRefs を使用します。to フィールドは、許可される HTTP メソッドを制限します。
ステップ 5:ウェイポイントトラフィックを許可するようレイヤー 4 ポリシーを更新
現在、ウェイポイントプロキシがクライアントと productpage Pod の間に配置されています。ztunnel は、元のクライアントではなく、ウェイポイントをトラフィックの送信元と認識します。そのため、レイヤー 4 ポリシーを更新して、ウェイポイントの ServiceAccount を含める必要があります。
kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: productpage-ztunnel
namespace: default
spec:
selector:
matchLabels:
app: productpage
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/istio-system/sa/istio-ingressgateway
- cluster.local/ns/default/sa/waypoint
EOFステップ 6:レイヤー 7 ポリシーの確認
ポリシーが期待通りに機能することを確認するため、以下の 3 つのテストを実行します。
テスト 1:Sleep からの DELETE(拒否:メソッドが許可されていない)
kubectl exec deploy/sleep -- curl -s "http://productpage:9080/productpage" -X DELETE期待される出力:
RBAC: access deniedSleep の ServiceAccount は許可されていますが、DELETE メソッドは許可されていません。
テスト 2:reviews-v1 からの GET(拒否:ID が許可されていない)
kubectl exec deploy/reviews-v1 -- curl -s http://productpage:9080/productpage期待される出力:
RBAC: access deniedreviews-v1 の ServiceAccount はポリシーの principals に記載されていません。
テスト 3:Sleep からの GET(許可)
kubectl exec deploy/sleep -- curl -s http://productpage:9080/productpage | grep -o "<title>.*</title>"期待される出力:
<title>Simple Bookstore App</title>すべてのテスト結果がポリシー構成と一致しており、レイヤー 4 およびレイヤー 7 の権限付与ポリシーが正しく機能していることが確認できます。
次のステップ
ztunnel でサポートされるレイヤー 4 ポリシー属性について学習します。
ウェイポイントプロキシのデプロイと構成方法について確認します。