Vault の cert 認証は、クライアント証明書を提示して Vault にログインし、ポリシーが付与されたトークンを取得する方式です。mTLS で証明書を提示し、認証メソッド側で証明書とポリシーの対応付けを行います。
本稿は、公式挙動に沿った最小限の導入、設計の要点、失効やローテーションの考え方、試験で混同しやすい点を短時間で押さえられるようにまとめています。
Vault の cert 認証は、TLS クライアント証明書を提示して /auth/cert/login にログインし、Vault が証明書を検証してポリシー付トークンを発行する仕組みです。認証自体は Vault の cert 認証メソッドが行い、通信路の暗号化とサーバー認証は通常の TLS 設定が担います。
証明書の信頼は、cert 認証メソッドに登録したクライアント証明書そのもの、または発行元 CA 証明書に基づいて行われます。CA 単位で信頼する場合は、CN や SAN、OU などの属性で許容範囲を絞り込む設計が重要です(属性名や詳細なパラメータはバージョンで差異があり得るため、導入時はドキュメントを確認してください)。
試験では、mTLS で提示したクライアント証明書を「Vault 側の cert 認証メソッドで検証・マッピングしてトークンを発行する」という流れと、AppRole や Kubernetes/OIDC など他方式との使い分けが頻出です。
最小のログイン例(CLI と curl)
export VAULT_ADDR=https://vault.example.com:8200
export VAULT_CACERT=/path/to/vault-ca.pem
export VAULT_CLIENT_CERT=/path/to/client.pem
export VAULT_CLIENT_KEY=/path/to/client.key
# CLI でログイン(cert 認証)
vault login -method=cert
# HTTP で直接(mTLS 必須)
curl --cacert /path/to/vault-ca.pem \
--cert /path/to/client.pem --key /path/to/client.key \
https://vault.example.com:8200/v1/auth/cert/login最小構成は、1) 認証メソッドの有効化、2) クライアント証明書や CA の登録(ポリシー紐付け)、3) mTLS でのログイン、の3段階です。開発・検証から始め、本番では属性で許容範囲を絞り、トークン TTL/Max TTL/Period を設計します。
証明書単体でピン留めすると紛失・失効対応が明確になります。CA 単位で信頼する場合は利便性が上がる反面、失効伝播や属性スコープ設計がより重要です。
最小の設定例(証明書ピン留め と CA 信頼の両パターン)
# 認証メソッドを有効化
vault auth enable cert
# パターンA: 特定クライアント証明書をピン留め(証明書そのものを登録)
# client.pem は公開鍵証明書(PEM)。ポリシー dev-app を付与
auth_path="auth/cert/certs/dev-client"
vault write ${auth_path} \
certificate=@/path/to/client.pem \
policies="dev-app" \
display_name="dev-client"
# パターンB: 発行元 CA を信頼(CA による署名済みクライアント証明書を受け入れる)
auth_path="auth/cert/certs/ci-clients-ca"
vault write ${auth_path} \
certificate=@/path/to/ci-clients-ca.pem \
policies="ci-build" \
display_name="ci-clients"
# CN/SAN/OU などの属性で許容範囲を狭めるオプションを追加(Vault のバージョンにより名称差異あり)
# 例: allowed_common_names=..., allowed_dns_sans=..., allowed_organizational_units=...
# ログイン(該当エントリを明示する場合)
vault login -method=cert name=dev-clientクライアントは mTLS で Vault に接続し、TLS ハンドシェイクでクライアント証明書を提示します。Vault はサーバー TLS で通信を保護しつつ、cert 認証メソッドが接続に付随する証明書を参照し、事前登録のマッピングと照合します。
マッチしたエントリに紐づくポリシーを付与したトークンが発行され、以降の Vault API 呼び出しに利用します。
| 認証方式 | 代表ユースケース | ローテーション性・リスク/注意点 |
|---|---|---|
| cert(クライアント証明書) | CI/CD、内部自動化、マシン間通信 | 証明書管理が鍵。CA 信頼時は属性スコープ・失効設計が必須 |
| AppRole | サーバー/ジョブからのヘッドレス認証 | RoleID/SecretID の保護とローテーション。ネットワークだけで保護しない |
| Kubernetes(SA JWT) | K8s 上のワークロード | ServiceAccount JWT のバインドと Namespaces/SA 制限 |
| OIDC/JWT | 人とアプリ双方(IdP でのフェデレーション) | ブラウザフロー/トラスト設定。トークンクレームのマッピング |
mTLS と cert 認証メソッドの流れ
Client Vault
| TLS ClientHello |
|------------------------------>|
| presents client certificate |
|<------------------------------|
| TLS handshake complete |
| |
| POST /auth/cert/login (mTLS) |
|------------------------------>|
| verify cert -> match mapping |
| issue token with policies |
|<------------------------------|
| use token for secrets/API |
|------------------------------>|トークン取得後の利用(例: KV から読む)
# ログインで得たトークンを環境変数に設定
export VAULT_TOKEN="s.xxxxx"
# KV v2 シークレットの読み取り
auth_header="X-Vault-Token: ${VAULT_TOKEN}"
curl --cacert /path/to/vault-ca.pem \
-H "${auth_header}" \
https://vault.example.com:8200/v1/secret/data/app/configCA を登録して広く受け入れる設計は運用が楽ですが、失効チェックや属性スコープの不足はリスクです。CN や SAN(DNS/URI/Email)、組織/部門(O/OU)で許容対象を厳密化し、ポリシーは最小権限に保ちます。
Vault の cert 認証は、提示証明書が事前登録エントリと整合するかで判定します。外部の CRL/OCSP を自動参照する前提にはしないほうが安全です。短命なクライアント証明書発行、ピン留め、マッピングの削除で迅速な無効化を図るとよいでしょう。
トークン側の TTL/Max TTL/Period を活用して、証明書が長命でもアクセスは短命化できます。人ではなくマシン認証中心のユースケースで効果的です。
属性で許容範囲を狭める設定の例(概念)
# CA を登録しつつ、CN/SAN/OU を制限する例(実際のパラメータ名はバージョンで要確認)
vault write auth/cert/certs/ci-clients-ca \
certificate=@/path/to/ci-clients-ca.pem \
policies="ci-build,artifact-read" \
display_name="ci-clients" \
# 以下は概念例(allowed_* や required_* の名称は環境の Vault で確認)
allowed_common_names="ci-*,build-*" \
allowed_dns_sans="*.corp.local" \
allowed_organizational_units="CI,Build"ローテーションは二層で考えます。証明書(クライアント鍵素材)と、Vault トークンです。証明書は短命発行と更新手順を自動化し、Vault 側はトークン TTL/Period とポリシー最小化で被害半径を小さくします。
接続失敗は TLS レイヤと認証メソッドの二段階で切り分けます。TLS で弾かれる場合は証明書の提示有無やチェーン不備、キー不一致が多く、認証メソッドで弾かれる場合はマッピング未登録や属性不一致が典型です。
点検コマンド集
# 登録済みエントリ一覧
vault list auth/cert/certs
# 個別エントリ内容
vault read auth/cert/certs/dev-client
# 即時無効化(マッピング削除)
vault delete auth/cert/certs/dev-client
# TLS ハンドシェイク確認(証明書提示の検証)
openssl s_client -connect vault.example.com:8200 \
-cert /path/to/client.pem -key /path/to/client.key \
-CAfile /path/to/vault-ca.pem -quietcert 認証は「クライアント証明書 → ポリシー付トークン」を発行します。TLS 自体の有効期限やサーバー証明書は別管理で、試験ではここを混同した選択肢が出ます。
AppRole はシークレット(SecretID)を配布管理できる環境に適し、cert は PKI・mTLS が整ったマシン間通信に向きます。人のログイン主体は OIDC/SAML 系が妥当という整理がよく問われます。
理解確認ワンライナー
# name を明示して特定エントリでログイン(競合回避)
vault login -method=cert name=ci-clients-caAssociate
問題 1
Vault の cert 認証を CA 単位で許可したところ、想定外のクライアント証明書でもログインできてしまった。最も適切な是正策はどれか。
正解: A
CA 単位で信頼する場合は、クライアント証明書属性(CN/SAN/OU など)のスコープを狭めるのが基本対策。サーバー TLS の更新や KV 設定は本件の原因に直接関係せず、方式切替は設計上の選択肢だが直近の是正としては過剰。
cert 認証は CRL/OCSP を自動的に参照して失効確認しますか?
Vault の cert 認証は、登録済みの証明書または CA に基づく照合が中心で、外部の失効ステータスを自動参照する前提にはできません。短命な証明書の発行、ピン留め、マッピング削除で迅速な無効化を設計してください。
同じ証明書が複数エントリにマッチする場合、どのポリシーが適用されますか?
複数マッチが起こり得る設計は避けるべきですが、運用上発生する場合は vault login -method=cert name=<entry> のように name を指定して対象エントリを明示するのが確実です。
人のログインに cert 認証は向いていますか?
可能ではありますが、一般には OIDC/SAML などの IdP 連携が監査・ライフサイクル・UX の面で適しています。cert は主にマシン間通信や CI/CD など自動化に向きます。
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...