㊙️

HashiCorp Vault ガイド:セキュアなシークレット管理の実現

に公開

HashiCorp Vault ガイド:セキュアなシークレット管理の実現

はじめに

現代のシステム開発において、APIキー、パスワード、証明書といった機密情報(シークレット)の安全な管理は最重要課題の一つです。HashiCorp Vault は、これらの課題に対応するための包括的なソリューションを提供します。本記事では、Vaultの基本概念から、アーキテクチャ、インストール方法、実際の運用例まで詳しく解説します。

1. HashiCorp Vault とは

HashiCorp Vault は、機密情報を安全に保存・管理するためのツールです。単なるパスワード管理ツールではなく、現代のクラウドネイティブ環境における包括的なシークレット管理プラットフォームとして機能します。

Vault の主な目的

  • 機密情報の一元管理: パスワード、APIキー、証明書などを安全に保存・管理
  • アクセス制御の強化: きめ細かいアクセスポリシーによる最小権限の実装
  • 暗号化サービスの提供: データの暗号化・復号化機能の集中管理
  • 動的シークレットの生成: 一時的なクレデンシャルを必要に応じて自動生成
  • 監査と追跡可能性の確保: すべての操作を詳細に記録し、コンプライアンス要件に対応

Vault の価値

  • セキュリティリスクの低減(ハードコードされた認証情報の排除)
  • 運用効率の向上(自動化とライフサイクル管理)
  • 開発者の生産性向上(標準化されたAPI)
  • コンプライアンス対応の簡素化(詳細な監査ログ)

2. Vault のアーキテクチャ

ソフトウェアアーキテクチャ

Vault は以下の主要コンポーネントで構成されています:

  1. Vault Core

    • バリア(暗号化層)
    • シール/アンシールメカニズム
    • ルーター
    • ポリシーエンジン
  2. 認証バックエンド

    • AppRole(アプリケーション認証)
    • LDAP/Active Directory
    • TLS証明書
    • クラウドプロバイダー(AWS/GCP/Azure)
    • Kubernetes
  3. シークレットエンジン

    • KV(Key-Value)ストア
    • PKI(証明書管理)
    • データベース(動的クレデンシャル)
    • トランジット(暗号化サービス)
  4. 監査デバイス

    • ファイル
    • Syslog
    • Socket
  5. ストレージバックエンド

    • 統合ストレージ(Raft)
    • Consul
    • PostgreSQL/MySQL
    • クラウドストレージ(DynamoDB, S3, GCS)

ネットワークアーキテクチャ

典型的なVault環境は、以下の層で構成されます:

クライアント層 → ロードバランサー層 → Vault サーバー層 → ストレージ層

HA(高可用性)構成の例:

                    ┌───────────────────┐
                    │ Load Balancer     │
                    │ (nginx/HAProxy)   │
                    └─────────┬─────────┘
                              │
            ┌────────────────┼────────────────┐
            │                │                │
  ┌─────────▼─────────┐┌─────▼──────────┐┌────▼───────────┐
  │ Vault Node 1      ││ Vault Node 2   ││ Vault Node 3   │
  │ (Active)          ││ (Standby)      ││ (Standby)      │
  └─────────┬─────────┘└─────┬──────────┘└────┬───────────┘
            │                │                │
            └────────────────┼────────────────┘
                             │
                 ┌───────────▼───────────┐
                 │ Storage Backend       │
                 │ (Consul/PostgreSQL等) │
                 └───────────────────────┘

3. Vault の活用例:証明書管理システム

Vault を活用した具体的な実装例として、ワイルドカード証明書を各サーバへ自動配布・ローテーションするシステムを紹介します。

全体像

          ┌────────────┐  lego hook  secrets kv
┌───────┐ │  Vault     │────────────────────────┐
│更新Srv│─┤  cluster   │                        │
└───────┘ │  (PKI/KV)  │                        │
          └────┬───────┘                        │
               │   Vault Agent (auto‑auth,template)  cert/key
        ┌──────▼──────┐                     ┌────▼────┐
        │ nginx‑01    │                     │ nginx‑02 │  …Active‑Active
        └─────────────┘                     └──────────┘

証明書管理の方法

Vault による証明書管理には、主に2つのアプローチがあります:

  1. Vault PKI Secrets Engine を CA として使う方法

    • Vault 自体が証明書を発行
    • 社内システムや内部APIなど、公開CA証明書が不要な場合に適している
  2. Let's Encrypt で取得した証明書を Vault KV に格納する方法

    • 公開CAの証明書が必要な場合に使用
    • Vault は安全な「配布ハブ」として機能

証明書自動更新の流れ

  1. Vault 側のセットアップ: PKI Secrets Engine の設定または KV ストアの設定
  2. サーバー側での設定: Vault Agent による自動取得と更新
  3. 自動更新プロセス: Vault Agent が定期的に証明書をチェックし、更新があれば自動的にファイルを書き換え、サービスを再読み込み

このアプローチの利点:

  • 証明書の最新版を一箇所で管理
  • 各サーバが自動的に証明書を取得(pull型)
  • 秘密鍵の流通リスクを最小化
  • サーバー数が増えても設定を複製するだけで対応可能

4. Vault のインストールと設定

システム要件と依存関係

ハードウェア要件:

  • CPU: マルチコア推奨(特に本番環境)
  • メモリ: 最低256MB、推奨4GB以上
  • ディスク: ストレージとログ用に十分な容量

依存関係:

  • 特定のLinuxディストリビューションへの依存はない
  • 最新のセキュリティアップデートが適用されたOS
  • 選択したストレージバックエンドに依存

