0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

あなたのスマホが鍵になる★Vault で作る「自分だけの Google Authenticator」サーバー

Posted at

HashiCorp Advent Calendar 2025 11 日目の記事です。

はじめに

みなさん、HashiCorp Vault を使っていますか?
「あー、パスワードとか AWS のキーを保存しておくやつでしょ? キーバリューストア(KV)だよね」

もしそう思っているなら、もったいない!
Vault はただの「静的な金庫」ではありません。データの暗号化、動的なキー発行、そして 「認証の計算」まで肩代わりしてくれる「セキュリティ・ブローカー」 です。

今回はその一例として、Vault を TOTP(Google Authenticator) のバックエンドサーバー として動かしてみます。
アプリ側に MFA の実装は不要。Vault に「この数字合ってる?」と聞くだけで認証が完結する、スマートなアーキテクチャを体験してみましょう。

今回やること

  1. PC (Vault): TOTP サーバーとして起動。QR コードを発行する。
  2. スマホ (Google Authenticator): QR コードを読み込み、ワンタイムパスワードを表示する。
  3. PC (Vault): スマホに表示された数字が正しいか検証(Validate)する。

自前 MFA サーバー構築にトライ

必要なのは PC と、普段使っている認証アプリ(Google Authenticator, Authy など)が入ったスマホだけです。

1. Vault サーバーの起動

まずはローカルで Vault を開発モードで立ち上げます。
(※ Vault が未インストールの場合は brew install vault などで入れてください)

terminal-1
# 開発モード(メモリ上)で起動
vault server -dev

別のターミナルを開き、接続設定をします。

terminal-2
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 という専用エンジンを使います。

terminal-2
vault secrets enable totp

こんな感じで返ってきたら成功。

Success! Enabled the totp secrets engine at: totp/

3. ユーザーキーの発行(ここが面白い!)

さあ、いよいよ、あなたのための MFA キーを発行しましょう。
今回は my-user という名前で、発行者名を MyVault にしてキーを生成します。

terminal-2
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://...)をコピーして、以下のコマンドに貼り付けてください。

terminal-2
# -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 に「これ合ってる?」と聞きます。

terminal-2
# スマホの数字を入力
vault write totp/code/my-user code=123456

成功した場合:

Key      Value
---      -----
valid    true

valid: true が返ってきました! Vault が「そのコードは正しいよ」と認めてくれました。

失敗した場合:

Key      Value
---      -----
valid    false

と返ってきて失敗している場合、
スマホとPCの時刻が秒単位でズレている可能性があります。

冷酷に false が返されます。

スマホの時刻同期を ON にしたりして調整してください。

terminal-2
vault read totp/code/my-user

で返ってきている数字と、 Authenticator の数字がズレていたらどちらかの時刻同期がうまくいっていません。

何がすごいの?(技術的な学び)

このハンズオンで伝えたかったのは、「Validation as a Service(検証のサービス化)」 という概念です。

通常、MFA をアプリに組み込む場合、サーバーサイドで TOTP の計算ロジック(HMAC-SHA1 等)を実装する必要があります。しかし、Vault を使えばその必要はありません。

  1. アプリはユーザーから入力された 123456 を受け取る。
  2. アプリは何も考えず、Vault の API に code=123456 を投げる。
  3. Vault が true/false を返す。
  4. アプリはそれを見てログインさせるかどうか決める。

「セキュリティの難しい計算ロジックを、アプリから切り離して Vault に外出しする」
これこそが、Vault を導入する大きなメリットの一つです。

おわりに

Vault は「静的な金庫」ではなく、「動的なセキュリティ・エンジン」です。
今回の TOTP だけでなく、「データを保存せずに暗号化だけしてくれる機能 (Transit)」「SSH の証明書を発行してくれる機能 (SSH)」 など、面白い機能がたくさんあります。

ぜひ、パスワード保存以外にも Vault を使い倒してみてください!


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?