HashiCorp Vault入門:セキュアなシークレット管理システムを構築する実践ガイド

2025年11年27日カテゴリー: 技術記事
タグ:VaultSecrets ManagementDevSecOpsHashiCorpSecurity

アプリケーションの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を導入することで、シークレット管理を中央集権化し、セキュリティを大幅に向上させることができます。