HashiCorp Advent Calendar 2025 11 日目の記事です。
はじめに
みなさん、HashiCorp Vault を使っていますか?
「あー、パスワードとか AWS のキーを保存しておくやつでしょ? キーバリューストア(KV)だよね」
もしそう思っているなら、もったいない!
Vault はただの「静的な金庫」ではありません。データの暗号化、動的なキー発行、そして 「認証の計算」まで肩代わりしてくれる「セキュリティ・ブローカー」 です。
今回はその一例として、Vault を TOTP(Google Authenticator) のバックエンドサーバー として動かしてみます。
アプリ側に MFA の実装は不要。Vault に「この数字合ってる?」と聞くだけで認証が完結する、スマートなアーキテクチャを体験してみましょう。
今回やること
- PC (Vault): TOTP サーバーとして起動。QR コードを発行する。
- スマホ (Google Authenticator): QR コードを読み込み、ワンタイムパスワードを表示する。
- PC (Vault): スマホに表示された数字が正しいか検証(Validate)する。
自前 MFA サーバー構築にトライ
必要なのは PC と、普段使っている認証アプリ(Google Authenticator, Authy など)が入ったスマホだけです。
1. Vault サーバーの起動
まずはローカルで Vault を開発モードで立ち上げます。
(※ Vault が未インストールの場合は brew install vault などで入れてください)
# 開発モード(メモリ上)で起動
vault server -dev
別のターミナルを開き、接続設定をします。
export VAULT_ADDR='http://127.0.0.1:8200'
# 疎通確認
vault status
こんな感じで表示されれば一旦動作しています。
% vault status
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed false
Total Shares 1
Threshold 1
Version 1.20.3
Build Date 2025-08-27T10:53:27Z
Storage Type inmem
Cluster Name vault-cluster-f1204a96
Cluster ID e7e3e56d-717b-cc39-4e22-3a5d3b68aebb
HA Enabled false
2. TOTP シークレットエンジンの有効化
Vault に「MFA の機能を使うよ」と教えます。KV (Key-Value) ではなく totp という専用エンジンを使います。
vault secrets enable totp
こんな感じで返ってきたら成功。
Success! Enabled the totp secrets engine at: totp/
3. ユーザーキーの発行(ここが面白い!)
さあ、いよいよ、あなたのための MFA キーを発行しましょう。
今回は my-user という名前で、発行者名を MyVault にしてキーを生成します。
vault write totp/keys/my-user \
generate=true \
issuer=MyVault \
account_name=admin@example.com
実行結果:
Key Value
--- -----
barcode iVBORw0KGgoAAAANSUhEUgAA... (長いBase64文字列)
url otpauth://totp/MyVault:admin@example.com?algorithm=SHA1&digits=6...
この url が、QR コードの中身です。
4. スマホと同期する
ここがハイライトです。出力された url を QR コードに変換して、スマホで読み込みます。
Web 上の生成サイトを使ってもいいですが、CLI だけで完結させるなら qrencode コマンドなどが便利です。
Mac (Homebrew) の場合:
brew install qrencode
QR コードの表示:
先ほどの url の値(otpauth://...)をコピーして、以下のコマンドに貼り付けてください。
# -t ANSI256 をつけると、ターミナル上にQRコードが描画されます!
qrencode -t ANSI256 "otpauth://totp/MyVault:admin@example.com?secret=YOUR_SECRET_KEY&..."
(※ 引数などはご自身の出力結果に合わせてください)
スマホの出番です!
ターミナルに表示された QR コードを、Google Authenticator アプリでスキャンしてください。
アプリに 「MyVault (admin@examp......)」 という項目が増え、6 桁の数字がカウントダウンし始めましたか?
これで、あなたの Vault とスマホが同期されました!
5. 答え合わせ(Validation)
では、認証してみましょう。
スマホを見て、今表示されている 6 桁のコード(例: 123456)を入力し、Vault に「これ合ってる?」と聞きます。
# スマホの数字を入力
vault write totp/code/my-user code=123456
成功した場合:
Key Value
--- -----
valid true
valid: true が返ってきました! Vault が「そのコードは正しいよ」と認めてくれました。
失敗した場合:
Key Value
--- -----
valid false
と返ってきて失敗している場合、
スマホとPCの時刻が秒単位でズレている可能性があります。
冷酷に false が返されます。
スマホの時刻同期を ON にしたりして調整してください。
vault read totp/code/my-user
で返ってきている数字と、 Authenticator の数字がズレていたらどちらかの時刻同期がうまくいっていません。
何がすごいの?(技術的な学び)
このハンズオンで伝えたかったのは、「Validation as a Service(検証のサービス化)」 という概念です。
通常、MFA をアプリに組み込む場合、サーバーサイドで TOTP の計算ロジック(HMAC-SHA1 等)を実装する必要があります。しかし、Vault を使えばその必要はありません。
- アプリはユーザーから入力された
123456を受け取る。 - アプリは何も考えず、Vault の API に
code=123456を投げる。 - Vault が
true/falseを返す。 - アプリはそれを見てログインさせるかどうか決める。
「セキュリティの難しい計算ロジックを、アプリから切り離して Vault に外出しする」。
これこそが、Vault を導入する大きなメリットの一つです。
おわりに
Vault は「静的な金庫」ではなく、「動的なセキュリティ・エンジン」です。
今回の TOTP だけでなく、「データを保存せずに暗号化だけしてくれる機能 (Transit)」 や 「SSH の証明書を発行してくれる機能 (SSH)」 など、面白い機能がたくさんあります。
ぜひ、パスワード保存以外にも Vault を使い倒してみてください!