Linuxでのゼロトラスト:HashiCorp Boundaryデプロイの実践ガイド

Security tutorial - IT technology blog
Security tutorial - IT technology blog

VPNからアイデンティティベースのアクセスへの移行

VPNは大まかな制御しかできないツールです。かつてのリモートアクセス管理といえば、認証情報を配布し、パスワードが漏洩しないよう祈るだけのものででした。しかし、インフラが500ノード以上に拡大すると、この「城と堀」の戦略は崩壊します。一度VPN内に侵入すれば、サブネット全体を横方向に移動(ラテラルムーブメント)できてしまうからです。私はこれまで、午前3時にどの開発者が本番データベースを操作したのかを特定するために、ファイアウォールのログを監査して夜を明かしたことが何度もあります。

Boundaryはこの常識を覆します。どのネットワークにいるかではなく、「誰であるか」に焦点を当てます。ネットワーク全体を公開することなく、ポート5432の単一のPostgresインスタンスのような特定のターゲットに対してのみアクセスを許可します。これこそがゼロトラストの核心です。すべてを検証し、誰も信頼せず、その時のタスクに必要な権限のみを付与するのです。

アクセス戦略の比較:VPN vs 踏み台ホスト vs Boundary

ターミナルを触る前に、Boundaryが過去10年間に使われてきた手法とどう違うのかを見てみましょう。

  • VPN(仮想プライベートネットワーク): ネットワークセグメント全体へのアクセスを許可します。特定のIPへの制限には複雑で壊れやすいファイアウォールルールが必要で、それらを最新の状態に保つのは困難です。
  • 踏み台ホスト(Bastion): 単一のエントリポイントを提供します。しかし、1台の踏み台ホストで100人以上の開発者のSSH鍵を管理するのは手動作業の悪夢です。また、鍵がノートPCに永久に残るという「静的認証情報」の問題も残ります。
  • HashiCorp Boundary: アイデンティティを認識するプロキシとして機能します。ユーザーはOIDC(OktaやGitHubなど)経由で認証されます。その後、Boundaryがターゲットへの接続を直接トンネリングします。静的なSSH鍵やDBパスワードがユーザーのPCに残ることはありません。

トレードオフ

メリット

  • きめ細かな制御: たとえ両方のサーバーが同じVLAN内にあっても、ジュニア開発者にはステージングDBへのアクセスを許可し、本番環境へのアクセスをブロックするといったことが可能です。
  • 監査ログ: Boundaryはすべての接続試行をログに記録します。これにより、コンプライアンス監査は1週間の悩みの種から、わずか5分のレポート作成作業に変わります。
  • ダークサービス: データベースにパブリックIPを持たせる必要はありません。オフィスのネットワークから到達可能である必要さえなく、Boundary Workerと通信できれば十分です。

課題

  • インフラのオーバーヘッド: コントローラー、ワーカー、専用データベースなど、管理すべきコンポーネントが増えます。
  • ワークフローの変更: チームはBoundary CLIまたはデスクトップアプリを使用する必要があります。小さなハードルですが、組織内での合意形成が必要です。

アーキテクチャ

堅牢なセットアップには、以下の3つの役割を分離する必要があります。

  1. コントローラー(Controller): 頭脳。API、認証、ポリシーを管理します。
  2. ワーカー(Worker): 筋肉。ユーザーとターゲットリソース間の実際のデータをプロキシします。
  3. PostgreSQL: 状態管理。設定とセッションのメタデータを保存します。

PostgreSQLバックエンドのセットアップには、強力なマスターパスワードが必要です。私は通常、Toolcraftパスワードジェネレーターを使用して32文字の文字列を生成しています。これは完全にブラウザ上で動作するため、ルート認証情報がネットワークを流れることはありません。これにより、機密性の高いキーがサードパーティのサーバーログに残るのを防げます。

デプロイのステップバイステップ

1. Boundaryバイナリのインストール

