[Istio] 暗号化されたトラフィックを開かずにルーティングする秘訣:SNIとPASSTHROUGHモード 🔒🚦

こんにちは!今日は、Istioを扱う中で出会う少し特別なルーティング方式についてお話ししたいと思います。

通常、イングレスゲートウェイ(Gateway)といえば、外部から入ってきたHTTPSの暗号を解除し(Terminating)、内容を確認した後に内部サービスへ送る役割を主に果たしますよね。

しかし、です…🤔 ゲートウェイが「私は暗号を解除しない!そのまま転送するだけだ!」と宣言すると(PASSTHROUGH)、ゲートウェイはパケット内のURLパスやヘッダーを一切見ることができません。

内容が見えないのに、どうやって目的のサービス(booking-service)を知って探し当てるのでしょうか?ここで登場するのが、まさにSNIです。


1. SNI (Server Name Indication)とは? 📨

SNIはServer Name Indicationの略で、簡単に例えるなら「暗号化された金庫(パケット)の表面に貼られた『受取人名』の付箋」のようなものです。

💡 なぜ生まれたの?

HTTPS通信はセキュリティのためにデータを暗号化します。以前は、暗号化接続(TLS Handshake)が確立されるまで、サーバーは「クライアントがどのドメインに接続したいのか」を知る方法がありませんでした。一つのサーバーIPに複数のドメイン(例: [疑わしいリンク削除済み], b.com)が接続されている場合に問題となりました。

そこで、「暗号化通信を開始するための挨拶(Client Hello)の段階で、接続したいドメインアドレス(Hostname)を平文でそっと伝えよう!」と約束された技術が、このSNIなのです。


2. コードを読み解く:PASSTHROUGHとSNIのコラボ 🤝

提示されたYAMLコードは、IstioがこのSNI情報をどのように活用するかを非常によく示しています。一つずつ見ていきましょう。

1️⃣ Gateway設定:「私は内容を見ない(パススルー)」

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: booking-gateway
spec:
  servers:
  - port:
      number: 443
      protocol: HTTPS
    hosts:
    - booking.example.com
    tls:
      mode: PASSTHROUGH  # 👈 ここがポイント!
  • mode: PASSTHROUGH: ゲートウェイに「ここでTLS暗号化を解除するな(Do not terminate)」と指示します。
  • ゲートウェイは暗号化されたデータをそのまま通過させるため、HTTPヘッダーやURLパス(/login, /payなど)を一切読み取ることができません。

2️⃣ VirtualService設定:「表面に書かれた名前(SNI)を見て配達して!」

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
spec:
  hosts:
  - booking.example.com
  tls:                # 👈 httpではなくtlsルールを使用します!
  - match:
    - port: 443
      sniHosts:       # 👈 暗号化されたパケットの表面のラベルを確認
      - booking.example.com
    route:
    - destination:
        host: booking-service
        port:
          number: 443
  • tls: HTTP内容が見えないため、httpルーティング規則の代わりにtls (TCPレベル)ルーティング規則を使用します。
  • sniHosts: ゲートウェイは内容を見ることができない代わりに、TLSハンドシェイク時にクライアントが送ったSNIフィールド(booking.example.com)を確認します。
  • 「内容は分からないけど、表面にbookingと書いてあるからbooking-serviceに送ろう!」と判断するわけです。

3. 全体動作フローの要約 🚀

この設定が適用されたとき、トラフィックは次のように旅をします。

  1. Client (ブラウザ) 💻: に接続を試みる。この時、「bookingに接続するよ」とSNIに書いて送る。
  2. Istio Gateway 🛡️: トラフィックが到着!PASSTHROUGHモードなので暗号を解除しない。代わりにSNIをそっと確認。
  3. ルーティング決定 🔀: VirtualServiceを見ると「SNIがbookingならbooking-serviceに送れ」とある。
  4. 転送 (Forwarding) 📦: 暗号化された箱をそのままbooking-serviceポッドに転送。
  5. Booking Service (Pod) 🔓: 最終目的地のポッドが直接暗号を解除し、リクエストを処理。

4. この方式はいつ使うの? (Use Cases)

通常はゲートウェイで暗号を解除しますが、以下の場合はこの方式(SNIルーティング)が必須となります。

  1. End-to-Endセキュリティ (ゼロトラスト) 🔐: ゲートウェイすら信用できず、トラフィックがポッドに到着するまで絶対に暗号が解除されてはならない場合。
  2. サービス別証明書管理 📜: ゲートウェイではなく、各サービス(Pod)が独自の証明書を直接管理する必要がある場合。

🏁 終わりに

まとめると、SNIは暗号化された世界で道に迷わないようにしてくれるナビゲーションアドレスのようなものです。

IstioでPASSTHROUGHを使うということは、ゲートウェイを「単なる配達員」にするということであり、その際、配達員が家を見つけるための唯一の手がかりがsniHosts設定であるという点を、ぜひ覚えておいてください!😉

お役に立てたら「いいね」をお願いします!



Comments

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です