エンジニア諸君、ようこそ。今日は「インフラをコードで記述する」というレベルを超え、「アクセスそのものをコードで制御する」という、現代のクラウドネイティブにおける聖域に踏み込む。
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に乗せてみよう。道はまだまだ続く。応援しているよ。