【入門編】 クライアントレスZTNA(ブラウザベース方式)のリバースプロキシ制御 – ゼロトラスト&エンタープライズセキュリティ実践ガイド

こんにちは!技術メディアの主筆ライターであり、日々ネットワークパケットの海を泳ぎ回っているセキュリティスペシャリストです。

テレワークやハイブリッドワークがすっかり定着した今、企業のネットワークセキュリティは大きな転換期を迎えています。これまで主流だった「VPN(仮想専用線)」に代わり、今熱い視線を浴びているのが「ゼロトラスト・ネットワーク・アクセス(ZTNA)」です。

その中でも、PCやスマートフォンに特別なアプリ(専用エージェント)を一切インストールせず、普段使っているGoogle ChromeやSafariなどの「標準ブラウザ」だけで社内システムに安全にアクセスできるようにする「クライアントレスZTNA(ブラウザベース方式)」が、導入の手軽さから非常に人気を集めています。

「えっ、アプリを入れないのに、どうやって社内の大切なWebアプリを守っているの?」
「インターネット越しなのに、なぜ安全に通信できるの?」

そんな疑問が湧いてきますよね。今回は、インフラやネットワークに初めて触れるエンジニアのあなたに向けて、この魔法のような仕組みの舞台裏にある「リバースプロキシ制御」について、難しい専門用語をできるだけ身近な例えに置き換えて、一歩ずつ丁寧に紐解いていきましょう!

—

1. 「クライアントレスZTNA」を身近な例えで理解しよう

まずは、全体像をイメージしやすいように、現実世界の仕組みに例えてみます。

あなたが、セキュリティがものすごく厳しい「超高級ホテル(社内Webシステム)」に宿泊しているVIPに、大事な手紙を届けたいとします。

通常のVPNは、「ホテル専用の地下トンネルを掘って、直接部屋の前まで行く方法」です。確かに安全ですが、トンネルを掘る工事(専用アプリのインストールや設定)が大変ですし、一度トンネルに入ってしまえば、ホテル内の他の部屋にも忍び込めてしまうリスクがあります。

一方、今回ご紹介する「クライアントレスZTNA(リバースプロキシ方式)」は、「ホテルの優秀なコンシェルジュ(リバースプロキシ)が、玄関で代わりにすべてを仲介する方法」になります。

【ユーザー(ブラウザ)】
      │
      │ 「社内Wikiを見せて!」(インターネット経由のアクセス)
      ▼
【コンシェルジュ(リバースプロキシ / ZTNAゲートウェイ)】★ここで認証・チェック
      │
      │ 「よし、本人確認OK!私が代わりに取ってきてあげるよ」
      ▼
【社内Webシステム】(外からは見えない安全な部屋)

1. あなた(ブラウザ)は、ホテルの外にある「受付カウンター(ZTNAゲートウェイ)」に行きます。
2. 受付で「私はこういう者です」と身分証明書を見せて、IDカード(認証情報)を受け取ります。
3. 受付のコンシェルジュは、奥の部屋(社内システム)から情報を持ってきて、あなたに手渡します。

このとき、あなた(ブラウザ)はホテルの奥深く(社内ネットワーク)に一歩も足を踏み入れていません。 すべてのやり取りは、受付カウンター越しに行われているのです。これが「クライアントレス(エージェント不要)」で安全性が高いと言われる最大の理由です。

—

2. 舞台裏で大活躍する「リバースプロキシ」の仕事

では、ネットワークの世界でこの「優秀なコンシェルジュ」の役割を果たす「リバースプロキシ」は、具体的にどのような仕事をしているのでしょうか。

インターネット上のブラウザと、社内にあるWebアプリの間で、彼らは主に2つの重要な仕事をこなしています。

仕事①:宛名シールの貼り替え(ヘッダー情報の書き換え)

ブラウザから送られてくるリクエスト(郵便物)には、送信元のIPアドレス(差出人の住所)や、様々な制御情報が書かれています。

リバースプロキシは、この郵便物を一度受け取ると、中身の安全性をチェックした上で、「差出人をリバースプロキシ自身の住所」に書き換えて社内サーバーへ転送します。これにより、社内サーバーはインターネット上の個人のパソコンと直接通信する必要がなくなり、常にリバースプロキシとだけやり取りすれば良くなります。

仕事②:看板の書き換え(URL書き換え / HTML書き換え)

社内Webアプリの本来の住所が http://internal-wiki.local/(社内からしか見えない住所)だったとします。当然、外のインターネットにいるブラウザは、この住所の名前を知りませんし、直接アクセスもできません。

