【入門編】Terraformで実現するゼロトラストネットワーク:BoundaryとVaultを組み合わせた安全なアクセス制御基盤の構築 – インフラ構成管理(IaC)活用バイブル

エンジニア諸君、ようこそ。今日は「インフラをコードで記述する」というレベルを超え、「アクセスそのものをコードで制御する」という、現代のクラウドネイティブにおける聖域に踏み込む。

VPNの時代は終わった。IPアドレスをホワイトリストに登録するような手作業は、もはや負債だ。今日は、HashiCorpの至宝である Terraform, Vault, Boundary を組み合わせ、自動化されたゼロトラスト・アクセス基盤を構築する術を伝授しよう。

—

1. なぜ「この三種の神器」なのか?

まずは役割を整理しよう。ここを履き違えると、いくらコードを書いても砂上の楼閣になる。

  • Terraform: インフラの「状態」を定義する。ネットワークや仮想マシンの土台を創る役割。
  • Vault: インフラの「鍵」を司る。動的にパスワードや証明書を生成し、一瞬で捨て去る。
  • Boundary: インフラへの「入口」を制御する。IDベースで特定のサービスへの接続だけを許可し、IPを隠蔽する。

これらが連携することで、「必要な時に、必要な権限だけを、安全に発行し、即座に無効化する」という、ゼロトラストの理想郷がコードで実現できる。

—

2. 構築の全体像:動的アクセスのフロー

1. Terraform でAWS/GCP上にインフラを構築し、Boundaryの管理対象(Target)を登録する。
2. Vault に動的シークレット(DBのユーザー作成など)を仕込む。
3. ユーザーは Boundary経由 で接続。その際、Vaultが一時的な資格情報を発行し、Boundaryがそのトンネルを繋ぐ。

—

3. 実践:TerraformによるBoundaryの設定

まずは、Boundaryに「どこにアクセスさせるか」を定義するコードを見てみよう。手作業で画面をポチポチするのは今日でおしまいだ。

BoundaryのProvider設定
provider “boundary” {
addr = “https://boundary.example.com”
auth_method_id = “ampw_1234567890” # 事前に作成した認証ID
}

1. スコープ(プロジェクトの箱)の作成
resource “boundary_scope” “core” {
name = “production-core”
description = “本番環境のアクセス制御スコープ”
scope_id = “global”
}

2. ホストカタログ(接続先マシンのリスト)
resource “boundary_host_catalog_static” “db_catalog” {
name = “database-servers”
scope_id = boundary_scope.core.id
}

3. ホスト登録(ここにIPを定義。動的に取得も可能だ)
resource “boundary_host” “db_host” {
name = “db-master”
host_catalog_id = boundary_host_catalog_static.db_catalog.id
address = “10.0.1.5”
}

4. ターゲット(接続の出口)の定義
resource “boundary_target” “db_access” {
name = “db-postgres-access”
type = “tcp”
default_port = “5432”
scope_id = boundary_scope.core.id
host_source_ids = [boundary_host_catalog_static.db_catalog.id]
}

ここが重要:
`boundary_target` を定義することで、ユーザーは「10.0.1.5」というIPを知る必要がなくなる。ユーザーが見るのは「db-postgres-access」という名前だけだ。これがゼロトラストの第一歩である。

—

4. Vaultとの連携:魔法の「動的シークレット」

次に、Vaultと連携させてみよう。TerraformでVaultのデータベースエンジンを有効化する。

Vaultへの接続設定
provider “vault” {
address = “https://vault.example.com”
}

Postgresエンジンを有効化
resource “vault_database_secret_backend” “db” {
path = “database”
}

ロールの作成(接続時に自動生成されるユーザーの権限)
resource “vault_database_secret_backend_role” “boundary_role” {
backend = vault_database_secret_backend.db.path
name = “boundary-user”
db_name = “postgresql”
creation_statements = [
“CREATE ROLE \”{{name}}\” WITH LOGIN PASSWORD ‘{{password}}’ VALID UNTIL ‘{{expiration}}’;”,
“GRANT SELECT ON ALL TABLES IN SCHEMA public TO \”{{name}}\”;”
]
}

これを構築すると、ユーザーが接続するたびに、「5分間だけ有効な使い捨てのDBユーザー」が生成される。もし接続情報が漏洩しても、5分後にはゴミ箱行きだ。これこそが、僕たちが追い求める「安全」の正体だ。

—

5. 動作確認:エンジニアの誇り

構築が完了したら、以下のコマンドで接続を試してほしい。

Boundaryへログイン
boundary authenticate password -auth-method-id=ampw_…

DBへの安全なトンネルを開通
boundary connect postgres -target-id=ttcp_…

成功すれば、ローカルの `localhost:5432` 経由で、セキュアに本番DBへ接続できているはずだ。認証も、認可も、ネットワークパスも、すべてコードによって管理されている。

—

最後に:自動化の先にある未来

ここまで読んでくれた君なら気づいているはずだ。この構成の真の価値は、「人間がインフラに直接触れる機会をゼロにする」ことにある。

Terraformで構成を書き、Vaultで鍵を動的に生成し、Boundaryで接続を制御する。このサイクルをマスターすれば、君は「作業者」から「インフラの設計者」へと昇華できる。

最初は複雑に見えるかもしれない。だが、一度この「コードによる支配」を体験してしまえば、もう二度と手動でVPNの設定をいじる生活には戻れないはずだ。

次は、GitHub Actionsと連携させて、このIaCフローをCI/CDに乗せてみよう。道はまだまだ続く。応援しているよ。

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