AppRoleは、アプリケーションやバッチ、CI/CDなど“人以外”のクライアントがVaultにログインするための認証方式です。RoleID(識別子)とSecretID(認証子)の二要素でサービス用トークンを発行します。
本稿では、公式ドキュメントに沿った安定的な設定項目に限定し、実運用での安全なSecretID配布、レスポンスラッピング、Vault Agentの活用、他方式との使い分けまでを網羅します。
AppRoleは、RoleID(固定の識別子)とSecretID(短命・使用回数制限可能な認証子)を用いて、Vaultがアプリ用のサービス・トークンを発行する仕組みです。Role単位でトークン特性(ポリシー、TTL、最大TTL、更新可否、CIDR制約など)を宣言的に定義できます。
ユーザ対話を前提としないため、プロセス起動時やコンテナ初期化時に安定して使えるのが強みです。Kubernetes AuthやJWT/OIDCが前提を置く環境と異なり、あらゆる実行環境(VM、オンプレ、エッジ)で使える“デフォルト”の選択肢になりやすいのがAppRoleです。
典型フローは、管理面(SecOps/CI)でRoleを定義し、アプリ側にRoleIDを配布。SecretIDはレスポンスラッピング等で安全に一時配布します。アプリはRoleIDとSecretIDでログインし、得たVaultトークンでシークレットを取得します。
重要なのは、SecretIDを“一時的・最小権限・最小回数”で扱うこと。トークン側もポリシーとTTLで範囲・時間を絞り、漏えい時の blast radius を抑えます。
AppRoleによる認証とトークン発行(概念図)
SecretIDは実質的な“パスワード”。最重要は配布経路の安全化と短寿命・回数制限です。レスポンスラッピング(Wrap)を使うと、SecretIDそのものを直接配送せず、短TTL・一回限りのラップトークンで受け渡しできます。
ロール設定では、secret_id_num_uses(例: 1回)、secret_id_ttl(例: 10分)、secret_id_bound_cidrs(利用元CIDR制限)を組み合わせ、漏えい時の影響を局所化します。発行されるトークン側もtoken_ttlとtoken_max_ttl、token_bound_cidrsで裾野を狭めます。
以下は安定した基本手順です。プロダクションではCIDR制約やTTL値を環境に合わせて調整してください。APIは/v1/auth/approle配下のパスを使用します。
Vault Agentのauto_authを併用すると、アプリ側はRoleID/SecretIDのファイル読込だけで済み、以降のトークン更新が自動化されます。
CLI/API/Agentの最小構成例
# 0) 前提
export VAULT_ADDR=https://vault.example.com
export VAULT_TOKEN=<operator_root_or_admin_token>
# 1) AppRoleを有効化
vault auth enable approle
# 2) 最小権限のポリシー作成(例)
cat > app.hcl <<'HCL'
path "secret/data/app/*" {
capabilities = ["read"]
}
HCL
vault policy write app app.hcl
# 3) ロール作成(推奨パラメータ例)
vault write auth/approle/role/my-app \
token_policies="app" \
bind_secret_id=true \
secret_id_num_uses=1 \
secret_id_ttl=10m \
token_ttl=1h \
token_max_ttl=4h \
token_bound_cidrs="10.0.0.0/8" \
secret_id_bound_cidrs="10.0.0.0/8" \
local_secret_ids=true
# 4) RoleIDの取得(配布は安全経路で)
ROLE_ID=$(vault read -field=role_id auth/approle/role/my-app/role-id)
echo "$ROLE_ID" > role_id
# 5) SecretIDの発行(Wrapして配布)
WRAP_TOKEN=$(vault write -f -wrap-ttl=5m auth/approle/role/my-app/secret-id | awk '/wrapping_token/ {print $2}')
# 受け取り側:
SECRET_ID=$(VAULT_TOKEN=$WRAP_TOKEN vault unwrap -field=secret_id)
echo "$SECRET_ID" > secret_id
# 6) ログイン(サービストークン取得)
APP_TOKEN=$(vault write -field=token auth/approle/login role_id="$ROLE_ID" secret_id="$SECRET_ID")
echo "$APP_TOKEN" > app.token
# --- 同等のHTTP API例 ---
# ロール作成
curl -sS \
-H "X-Vault-Token: $VAULT_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{
"token_policies":"app",
"bind_secret_id":true,
"secret_id_num_uses":1,
"secret_id_ttl":"10m",
"token_ttl":"1h",
"token_max_ttl":"4h",
"token_bound_cidrs":["10.0.0.0/8"],
"secret_id_bound_cidrs":["10.0.0.0/8"],
"local_secret_ids":true
}' \
$VAULT_ADDR/v1/auth/approle/role/my-app
# RoleID取得
curl -sS -H "X-Vault-Token: $VAULT_TOKEN" \
$VAULT_ADDR/v1/auth/approle/role/my-app/role-id | jq -r .data.role_id
# SecretID(Wrap)
curl -sS -H "X-Vault-Token: $VAULT_TOKEN" \
-H "X-Vault-Wrap-TTL: 5m" \
-X POST $VAULT_ADDR/v1/auth/approle/role/my-app/secret-id | jq -r .wrap_info.token
# ログイン
curl -sS -H "Content-Type: application/json" \
-X POST \
-d '{"role_id":"'$ROLE_ID'","secret_id":"'$SECRET_ID'"}' \
$VAULT_ADDR/v1/auth/approle/login | jq -r .auth.client_token
# --- Vault Agent(auto_auth)例 ---
cat > agent.hcl <<'HCL'
auto_auth {
method "approle" {
config = {
role_id_file_path = "./role_id"
secret_id_file_path = "./secret_id"
}
}
sink "file" {
config = {
path = "/tmp/app.token"
}
}
}
cache {
use_auto_auth_token = true
}
HCL
vault agent -config=agent.hcl
SecretIDローテーションは自動化が前提です。CIから定期的にSecretIDを発行→Wrapで受け手に渡し→旧SecretIDは破棄、をパイプライン化します。漏えい時はsecret-idアクセスパスでdestroy/revokeできます。
発行されたトークンは、token_ttlとtoken_max_ttlに従い更新可能です。Vault Agentでの自動更新を基本とし、更新不能時(max_ttl到達や権限不足)に備えてヘルスチェックとフォールバックを設けます。
AppRoleは“どこでも動く”のが強み。一方、Kubernetes AuthやJWT/OIDCは環境統合が進むほど運用が軽くなります。試験では適材適所の判断が頻出です。
AppRoleはCI/CDやオンプレVM、エッジでのデフォルト。Kubernetes環境ではまずKubernetes Authを検討し、外部IDプロバイダ統合が進んでいればJWT/OIDCも有力です。TLS証明書方式はクライアント証明書管理が行き届く環境向け。
| 方式 | 典型対象/前提 | 配布・回転の難易度 | 強み/留意点 |
|---|---|---|---|
| AppRole | 汎用アプリ/バッチ/CI。環境非依存 | SecretIDの安全配布と短TTL・回数制限が肝 | どこでも使える。Wrap+Agentで安全自動化 |
| Kubernetes Auth | K8s環境。SAトークン検証 | 配布は不要(SAトークンを使用) | K8s統合が容易。ロールバインドで権限管理 |
| JWT/OIDC Auth | 外部IdP連携。OIDC/JWT発行基盤 | 配布は不要(JWTを提示) | フェデレーション容易。クレームでポリシー付与 |
| TLS Cert Auth | mTLSが敷設済みの環境 | 証明書配布/更新が必要 | 相互TLSで強固。証明書運用コスト高 |
Associate
問題 1
VaultでAppRoleを用いてアプリが認証する設計において、SecretIDの安全な配布と漏えい時の影響最小化を同時に満たす推奨組み合わせはどれか?
正解: B
AppRoleのベストプラクティスは、SecretIDをWrapで安全に渡し、使用回数(secret_id_num_uses=1)と寿命(secret_id_ttl)を短くし、可能ならCIDR制約(secret_id_bound_cidrs)を併用して影響半径を最小化すること。A/C/DはいずれもSecretIDまたは認証強度の観点で不適切。
RoleIDは秘密情報として扱うべきですか?
RoleIDは“識別子”であり、SecretIDほど厳重な秘匿対象ではありません。ただし露出最小化は推奨です。真正性はSecretID(と各種制約)で担保されるため、bind_secret_id=trueを維持するのが原則です。
SecretIDなし(bind_secret_id=false)運用は可能ですか?
技術的には可能ですが、推奨されません。RoleID単独ログインは強度が不足します。実運用ではbind_secret_id=trueを維持し、secret_id_num_usesやsecret_id_ttl、CIDR制約、レスポンスラッピングを併用してください。
SecretIDやトークンの失効・ローテーションはどう行いますか?
SecretIDはauth/approle/role/<role>/secret-id/destroyで個別破棄できます。トークンはアクセサやパスでrevoke/revoke-prefixが可能。定期ローテーションはCIでSecretID再発行→Wrap配布→旧ID破棄を自動化し、トークン更新はVault Agentで行うのが定石です。
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...