そこでリバースプロキシは、ブラウザに対して「外から見える仮の住所(例:https://wiki.ztna-gateway.com/)」を用意します。

ブラウザがその仮の住所にアクセスすると、リバースプロキシが裏側で「あ、これはあの社内Wikiのことだな」と翻訳して、社内の本物のサーバーへ繋いでくれるのです。

—

3. 【実践】Nginxで構築する「クライアントレスZTNA風」設定シート

「言葉の意味は分かったけれど、実際のインフラ設定ではどう書くのだろう?」

そう思ったあなたのために、Webサーバーとして広く使われているNginx(エンジンエックス)を使って、この「コンシェルジュ(リバースプロキシ)」の設定を再現してみましょう。

実務でもそのまま参考にできる、分かりやすいコメント付きの設定例です。一歩ずつ読んでみてくださいね。

# クライアントレスZTNAの「ゲートウェイ(受付窓口)」となるサーバーの設定
server {
    # 1. 外のインターネットから安全に(HTTPS:443番ポート)受け付けます
    listen 443 ssl;
    server_name wiki.ztna-gateway.com; # 外から見える仮の住所

    # SSL/TLS証明書の設定(通信の暗号化。コンシェルジュとお客様の会話を暗号化します)
    ssl_certificate /etc/nginx/certs/ztna_gateway.crt;
    ssl_certificate_key /etc/nginx/certs/ztna_gateway.key;

    # 2. アクセスしてきた「人」をチェックするエリア
    location / {
        # 【重要】ここで本来はZTNAの認証(多要素認証など)を挟みます。
        # 今回は、認証をクリアした前提で、奥の「社内Webアプリ」へ転送(プロキシ)します。

        # 3. コンシェルジュが奥の部屋(社内アプリ)にアクセスする設定
        proxy_pass http://internal-wiki.local:8080; # 本物の社内アプリの住所

        # 4. 配送伝票(ヘッダー)の書き換え処理
        # 社内サーバーに対して、アクセス元の正しい情報を「伝票のメモ欄」に書いて渡します。
        
        # 「外のブラウザがアクセスしようとした、元のホスト名(看板)」を維持します
        proxy_set_header Host $host;

        # 「本当の差出人(ユーザーのIPアドレス)」をメモして、社内アプリに教えてあげます
        proxy_set_header X-Real-IP $remote_addr;

        # これまで経由してきたルートの記録(配送履歴)を追加します
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 通信プロトコル(HTTPかHTTPSか)を社内アプリに伝えます
        proxy_set_header X-Forwarded-Proto $scheme;

        # 5. セキュリティをさらに高めるための隠し味(レスポンスヘッダーの追加)
        # ブラウザに対して「怪しい動き(クリックジャッキングなど)は禁止だよ!」と命令します
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Content-Type-Options "nosniff" always;
    }
}

この設定ファイルを適用すると、ユーザーが https://wiki.ztna-gateway.com にアクセスした際、Nginxがコンシェルジュとなって、裏側の http://internal-wiki.local:8080 から安全にデータを持ってきてブラウザに表示してくれるようになります。

—

4. 現場のプロが教える「クライアントレス方式」の落とし穴

とても便利でスマートに見えるクライアントレスZTNAですが、実際の現場で導入する際には、いくつかの「落とし穴」があります。これを知っておくと、トラブルシューティングの際に「デキるエンジニア」として一目置かれること間違いなしです!

⚠️ 落とし穴:複雑なWebアプリで「リンク切れ」が起きる

最近のWebシステムは、JavaScriptなどを使って、ブラウザの中で複雑に画面を書き換えるものが増えています(SPA:シングルページアプリケーションなど)。

リバースプロキシがHTML内のURLをいくら綺麗に書き換えても、JavaScriptのプログラムの中に「生々しい社内用のURL(http://internal-wiki.local/)」が直接書き込まれていると、リバースプロキシはその存在に気づけません。

その結果、画面の一部にあるボタンを押した瞬間に、「お探しのページが見つかりません(404 Not Found)」となってしまう、いわゆる「迷子」現象が発生することがあります。

> プロからのアドバイス:
> クライアントレスZTNAを導入する際は、対象となる社内Webアプリが「標準的なHTMLで動いているか」「JavaScriptによる複雑な動的URL生成を行っていないか」を、事前にテスト環境でよく確認しておくことが成功の秘訣です!

—

まとめ:一歩ずつ進めば怖くない!

今回は、ゼロトラストアーキテクチャの強力な一翼を担う「クライアントレスZTNA」の仕組みについて、リバースプロキシの制御に焦点を当てて解説しました。

  • クライアントレスZTNAは、専用アプリ不要でブラウザだけで使える便利な仕組み。
  • その心臓部であるリバースプロキシは、「ホテルのコンシェルジュ」のように、外のユーザーと奥の社内サーバーの間で安全に中継を行っている。
  • 内部では、IPアドレスやURLといった情報の書き換え・翻訳がリアルタイムに行われている。

最初は難しく感じるネットワークの制御も、こうして「郵便」や「コンシェルジュ」といった身近な役割に置き換えてみると、スッと頭に入ってきますよね。

インフラやセキュリティの世界は、パズルのピースを一つずつはめていくような楽しさがあります。焦らず、一歩ずつ理解を深めていきましょう。あなたのエンジニアとしての第一歩を、いつも応援しています!

コメント

タイトルとURLをコピーしました