使用しているディストリビューション用の公式HashiCorpリポジトリを取得します。この例ではUbuntu 22.04を使用します。

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install boundary

2. コントローラーの設定

BoundaryはHCL(HashiCorp Configuration Language)を使用します。コントローラーがデータベースに接続する方法を定義する必要があります。controller.hclを作成します。

disable_mlock = true

controller {
  name = "boundary-controller-01"
  description = "メインコントローラー"
  database {
    url = "postgresql://boundary_user:your_secure_password@localhost:5432/boundary"
  }
}

listener "tcp" {
  address = "0.0.0.0:9200"
  purpose = "api"
  tls_disable = true # 本番環境ではTLSを使用してください!
}

kms "aead" {
  purpose   = "root"
  aead_type = "aes-gcm"
  key       = "s3cret_key_for_dev_only"
  key_id    = "global_root"
}

複数のワーカーのIP範囲を計画している場合、このサブネット計算機がCIDRブロックの可視化に役立ちます。ワーカーノードがターゲットに対して正しいネットワークパスを持っているかを確認するのに便利です。

3. データベースの初期化

Postgresが動作している状態で、スキーマを初期化します。これにより、最初の管理者認証情報セットが生成されます。

boundary database init -config controller.hcl

プロのヒント: 出力されたログイン名とパスワードはすぐにコピーしてください。これらを再度確認するチャンスはありません。

4. サービスの起動

本番環境ではsystemdユニットファイルを使用しますが、ここではエラーを確認するために直接実行します。

boundary server -config controller.hcl

5. ワーカーのデプロイ

ワーカーはコントローラーとターゲットサーバーの両方に到達できる必要があります。worker.hclを作成します。

disable_mlock = true

worker {
  name = "boundary-worker-01"
  public_addr = "1.2.3.4" # ワーカーの到達可能なIP
  initial_upstreams = ["controller-ip:9201"]
}

listener "tcp" {
  address = "0.0.0.0:9202"
  purpose = "proxy"
  tls_disable = true
}

ジャストインタイム(JIT)アクセス

BoundaryはHashiCorp Vaultと組み合わせた時に真価を発揮します。静的なデータベースパスワードの代わりに、Boundaryはセッション終了時に期限切れとなる一時的な認証情報をリクエストします。ユーザーがパスワードを見ることはなく、Boundaryが接続に直接注入します。

例:Postgresへの接続

  1. Boundary UIで、内部DBのIPを指す**ターゲット(Target)**を定義します。
  2. そのターゲットに**認証情報ライブラリ(Credential Library)**をリンクします。
  3. boundary connect postgres -target-id t_12345を実行します。

私はBoundaryバイナリの整合性を検証するために、このハッシュジェネレーターを使用しています。デプロイスクリプトのチェックサム作成にも便利です。クライアントサイドで動作するため、ファイルのメタデータがウェブ上に漏洩する心配もありません。

現場で培われたベストプラクティス

  • TLSの強制: ここでは簡略化のために無効化しましたが、本番環境のトラフィックは必ず暗号化する必要があります。Boundaryはアイデンティティデータを扱うため、平文で流してはいけません。
  • ユーザー管理の外部委託: ユーザーを手動で作成しないでください。BoundaryをOIDCプロバイダーに接続し、従業員が退職した際などにアクセス権が自動的に取り消されるようにします。
  • レイテンシへの注意: すべてのトラフィックはワーカーを経由します。データベースクエリのレスポンスを維持するため、ワーカーはターゲットと同じクラウドリージョンに配置してください。可能な限り10ms未満のレイテンシを目指しましょう。
  • すべてをTerraformで管理: UIでポチポチ操作するのはやめましょう。BoundaryのTerraformプロバイダーを使用して、ターゲットやロールをコードとして管理します。

静的な鍵や開放されたVPNトンネルを廃止することで、攻撃対象領域(アタックサーフェス)を劇的に縮小できます。初期設定には労力を要しますが、インフラに対して得られる可視性と制御は、それに見合う価値があります。

Share: