OIDCはOAuth 2.0上のIDレイヤ、JWTはそのトークン形式。Vaultは双方に対応する認証メソッド(auth method)を提供します。
本稿は、人がブラウザでSSOするOIDCと、ワークロードが機械間で提示するJWTの統合パターンを中心に、最小構成から試験頻出ポイントまでを実務目線で解説します。
OIDCはOAuth 2.0にIDトークン(ID Token, JWT)を追加した仕様です。認可コードフローでIdPが発行するIDトークンをVaultが検証し、ユーザ(またはワークロード)を識別します。Vaultは認証メソッドとして「oidc」「jwt」を提供し、前者はディスカバリと対話的ログイン(ブラウザ)を前提、後者は外部で発行済みのJWTを提示して機械的に検証します。
VaultのアイデンティティはEntityとAliasで管理されます。各Auth Method(例: oidc、jwt、userpassなど)から来る識別子(sub等)がAliasとなり、同一人物・ワークロードを同一Entityに統合できます。発行されるVaultトークンにはポリシーが付与され、TTLや再認証の要件はロール設定で制御します。
JWTの基本構造(参考)
{
"header": {"alg": "RS256", "kid": "..."},
"payload": {
"iss": "https://idp.example.com/",
"sub": "00u123abc",
"aud": "vault",
"exp": 1710000000,
"groups": ["dev", "ops"]
},
"signature": "..."
}人のSSOにはOIDC Auth Methodが適します。Vault CLIやUIはローカルでコールバック(標準でhttp://localhost:8250/oidc/callback)を受け、IdPの認可コードをVaultへ引き渡します。Vaultはディスカバリエンドポイント経由でIdPのJWKSを取得し、IDトークンを検証します。
ワークロード連携では、アプリやジョブランナーがIdP(またはプラットフォームが発行するOIDC/JWT)から受け取ったJWTを提示し、VaultのJWT Auth Methodで非対話的に検証します。これによりヘッドレス環境や自動化パイプラインでも安全にトークンを取得できます。
Vault OIDC ログインの流れ
[User/CLI]
| 1. vault login -method=oidc
v
[Local Callback 8250] <-- 3. redirect with code --- [IdP (OIDC)]
^ 2. auth request --> |
| v
|------------------ 4. code -> Vault OIDC auth ----------|
|
v
[JWKS取得/IDトークン検証]
|
v
[Identity: Entity + Alias 解決]
|
v
[Vault Token 発行]CLIでのOIDCログイン例
export VAULT_ADDR="https://vault.example.com"
export VAULT_NAMESPACE="" # Enterpriseで必要なら設定
vault login -method=oidcIdPでOIDCクライアントを登録し、リダイレクトURIにhttp://localhost:8250/oidc/callback(CLI)やVault UIのコールバックURIを設定します。クライアントタイプは機密クライアント(client_secretを持つ)を選ぶのが一般的です。
IDトークンのクレームに、少なくともiss, sub, aud, expが含まれる必要があります。グループベースの制御を行う場合はgroups等のカスタム/標準クレームを付与し、Vault側でclaim_mappingsやgroups_claimによりポリシーへ結びつけます。
参考: IdPのIDトークン例(必要最小クレーム)
{
"iss": "https://idp.example.com/",
"sub": "00u123abc",
"aud": "vault",
"email": "[email protected]",
"groups": ["dev", "ops"],
"iat": 1709996400,
"exp": 1710000000
}OIDC Auth Methodでは、ディスカバリURL/クライアント資格情報を設定し、ロールごとにリダイレクトURIやスコープ、ユーザ識別クレーム、グループクレーム、付与ポリシーを定義します。最小構成から始め、必要なスコープとクレームだけを要求するのが安全です。
ポリシーは最小権限で設計し、グループクレームをIdentity Groupにエイリアス連携することで、IdP側グループ変更が即座に反映されるパターンが運用で扱いやすいです。
OIDC Auth Methodの有効化とロール例
# 有効化
vault auth enable oidc
# グローバル設定(ディスカバリとクレデンシャル)
vault write auth/oidc/config \
oidc_discovery_url="https://idp.example.com" \
oidc_client_id="vault-client" \
oidc_client_secret="s.********" \
default_role="web"
# ロール定義
vault write auth/oidc/role/web \
user_claim="sub" \
bound_audiences="vault" \
allowed_redirect_uris="http://localhost:8250/oidc/callback" \
allowed_redirect_uris="https://vault.example.com/ui/vault/auth/oidc/oidc/callback" \
oidc_scopes="openid,profile,email,groups" \
groups_claim="groups" \
claim_mappings="email=alias_email" \
token_policies="dev"
# ログイン(ブラウザ連携)
vault login -method=oidcJWT Auth Methodは、外部で発行済みのJWTをVaultが検証する非対話的な方法です。jwks_url(または公開鍵)とbound_issuer、bound_audiences等を指定し、ロールで検証要件と付与ポリシーを定義します。CI/CDやサーバサイドのマシンIDに向いています。
KubernetesやクラウドのワークロードID(例: OIDCフェデレーション)も、原理的にはJWT検証です。VaultにはKubernetes専用のAuth Methodもありますが、汎用JWTで統合する設計も可能です。
| 観点 | OIDC Auth Method | JWT Auth Method | Kubernetes Auth |
|---|---|---|---|
| 主な用途 | 人のSSO(ブラウザ連携) | 機械間・CI/CDの非対話 | PodのServiceAccount JWT |
| 鍵取得 | OIDC Discovery→JWKS自動 | jwks_url or 公開鍵登録 | K8s APIサーバの公開鍵 |
| 対話性 | 必要(ブラウザ/コールバック) | 不要(APIのみ) | 不要(Pod内トークン) |
| 設定の核 | oidc_discovery_url, client_id/secret, role | jwks_url or jwt_validation_pubkeys, bound_issuer/aud | kubernetes_host, ca_cert, token_reviewer_jwt |
| ポリシー付与 | role設定+claims mapping | role設定+claims mapping | role設定+SA/namespace等の束縛 |
| ハマりどころ | redirect_uri不一致、scope不足 | aud/iss不一致、鍵ローテーション | API接続/証明書、SAトークンの種類 |
JWT Auth Methodの有効化とロール例
# 有効化
vault auth enable jwt
# JWT検証設定(JWKS推奨)
vault write auth/jwt/config \
jwks_url="https://idp.example.com/.well-known/jwks.json" \
bound_issuer="https://idp.example.com/"
# ロール定義(audやsubの束縛で絞り込み)
vault write auth/jwt/role/ci \
role_type="jwt" \
user_claim="sub" \
bound_audiences="vault" \
bound_subject="repo:org/app:ref:refs/heads/main" \
token_policies="ci-readonly"
# ログイン(JWT提示)
JWT=$(cat idp-issued.jwt)
vault write auth/jwt/login role="ci" jwt="$JWT"検証失敗の大半はiss/aud不一致、時刻ずれ、リダイレクトURI不一致、鍵の取り違いです。まずJWTをデコードし、Vaultロールのbound_*と照合、IdPのディスカバリ/ JWKSをcurlで確認するのが定石です。
試験対策としては、Auth MethodとSecrets Engineの違い、Entity/Aliasの概念、ポリシー適用の流れ、OIDCとJWTの使い分け、roles/claim_mappings/groups_claimの役割を明確にしておくと得点に直結します。
現場で使う確認手順の例
# 1) JWTの中身を確認(署名は検証しないがクレーム把握に有用)
cut -d'.' -f2 <<< "$JWT" | base64 -d 2>/dev/null | jq .
# 2) IdPのディスカバリ/JWKS確認
curl -s https://idp.example.com/.well-known/openid-configuration | jq .
curl -s https://idp.example.com/.well-known/jwks.json | jq .
# 3) Vaultロール/設定の点検
vault read -format=json auth/jwt/config | jq .
vault read -format=json auth/jwt/role/ci | jq .
# 4) 発行されたVaultトークンの確認
vault token lookup <vault_token>Associate
問題 1
VaultのJWT Auth Methodで、IdPが発行するJWTのaudクレーム不一致により認証が失敗しています。最も適切な対処はどれですか?
正解: A
JWT Auth Methodではロールのbound_audiencesにより受け入れるaud値を制限します。IdPが発行するaudと一致させるのが正解です。TTLやシークレットエンジン設定はaud不一致の解決になりません。
複数のIdP(例: OktaとAzure AD)を同時に統合できますか?
はい。パスを分けて複数のAuth Methodを有効化します(例: auth/oidc-okta、auth/oidc-azure、auth/jwt-ciなど)。それぞれでrolesを定義し、Identity側で同一ユーザ/ワークロードのAliasを同一Entityに束ねれば、ポリシー管理を一元化できます。
IdP側の鍵ローテーションにVaultはどう追随しますか?
OIDCやJWTでjwks_urlを使っていれば、VaultはJWKSを参照して署名検証を行います。kidに応じた鍵選択が行われるため、IdPで鍵をローテーションしても再設定は不要です(ネットワーク到達性とキャッシュ有効期限には注意)。
ヘッドレス環境でOIDCのブラウザ対話が使えません。どうすべきですか?
非対話のワークロードやCI/CDにはJWT Auth Methodを使うのが実務的です。発行元IdPやプラットフォームでJWTを取得し、Vaultのjwtロールに対してaud/iss/subを束縛して認証します。
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...