「境界線」は霧の中へ:PDP/PEP分離がもたらすゼロトラストの真髄
かつて、我々はファイアウォールの内側を「聖域」と呼び、外側を「荒野」と呼んだ。しかし、VPNという名の脆い橋は既に崩落し、クラウドネイティブな現代において、IPアドレスベースのACLで語るセキュリティはもはや遺物だ。
今日は、ゼロトラストアーキテクチャ(ZTA)の心臓部、「PDP(Policy Decision Point)」と「PEP(Policy Enforcement Point)」の分離について、インフラ屋の視点で深く潜り込んでいこう。
—
1. 脳と手足の分離:PDPとPEPの役割
ゼロトラストにおいて、アクセス制御は「判断」と「実行」に分離される。
- PDP(ポリシー決定ポイント): ユーザーのコンテキスト、デバイスの健全性、リスクスコアを元に「アクセス可否」を計算する「脳」。
- PEP(ポリシー実行ポイント): PDPの判断に基づき、パケットをゲートウェイで遮断あるいは転送する「手足」。
なぜ分離するのか? それはスケーラビリティと、セキュリティの集中管理を両立させるためだ。PEPはエッジに分散させ、PDPは中央でインテリジェンスを集約する。この分離こそが、トラフィックを遅延させずにゼロトラストを実現する唯一の解となる。
—
2. パケットレベルの深淵:TLSハンドシェイクの最適化
PEPにおいて最も頭を悩ませるのが、TLSハンドシェイクによるRTT(往復時間)の増大だ。PDPへの問い合わせ(APIコール)と、ユーザーからの接続要求。これらが直列に行われると、TCPの3ウェイハンドシェイクとTLSのネゴシエーションが重なり、アプリケーションの体感速度は地に落ちる。
ここで我々が取るべき戦術は、「TLS Termination at the PEP」と、「PDPへの事前問い合わせ(Pre-fetching)」の最適化だ。
PEPでの最適化パラメーター(sysctl例)
LinuxカーネルでPEPを構築する場合、TCPスタックのチューニングは必須だ。TCP_FASTOPENを有効にし、初期ハンドシェイクのRTTを削り取る。
# TCP Fast Openを有効化 (クライアント・サーバー双方でサポートが必要)
sysctl -w net.ipv4.tcp_fastopen=3
# TCPバッファの最適化:高遅延環境でもスループットを維持する
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
—
3. ヘッダー圧縮とコンテキスト注入
PDPの判断結果をPEPに伝える際、HTTPヘッダーの肥大化は無視できない。数百バイトのセキュリティトークン(JWT等)を毎リクエスト付与すれば、帯域の無駄遣いになる。
ここで活用すべきは HPACK や QPACK といったヘッダー圧縮アルゴリズムだ。PEPは、PDPから発行された短命なセッションIDを元に、内部でコンテキストをキャッシュする。
実装のヒント:PEPでのサイドカー連携
Envoy ProxyをPEPとして使用する場合、Luaフィルタを用いてPDPの判断結果をキャッシュし、ヘッダーのオーバーヘッドを最小化する。
-- Envoy Luaフィルタ例: PDPの判断結果をキャッシュし、ヘッダーを注入
function envoy_on_request(request_handle)
local session_token = request_handle:headers():get("X-ZTNA-Session")
local cache_entry = my_cache:get(session_token)
if cache_entry then
-- キャッシュがあれば即時許可
request_handle:headers():replace("X-Authenticated-User", cache_entry.user)
else
-- キャッシュミス時はPDPへ非同期問い合わせ(ここがボトルネックになりやすい)
-- 非同期でPDPを叩き、結果をキャッシュに格納するロジックを配置
end
end
—
4. セキュリティの陥穽:PDP/PEP間の通信を守れ
多くのアーキテクトが犯す最大のミスは、PDPとPEPの間の通信を「内部ネットワークだから安全」と信じ込むことだ。ここが侵害されれば、攻撃者は「許可」を捏造できる。
必ず以下の施策を徹底すること。
1. mTLSの強制: PDPとPEP間の通信は、個別の証明書を発行した相互TLS(mTLS)で保護する。
2. RTT削減のためのgRPC最適化: JSON/RESTではなく、HTTP/2ベースのgRPCを採用し、コネクションの使い回し(Connection Pooling)を行う。
3. フェイルオープン回避: PDPとの通信が途絶した際、デフォルトで「拒否(Deny)」となるアーキテクチャを設計せよ。
—
終わりに:技術は泥臭い工夫の積み重ね
ゼロトラストは、単なる概念ではない。パケットがカーネルを通過し、暗号化が解かれ、ポリシーが評価されるその一瞬一瞬を、我々インフラ屋がどれだけ磨き込めるかの勝負だ。
「境界線」が消えた今、我々の仕事はファイアウォールの穴を塞ぐことではなく、ネットワークのあらゆる点に、インテリジェントな監視眼を埋め込むことにシフトしている。
次回の記事では、このPEPにおける「動的な認可(Just-in-Time Authorization)」の実装と、さらに深いレイヤー7でのトラフィック可視化について深掘りしよう。それまでは、君たちのカーネルのチューニングが、トラフィックを淀みなく流していることを願っている。
コメント