なぜVPNは廃れつつあるのか
もし、Grafanaのダッシュボードを確認するためだけに、不安定なVPNクライアントと10分間も格闘したことがあるなら、その不満はよくわかるはずです。ユーザー体験の悪さに加え、VPNは「境界防御(城と堀)」のセキュリティモデルに依存しています。ユーザーが一度境界を越えると、ネットワーク全体への横方向のアクセス(ラテラルムーブメント)を許してしまうことが多く、これが重大なセキュリティホールとなります。現代のインフラは、ユーザーの場所に関係なく、すべてのリクエストに対してIDを検証するZero Trust(ゼロトラスト)モデルへと移行しています。
PomeriumのようなIdentity-Aware Proxy(IAP)は、セキュリティをアプリケーション層に移動させることでこの問題を解決します。ユーザーはクライアントソフトを起動する代わりに、internal-tool.company.comのようなURLにアクセスするだけです。Pomeriumがトラフィックをインターセプトし、GitHubやOktaなどのIDプロバイダー(IdP)に対してユーザーセッションを検証し、特定のアクセス権限ポリシーをチェックします。これはより高速で安全であり、管理も大幅に容易になります。
なぜ本番環境でPomeriumが選ばれるのか
Pomeriumは、サービスの統合ゲートキーパーとして機能します。単一のバイナリとして動作するほど軽量でありながら、高トラフィックなエンタープライズ環境にも対応できる堅牢さを備えています。150人以上のエンジニアチームで従来のOpenVPNからPomeriumに置き換えたところ、アクセス関連のサポートチケットが40%減少しました。
主な利点は以下の通りです:
- クライアントソフトウェア不要: Webブラウザがあればアクセス可能です。macOSやLinuxで壊れたVPNドライバをトラブルシューティングする必要はもうありません。
- きめ細やかな制御: 「DevOps」GitHubチームに所属し、かつ特定の国から接続している場合にのみアクセスを許可する、といったポリシーを記述できます。
- 詳細な監査ログ: すべてのクリックとリクエストがユーザーIDに関連付けられてログに記録されます。これはネットワークレベルのVPNでは到底不可能なレベルの可視性を提供します。
環境の構築
Docker Composeを使用して、プルーフ・オブ・コンセプト(PoC)を構築します。この構成では、Pomeriumプロキシの背後にあるダミーの社内アプリケーションを保護することで、実際の運用環境をシミュレートします。ドメイン名(または編集済みの/etc/hostsファイル)と、IdPとして機能するGitHubアカウントが必要です。
1. 暗号化キーの生成
Pomeriumは、Cookieの保護と内部通信の暗号化のために、2つのユニークな32バイトのBase64エンコード文字列を必要とします。次のコマンドで素早く生成できます:
head -c32 /dev/urandom | base64
これを2回実行してください。最初の文字列をCOOKIE_SECRETとして、2番目をSHARED_SECRETとして保存します。これらは非常に重要な鍵ですので、安全に保管してください。
2. Docker Composeの設定
pomerium-labというディレクトリを作成し、以下の内容をdocker-compose.yamlファイルに保存します。これにより、プロキシと保護対象のシンプルな「Hello World」アプリが定義されます。
version: '3'
services:
pomerium:
image: cache.pomerium.io/pomerium/pomerium:latest
container_name: pomerium
volumes:
- ./config.yaml:/pomerium/config.yaml
ports:
- "443:443"
environment:
- COOKIE_SECRET=YOUR_FIRST_SECRET
- SHARED_SECRET=YOUR_SECOND_SECRET
internal-app:
image: nginxdemos/hello
container_name: internal-app
expose:
- "80"
アクセスポリシーの定義
config.yamlファイルでロジックを定義します。GitHubを使用するには、まずGitHubのDeveloper SettingsでOAuthアプリを作成する必要があります。「Authorization callback URL」をhttps://authenticate.yourdomain.com/oauth2/callbackに設定してください。
プロキシの設定
同じフォルダに、以下の構造でconfig.yamlを作成します:
address: ":443"
authenticate_service_url: https://authenticate.yourdomain.com
idp_provider: github
idp_client_id: "your-github-id"
idp_client_secret: "your-github-secret"
routes:
- from: https://internal-tool.yourdomain.com
to: http://internal-app:80
policy:
allow:
and:
- domain:
is: yourcompany.com
- github:
groups:
- "engineering-team"
このポリシーは厳格です。yourcompany.comのメールアドレスを持ち、かつGitHubの「engineering-team」のメンバーであるユーザーのみがアプリを閲覧できるようにします。それ以外のユーザーは、アプリケーションサーバーに到達する前に403 Forbiddenページが表示されます。
検証とパフォーマンス
docker-compose up -dでスタックを起動します。ツールのURLにアクセスすると、Pomeriumは標準のGitHub OAuthログインにリダイレクトします。承認されると、シームレスに社内アプリにアクセスできるようになります。
アクセスの監視
可視性はZero Trustの核心です。ログを追跡することで、アクセスの判定をリアルタイムで確認できます:
docker logs -f pomerium
成功したエントリには、ユーザーのGitHub IDとともにcheck_result: allowが表示されます。これにより、コンプライアンス(SOC2やISO27001など)のための監査が、ファイアウォールのログを掘り起こすよりも大幅に容易になります。
レイテンシとスケーリング
本番環境のテストでは、Pomeriumによるオーバーヘッドは通常、1リクエストあたり5ms〜10ms未満です。標準的なWebツールの場合、ユーザーがこれに気づくことはありません。数千人の同時実行ユーザーを処理する場合は、ロードバランサーの背後で複数のプロキシインスタンスを実行して水平スケーリングできます。Kubernetesユーザーであれば、Pomerium Ingress Controllerを使用して、標準のIngressリソース経由でこの設定全体を自動化できます。
オフボーディングの簡素化
運用上の最大の利点は、従業員の離職への対応です。エンジニアが退職し、GitHubのオーガニゼーションから削除すると、すべての社内ツールへのアクセス権が即座に消滅します。古いVPNの資格情報を探し回ったり、共有SSHキーをローテーションしたりする必要はもうありません。主要なIDプロバイダーにアクセスを一元化することで、攻撃対象領域(アタックサーフェス)と管理負荷を同時に削減できます。

