VPNはもう不要:PomeriumでIdentity-Aware Proxy(ID認識型プロキシ)を構築する

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

なぜ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プロバイダーにアクセスを一元化することで、攻撃対象領域(アタックサーフェス)と管理負荷を同時に削減できます。

Share: