「鍵を渡すな、証明を見せろ」― ゼロトラスト時代の新しい身分証、PKCEの正体
こんにちは!ネットワークセキュリティの世界へようこそ。
かつて、企業のセキュリティは「城」のようなものでした。高い壁(ファイアウォール)を築き、門番(VPN)を置いて、一度中に入れたら「味方」として信頼する……。でも、リモートワークが当たり前になった今、そんな「城」はもはや時代遅れです。
今求められているのは、「誰も信じない。アクセスするたびに、その場で本人確認をする」というゼロトラストの考え方。その要となる技術が、今回解説する「OAuth 2.0」と「PKCE(ピーシーイー)」です。
難しい専門用語は一旦脇に置いて、まずは身近な「郵便」の仕組みから紐解いていきましょう。
—
1. 昔の認証は「合言葉」を叫ぶだけだった?
これまでの認証は、IDとパスワードを相手に渡して「私は誰です」と証明するスタイルでした。しかし、これだと「合言葉」を途中で盗み見されたら終わりです。
そこで登場したのが、OAuth 2.0という仕組み。これは「あなたのIDとパスワードを直接相手に渡すのではなく、信頼できる門番から『一時的な通行証(アクセストークン)』をもらって入場する」という方法です。
でも、スマホアプリのような「パブリッククライアント」だと、この通行証を盗み取る攻撃が難しい課題として残っていました。そこで最強の助っ人として登場したのが PKCE です。
—
2. PKCEは「送る前に自分で鍵をかけておく」仕組み
PKCEの仕組みを、郵便に例えてみましょう。
1. 【準備】 あなたは大切な手紙(認可コード)を送る前に、自分で「秘密の合言葉(Code Verifier)」を作り、その「ハッシュ化された鍵(Code Challenge)」だけを先にお手紙で送ります。
2. 【交換】 門番があなたに認可コードを渡します。
3. 【最終確認】 あなたは、最初に作った「秘密の合言葉」を直接門番に提示します。
4. 【照合】 門番は「さっき送られてきた鍵と、今持ってきた合言葉が一致するな!」と確認して、ようやく通行証を渡します。
途中で誰かが手紙を盗み見ても、中身はただの「鍵の影(ハッシュ)」なので、本物の「合言葉」がない限り通行証は手に入りません。これがPKCEの魔法です。
—
3. 実装の現場を覗いてみよう(Python例)
では、実際にプログラムの世界ではどうなっているのか、少しだけ覗いてみましょう。ここでは、Pythonで「秘密の合言葉」を作る雰囲気を紹介します。
import hashlib
import base64
import os
# 1. 秘密の合言葉(Code Verifier)を生成
# 実際にはランダムな文字列を生成します
code_verifier = base64.urlsafe_b64encode(os.urandom(32)).decode('utf-8').replace('=', '')
# 2. 相手に送るための「鍵(Code Challenge)」を作る
# 合言葉をSHA-256という方法で暗号のような形式に変換します
code_challenge = hashlib.sha256(code_verifier.encode('utf-8')).digest()
code_challenge = base64.urlsafe_b64encode(code_challenge).decode('utf-8').replace('=', '')
print(f"秘密の合言葉: {code_verifier}")
print(f"相手に伝える鍵: {code_challenge}")
この code_challenge を認証リクエストと一緒にサーバーへ送ることで、通信の安全性を守っているんですね。
—
4. ゼロトラストにおける「境界」の意味が変わる
このPKCEを使った通信フローがなぜ重要なのか。それは、「どこからアクセスしても、常に厳格な検証プロセスを通すから」です。
以前の境界型防御では、「社内LANの中にいれば安心」という甘えがありました。しかし、PKCEを組み込んだZTNA(ゼロトラストネットワークアクセス)では、たとえ社内にいても、カフェにいても、スマートフォンのアプリであっても、等しく「通行証」の正当性を証明しなければなりません。
私たちが意識すべきポイント
- 通信は常に暗号化(HTTPS): パケットが盗聴される前提で動く。
- 認証情報は使い捨て: 通行証(アクセストークン)には有効期限があり、切れたら再度PKCEで検証し直す。
- 場所は関係ない: ネットワークの場所ではなく、「誰が、どんな状態の端末で」アクセスしているかを重視する。
—
最後に:セキュリティは「泥臭い」積み重ね
ネットワークエンジニアの現場では、こうした華やかなプロトコルの裏側で、「なぜか認証が通らない!」「PKCEのハッシュ計算がRFC(仕様書)通りになっていないのでは?」といったトラブルシューティングを繰り返しています。
でも、こうやって「なぜこの仕組みが必要なのか」を郵便や鍵の例えで理解しておけば、パケットが通る道のりが見えてくるはずです。
ゼロトラストは、決して魔法のような技術ではありません。一つひとつの認証の「確かさ」を積み上げていく、非常に丁寧な仕事の集合体です。ぜひ、皆さんも自分の開発環境で、この「PKCE」の流れを追いかけてみてくださいね。
また次回の記事でお会いしましょう!応援しています。
コメント