HashiCorp Vault入門:セキュアなシークレット管理システムを構築する実践ガイド
アプリケーションのAPIキーやパスワードを安全に管理していますか?本記事では、オープンソースのシークレット管理ツール「HashiCorp Vault」の基本から、Dockerを使った具体的な構築手順、実践的な使い方までを徹底解説します。
なぜシークレット管理が必要なのか?
開発現場では、データベースのパスワード、APIキー、TLS証明書など、多くの「シークレット(機密情報)」を扱います。これらをソースコードに直接書き込む(ハードコーディング)のは、非常に危険な行為です。
- セキュリティリスク: Gitリポジトリが公開されると、第三者にシークレットが漏洩してしまいます。 管理の煩雑化: シークレットを変更するたびに、コードの修正と再デプロイが必要になります。 権限管理の欠如: 誰がどのシークレットにアクセスできるのか、詳細な制御が困難です。
これらの問題を解決するのが、シークレット管理システムです。Vaultは、その中でも特に強力で柔軟な選択肢として注目されています。
HashiCorp Vaultとは?
HashiCorp Vaultは、あらゆる種類のシークレットを安全に保管し、アクセスを厳密に制御・監査するためのツールです。静的なシークレット(例: パスワード)だけでなく、有効期間が短い動的なシークレット(例: データベースの一時的な認証情報)をオンデマンドで生成できるのが大きな特徴です。
Vaultの主要機能
| 機能 説明 | ||||
|---|---|---|---|---|
| Secure Secret Storage シークレットを暗号化してストレージに保存します。Vault自身は暗号化キーを持たず、起動時に外部から与える必要があります(Unseal)。 | Dynamic Secrets AWSやデータベースなど、連携するシステムの認証情報を動的に生成します。アクセスが不要になれば自動的に破棄されます。 | Data Encryption アプリケーションデータをVaultに送信し、暗号化・復号を行う「Encryption as a Service」機能を提供します。 | Leasing and Renewal シークレットには有効期間(Lease)が設定され、クライアントは必要に応じて期間を延長できます。 | Revocation 特定のシークレットやツリー全体のシークレットを失効させることができます。 |
Vaultのアーキテクチャと認証フロー
Vaultはクライアントからのリクエストを受け、認証と認可を行った後、ストレージバックエンドに保存されたシークレットを安全に提供します。以下は、アプリケーションがVaultからシークレットを取得する際の典型的なフローです。
実践!DockerでVaultサーバーを構築する
それでは、実際にDockerを使って開発用のVaultサーバーを立ち上げてみましょう。
1. Docker Composeファイルの準備
以下の内容で docker-compose.yml ファイルを作成します。VAULT_DEV_ROOT_TOKEN_ID を設定することで、開発モードで簡単に起動できます。 version: '3.7' services: vault: image: vault:latest container_name: vault ports: - "8200:8200" environment: VAULT_ADDR: 'http://0.0.0.0:8200' VAULT_DEV_ROOT_TOKEN_ID: 'my-root-token' cap_add: - IPC_LOCK
2. Vaultサーバーの起動
ターミナルで以下のコマンドを実行し、Vaultサーバーを起動します。 docker-compose up -d
3. CLIでVaultにアクセスする
Vault CLIからサーバーにアクセスするために、環境変数を設定します。 export VAULT_ADDR='http://127.0.0.1:8200' export VAULT_TOKEN='my-root-token'
vault status コマンドを実行して、サーバーが正常に動作していることを確認します。Initialized と Sealed の両方が true になっていれば成功です(開発モードでは自動で初期化・Unsealされます)。
基本的なシークレット管理 (KV Secrets Engine)
最も基本的なキーバリューストア(KV)を使って、シークレットの読み書きを試してみましょう。
シークレットの書き込み
secret/myapp/database というパスに、ユーザー名とパスワードを書き込みます。 vault kv put secret/myapp/database username="db-user" password="super-secret-password"
シークレットの読み込み
書き込んだシークレットを読み込みます。 vault kv get secret/myapp/database
JSON形式でデータが返却されることが確認できます。
アプリケーションからの利用例 (cURL)
アプリケーションはVaultのHTTP APIを直接利用できます。以下はcURLを使った例です。 curl --header "X-Vault-Token: my-root-token" --request GET http://127.0.0.1:8200/v1/secret/data/myapp/database
他のシークレット管理ツールとの比較
Vault以外にも、クラウドプロバイダーが提供するマネージドサービスがあります。それぞれの特徴を比較してみましょう。
| 機能/ツール HashiCorp Vault (OSS) AWS Secrets Manager Google Secret Manager Azure Key Vault | |||
|---|---|---|---|
| プラットフォーム マルチクラウド/オンプレミス AWS GCP Azure | 動的シークレット ◎ (非常に強力) ◯ (DB認証情報など) △ (限定的) ◯ (証明書など) | 価格体系 無料 (Enterprise版は有料) シークレット数とAPIコール数 シークレット数とアクセス数 キー操作数、証明書数 | オープンソース はい いいえ いいえ いいえ |
特定のクラウドに依存しない、または高度な動的シークレット機能が必要な場合はVaultが非常に有力な選択肢となります。
Vault運用のベストプラクティス
本番環境でVaultを運用する際は、以下の点を考慮することが重要です。
- 高可用性(HA)構成: 複数のVaultサーバーをクラスタリングし、単一障害点をなくします。 本番用ストレージバックエンド: Consulやetcdなど、高可用性を持つストレージバックエンドを選択します。 Audit Deviceの有効化: Vaultへのすべてのリクエストとレスポンスをログに記録し、監査証跡を確保します。 適切なポリシー設計: 最小権限の原則に基づき、各アプリケーションやユーザーが必要なシークレットにのみアクセスできるよう、厳密なアクセスポリシーを定義します。 Seal/Unsealの自動化: KMS(AWS KMS, Azure Key Vaultなど)を利用して、Vault起動時のUnsealプロセスを自動化します。
まとめ
この記事では、Vaultの重要性から基本概念、Dockerを使った簡単な構築方法、主要なシークレット管理ツールとの比較、そして運用のベストプラクティスまでを解説しました。Vaultを導入することで、シークレット管理を中央集権化し、セキュリティを大幅に向上させることができます。