TOTP は30秒前後の短い有効期限を持つワンタイムパスワード方式です。Vault の TOTP Secrets Engine は、TOTP 秘密鍵の保管・コード生成・検証を API/CLI で一元化します。
本記事は、公式ドキュメントに基づく安定機能に限定して、導入から運用・監査・トラブルシュートまでを網羅します。Ops 視点でのポリシー設計や監査イベントも押さえ、試験対策ポイントも明示します。
Vault の TOTP Secrets Engine は、ユーザやサービス毎の TOTP 秘密鍵を安全に格納し、コードの生成および検証を提供します。クライアントは Vault を単一のトラスト・アンカーとして利用し、TOTP 取り扱いを標準化できます。
エンジンの基本機能は、鍵の登録/生成、現在コードの取得、入力コードの検証、鍵の一覧/削除です。いずれも専用のパス配下で実行し、ACL で細かく権限制御できます。
| ユースケース | 主要 API/CLI パス | 推奨権限例 | 運用上の注意 |
|---|---|---|---|
| 鍵の登録・生成 | totp/keys/<name> (write) | create, update | 発行時の出力は機微情報。出力の取り扱いと監査を厳格に |
| 現在コードの取得 | totp/code/<name> (read) | read | 取得側に鍵素材は返らないが、不要な横展開を避けるためスコープを絞る |
| ユーザ入力の検証 | totp/validate/<name> (write) | update | 検証結果のみ返る。時刻同期ずれに留意し NTP を徹底 |
| 鍵の削除・棚卸し | totp/keys/<name> (delete), totp/keys (list) | delete, list | 削除は監査・承認フローを必須化する |
TOTP エンジンによるコード生成・検証の流れ
エンジン有効化と基本操作(CLI)
vault secrets enable totp
# 鍵の生成(issuer/account_name を明示)
vault write totp/keys/alice generate=true issuer="ExampleCorp" account_name="[email protected]"
# 現在コードの取得(クライアント側 2FA 入力代替など)
vault read totp/code/alice
# 入力コードの検証(true/false)
vault write totp/validate/alice code=123456
# 鍵の一覧と削除
vault list totp/keys
vault delete totp/keys/aliceプロビジョニング担当は、ユーザごとに一意の名前を付けて鍵を登録します。名前は組織・用途・所有者を判別できる構成にし、後の棚卸しや削除フローを容易にします。
鍵は Vault 側で生成する方法(generate=true)と、既存の TOTP シークレットを持ち込む方法があります。運用一貫性の観点では Vault 生成を推奨します。生成時の出力には、otpauth URL や QR コード表現(サイズ指定など)が含まれるため、配布チャネルの保護と保管禁止のルール化が必須です。
QR 付きで登録し、安全に配布する例(CLI と cURL)
# QR サイズを指定して鍵を生成
evault write totp/keys/app-prod/alice generate=true issuer="ExampleCorp" account_name="[email protected]" qr_size=200
# API での作成(例)
curl \
--header "X-Vault-Token: $VAULT_TOKEN" \
--request POST \
--data '{"generate":true, "issuer":"ExampleCorp", "account_name":"[email protected]", "qr_size":200}' \
$VAULT_ADDR/v1/totp/keys/app-prod%2Falice
# 応答に含まれる otpauth URL/QR データは直ちに利用者へ安全送付し、保存しない運用を徹底TOTP は閲覧範囲が広がるほどリスクが上がります。鍵の生成者、コードの取得者、検証を行うサービス、削除を行う管理者を論理的に分離し、それぞれのパスに必要最小限の権限のみを付与します。
監査上は誰がいつ鍵を発行し、誰が検証を実行したかが重要です。Vault の監査デバイスを有効化し、TOTP パス配下の操作をすべて記録します。
HCL ポリシー例(ロール分離)
# 鍵発行ロール(プロビジョナー)
path "totp/keys/app-prod/*" {
capabilities = ["create", "update", "list"]
}
# 検証ロール(バックエンド API)
path "totp/validate/app-prod/*" {
capabilities = ["update"]
}
# コード取得ロール(やむを得ずサーバ側でコード生成が必要な場合)
path "totp/code/app-prod/*" {
capabilities = ["read"]
}
# 削除ロール(管理者)
path "totp/keys/app-prod/*" {
capabilities = ["delete", "list"]
}TOTP 鍵は動的リースではありません。明示的に棚卸しし、不要になった鍵は削除します。定期棚卸しでは所有者・最終使用時刻(検証ログ)・連絡先を対応付けて確認します。
ローテーションは新規鍵の発行と旧鍵の無効化を段階的に実行します。ユーザ側で Authenticator を再登録する手順をあらかじめ標準化し、移行期間を設定します。
棚卸しと安全な削除の手順(例)
# 棚卸し
vault list -format=json totp/keys | jq -r '.[]' > keys.txt
# 対象ごとに最終検証時刻を監査ログから集計(監査ログの保存先に依存)
# 例: jq で totp/validate パスを抽出し、key 名でグルーピング
# 安全な削除(事前承認・告知後)
while read k; do
echo "deleting $k";
vault delete totp/keys/$k;
done < keys.txtTOTP は時刻同期が前提です。Vault サーバ群と検証クライアントは信頼できる NTP で同期してください。時刻ずれは誤検知やロックアウトの原因になります。
監査はエンジン利用の前提です。Vault の監査デバイスを有効化し、totp/ 配下の read/update/delete をすべて記録します。鍵生成時の出力はラッピングトークンで配布し、使い切り・短期 TTL を徹底します。
監査とレスポンスラッピングの例
# 監査デバイスの有効化(例: ファイル)
vault audit enable file file_path=/var/log/vault_audit.log
# ラッピング(応答を 300 秒の一時トークンに包む)
vault write -wrap-ttl=300s totp/keys/app-prod/bob generate=true issuer="ExampleCorp" account_name="[email protected]"
# 出力された wrapping_token を安全な経路で配布
# 受領側が unwrap
evault unwrap <wrapping_token>検証が失敗する場合、まず時刻同期、鍵名の取り違え、桁数や期間設定の不一致を確認します。生成側と検証側で issuer/account_name の視覚差異も誤認の原因になります。
資格試験(Ops)では、エンジンの有効化、パスごとの権限分離、監査の有効化、レスポンスラッピングの使い所といった運用設計が問われやすいです。CLI での基本操作と HCL ポリシーの読解を確実にしておきましょう。
よくある確認コマンド
# パスの存在確認と一覧
vault list totp/keys
# 個別キーのメタ確認(出力内容は権限に依存)
vault read totp/keys/app-prod/alice || echo "権限/存在を確認"
# 直近の検証可否を手動チェック
vault write totp/validate/app-prod/alice code=$(vault read -field=code totp/code/app-prod/alice)Ops
問題 1
Vault の TOTP Secrets Engine を用いて、アプリケーションサーバがユーザ入力の 6 桁コードを検証したい。最小権限の設計として正しいのはどれか。
正解: A
ユーザ入力の検証は totp/validate/<name> で実施し、結果のみを受け取る。コードの生成(totp/code)や鍵の読み取り(totp/keys read)は不要で、機微情報の露出につながるため付与しない。
TOTP の既存秘密鍵を持ち込めるか?
可能です。鍵登録時に generate=true の代わりに既存の TOTP 秘密鍵をパラメータで渡して登録します。以降は Vault 側でコード生成・検証が可能です。
デフォルトの有効期間や桁数は変更できるか?
鍵作成時に期間(一般的には 30 秒)や桁数(6 または 8)などのパラメータを指定できます。組織標準に合わせて統一してください。
Vault 再起動や再シール時に TOTP は影響を受けるか?
TOTP の鍵はストレージに保存され、アンシール後に利用可能です。ダウンタイム中はコードの生成・検証 API が利用できないため、可用性要件に応じて HA 構成を取ってください。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Vault のコア概念を最短距離で理解する:Secret / Auth / Policy / Token
HashiCorp Vault Associate レベルで押さえるべきコア概念(Secret Engine、Auth ...
Vault Operations Professional: 上位資格としての範囲を実務目線で押さえる
HashiCorp Vault Operations Professional(Ops Pro)の出題範囲を、Assoc...
Vaultにおけるパスベースのルーティング: マウントとAPI構造を読み解く
HashiCorp Vaultのパスベースのルーティングを、マウント設計とAPIパスの観点から整理。Associateレ...
Vault Tokens の基礎: 認証の起点となる概念
HashiCorp Vault におけるトークンの役割、種類、ライフサイクル、ポリシー連携、設計パターンをAssocia...
Vault のトークン種類を正しく使い分ける: service / batch 実践
HashiCorp Vault Associate 向けの試験対策と実務運用を両立させた、service トークンと b...