ライセンス:

  • Vault Community Edition (CE): Mozilla Public License 2.0 (MPL 2.0)
  • Vault Enterprise: 商用ライセンス(有料)

Ubuntu 24.04 でのインストール方法

パッケージマネージャーを使用したインストール:

# HashiCorp の GPG キーを追加
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

# HashiCorp の公式リポジトリを追加
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"

# パッケージリストを更新
sudo apt-get update

# Vault をインストール
sudo apt-get install vault

基本設定(開発環境)

  1. 設定ディレクトリの作成:
sudo mkdir -p /etc/vault.d /var/lib/vault
sudo chmod 750 /var/lib/vault
  1. 設定ファイルの作成:
ui = true
disable_mlock = true

storage "file" {
  path = "/var/lib/vault/data"
}

listener "tcp" {
  address     = "0.0.0.0:8200" 
  tls_disable = "true"  # 開発環境のみ。本番では必ずTLS有効化
}

api_addr = "http://127.0.0.1:8200"
  1. systemdユニットの設定:
[Unit]
Description=HashiCorp Vault Service
Documentation=https://www.vaultproject.io/docs/
Requires=network-online.target
After=network-online.target

[Service]
User=vault
Group=vault
ProtectSystem=full
PrivateTmp=yes
ExecStart=/usr/bin/vault server -config=/etc/vault.d/vault.hcl
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGINT
Restart=on-failure
LimitMEMLOCK=infinity

[Install]
WantedBy=multi-user.target
  1. サービスの起動:
sudo adduser --system --group vault
sudo chown -R vault:vault /etc/vault.d /var/lib/vault
sudo systemctl daemon-reload
sudo systemctl enable vault
sudo systemctl start vault

本番環境構成(HA設定)

本番環境では、高可用性(HA)構成を採用することが推奨されます。最新のVaultでは、統合ストレージ(Raft)を使用した構成が最も簡単です:

ui = true
cluster_name = "vault-prod"

# TLS設定
listener "tcp" {
  address            = "0.0.0.0:8200"
  tls_cert_file      = "/etc/vault.d/tls/vault.crt"
  tls_key_file       = "/etc/vault.d/tls/vault.key"
  tls_client_ca_file = "/etc/vault.d/tls/ca.crt"
}

# 統合ストレージ設定
storage "raft" {
  path = "/var/lib/vault/data"
  node_id = "vault-1"  # 各ノードで一意の値に変更

  # クラスターメンバー
  retry_join {
    leader_api_addr = "https://vault-1.example.com:8200"
  }
  retry_join {
    leader_api_addr = "https://vault-2.example.com:8200"
  }
  retry_join {
    leader_api_addr = "https://vault-3.example.com:8200"
  }
}

# API URL
api_addr = "https://vault-1.example.com:8200"  # 各ノードで適切に変更

# クラスター通信URL
cluster_addr = "https://vault-1.example.com:8201"  # 各ノードで適切に変更

5. 初期化と運用

Vault の初期化

# VAULT_ADDR 環境変数を設定
export VAULT_ADDR='http://127.0.0.1:8200'

# Vault の初期化
vault operator init

# 出力される Unseal Keys と Initial Root Token を安全に保存

Unseal 操作

# Unseal キーを使用して Vault を unseal する
vault operator unseal    # 1つ目のキーを入力
vault operator unseal    # 2つ目のキーを入力
vault operator unseal    # 3つ目のキーを入力

運用上の重要ポイント

項目 チェックリスト
監査 Vault audit device を File または Syslog で有効化
アラート Agent 失敗時は systemd OnFailure= → Slack/Webhook
バックアップ ストレージバックエンドの定期的なバックアップ
TLS証明書 証明書の期限切れ監視と自動更新
パフォーマンス リソース使用率の監視とチューニング
セキュリティ 定期的なセキュリティ評価とアップデート

6. パフォーマンスとスケーリング

ハードウェア推奨

  • CPU: 4vCPU以上(Ubuntu 24.04は最新カーネルでマルチコア効率が向上)
  • メモリ: 8GB以上
  • ディスク:
    • オペレーティングシステム: 20GB+ SSD
    • Vaultデータ: 50GB+ SSD(書き込み性能重視)

ネットワーク最適化

# /etc/sysctl.conf に追加
net.core.somaxconn = 4096
net.core.netdev_max_backlog = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1

スケーリング戦略

  • 垂直スケーリング: リソース(CPU/メモリ)の増強
  • 水平スケーリング: Vaultノード数の増加(3〜5ノードが推奨)
  • ロードバランシング: クライアントリクエストの分散

7. 追加機能と発展的な使い方

ACME サポート

Vault 1.14以降では、ACME(Automatic Certificate Management Environment)プロトコルをサポートしています。これにより、標準のACMEクライアント(lego/certbot/cert-manager)をVaultに直接接続でき、社内Private PKIをACMEで自動化できます。

その他の活用例

  • データベースクレデンシャルの動的生成
  • クラウドIAMの一時的アクセスキー発行
  • 機密データの暗号化/復号化サービス
  • OTPトークン生成

まとめ

HashiCorp Vault は、現代のクラウドネイティブ環境において、セキュアで信頼性の高いシークレット管理を実現するための強力なツールです。適切に設計・構築することで、セキュリティリスクの低減、運用効率の向上、コンプライアンス対応の簡素化などの多くのメリットを得ることができます。

今回紹介した内容を基に、自身の環境に合わせたVault環境を構築し、安全なシークレット管理を実現してください。

参考リンク

Discussion