Vault Agent はクライアント側デーモンとして、アプリの代わりに認証・トークン更新・シークレット取得・テンプレート出力を自動化します。
Kubernetes サイドカーや VM 常駐プロセスとして動作し、ファイル出力またはローカル HTTP リスナー経由でアプリに安全にシークレットを渡せます。
Vault Agent は Vault サーバとは別の軽量デーモンで、クライアント側に常駐して認証処理(Auto-Auth)、トークンの自動更新、シークレットの取得、テンプレート生成(ファイル出力)を担います。アプリケーションは Vault の認証や API 詳細を直接扱わず、Agent が用意するローカルの成果物(ファイルまたはローカル HTTP)を読むだけで済みます。
Agent は二つの典型的な使い方があります。1) テンプレート機能でシークレットをファイルとして出力し、アプリはファイルを読む。2) ローカル HTTP リスナーを有効化し、Agent をキャッシュ付きプロキシとして経由して Vault にアクセスする。いずれもトークン管理は Agent が担い、TTL に従って更新または再取得します。
もっとも一般的なのは Kubernetes のサイドカーパターンです。アプリコンテナと同じ Pod に Agent を同居させ、ServiceAccount を用いた Kubernetes 認証でトークンを取得・更新します。テンプレートでファイルを出力し、emptyDir などで共有するか、ローカルリスナーを localhost で公開します。
VM/ベアメタルでは systemd 常駐として起動し、AppRole などの認証方式でトークンを取得します。複数プロセスで共有する場合は、ファイル出力(パーミッション厳格化)または 127.0.0.1 上のリスナー経由で配布します。
サイドカー構成の全体像
Auto-Auth は、指定した認証メソッド(例: Kubernetes、AppRole、AWS IAM など)で Vault に自動ログインし、クライアントトークンを取得・更新する機能です。Agent はトークンの有効期限を監視し、期限前に自動更新を試みます。更新できない場合は再認証します。
トークンは用途に応じて 1) ファイルに書き出す(sink)か、2) ローカル HTTP リスナーで内部的に保持してプロキシ要求に付与する、のいずれかで活用できます。キャッシュ型プロキシを使う場合、クライアントはトークンを意識せずに Agent のローカルリスナーへリクエストを送り、Agent が Auto-Auth トークンを用いて上流の Vault へ転送します。
| 認証メソッド | 信頼の根拠 | 主なデプロイ先/前提 | 運用の要点 |
|---|---|---|---|
| Kubernetes | Pod の ServiceAccount JWT | Kubernetes(サイドカー/DaemonSet) | Role と SA のバインドを最小化。SA JWT の自動ローテーションに追随。 |
| AppRole | RoleID + SecretID(発行/供給の管理) | VM/裸金属/バッチ | SecretID の配布経路を厳格化。Pull/Push いずれでも可。 |
| AWS IAM | IAM ロール署名(sts:AssumeRole 等) | AWS 上の EC2/Lambda/ECS | メタデータ経由の一時認証を活用。ロール境界と Vault ロールマッピングを明確化。 |
テンプレート機能は、Vault のシークレットを定期的に取得し、所定の形式でファイルに出力します。テンプレート言語は Consul Template に準拠しており、KV v2 の場合は Data.data 以下にキーが格納されます。ファイルは権限を絞り、アプリが読み込み専用で参照するのが基本です。
アプリがリロード対応しているなら、ファイル更新後にコマンドを実行して HUP 送信などを行えます。これによりシークレットのローテーションを無停止で適用できます。
Vault Agent 設定例(Kubernetes 認証 + テンプレート + キャッシュ)
# agent.hcl
vault {
address = "https://vault.example.local:8200"
}
# ローカル HTTP リスナー(Pod/ホスト内に限定)
listener "tcp" {
address = "127.0.0.1:8200" # 外部公開しない
tls_disable = true # Pod/ホスト内ローカル限定時のみ
}
# Vault への認証を自動化
auto_auth {
method "kubernetes" {
mount_path = "auth/kubernetes"
config = {
role = "app-role"
# Pod の SA トークンを既定パスから読む(環境により調整)
token_path = "/var/run/secrets/kubernetes.io/serviceaccount/token"
}
}
# トークンの書き出しが必要な場合は sink を追加(例: ファイル)
sink "file" {
config = {
path = "/run/secrets/.vault-token"
mode = "0400"
}
}
}
# キャッシュを有効化し、Auto-Auth トークンで上流にアクセス
cache {
use_auto_auth_token = true
}
# テンプレートで KV v2 のシークレットをファイルへ出力
# Data.data 以下のキーを参照
# アプリに HUP を送ってホットリロード
template {
destination = "/run/secrets/app-config.env"
perms = 0400
command = "/usr/bin/pkill -HUP myapp || true"
contents = <<EOH
# generated by vault-agent; do not edit
{{ with secret "kv/data/app/config" -}}
API_KEY={{ .Data.data.api_key }}
DB_USER={{ .Data.data.db_user }}
DB_PASS={{ .Data.data.db_pass }}
{{- end }}
EOH
}
キャッシュ型プロキシを有効化すると、Agent はシークレット応答をローカルに保持し、TTL に従って期限切れ前に更新します。これにより Vault サーバへのクエリ回数が減り、スパイク時の安定性が向上します。アプリは Vault のエンドポイントではなく 127.0.0.1 のリスナーへ向けるだけで、トークン付与とキャッシュを自動で享受できます。
可用性の観点では、上流 Vault の一時障害中でも有効 TTL の範囲内でキャッシュがヒットすれば応答可能です。TTL を過ぎたリースは返せないため、重要経路では適切な TTL 設計、リトライ、フォールバック(例えば直近の設定を読み込んだまま継続可能か)を検討します。
最小権限の原則を徹底します。テンプレートが参照するパスだけを許可したポリシー、短めの TTL と自動更新、トークンのローテーション/失効戦略を準備します。出力ファイルは所有者限定のパーミッションにし、共有ボリュームを使う場合は他プロセスからの読み取りを防ぎます。
試験対策としては、Agent はサーバ機能ではなくクライアント側の補助であること、Auto-Auth が認証とトークン更新を担うこと、テンプレートがファイル出力を行い、キャッシュ型プロキシが QPS 削減と可用性に寄与する点を押さえてください。Kubernetes ならサイドカー + SA 認証、VM なら AppRole という対応関係を問う設問が出やすいです。
Associate / Ops
問題 1
Kubernetes 上のアプリは Vault SDK を持たず、環境変数ファイルからのみ資格情報を読み込みます。シークレットは定期的にローテーションされます。運用負荷とセキュリティを両立する推奨アプローチはどれですか?
正解: A
サイドカーの Vault Agent による Kubernetes 認証 + テンプレート出力は、トークン管理とローテーション適用を自動化でき、アプリはファイルを読むだけで済みます。ルートトークン埋め込みは論外、サーバ側で構成を配布するのは Vault の標準運用ではありません。AppRole をアプリ実装で直接扱うより、Agent に委譲する方が安全で保守的です。
Vault Agent は特権(root)で動かす必要がありますか?
必須ではありません。必要なのは Vault へのネットワーク到達性と、出力ファイルの作成権限だけです。最小権限のユーザで実行し、出力先のパーミッションを厳格化してください。
アプリが自前でトークン更新できる場合でも、Vault Agent を使う利点はありますか?
あります。テンプレートで安全にファイル出力できること、キャッシュ型プロキシで QPS を削減できること、再試行/バックオフや自動更新の実装を流用できることが利点です。ただし SDK 実装が堅牢で要件を満たすなら、Agent は必須ではありません。
Vault 障害時に Agent はどう振る舞いますか?
キャッシュが有効で、対象シークレットの TTL が有効な間はキャッシュヒットで応答可能です。TTL を過ぎた場合は返せないため、再試行・フォールバック方針と適切な TTL 設計が重要です。復旧後は自動的に再認証・更新が走ります。
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...