本稿は、VaultのPKIエンジンで「安全に証明書を発行・管理」するための実務指針を、Associate/Opsレベルの資格対策に沿ってまとめたものです。
公式ドキュメントの安定機能に基づき、用語整理、セットアップ、ロール設計、運用、セキュリティ、トラブル対応までを一気通貫で解説します。
VaultのPKIエンジンは、内部または外部のルートCA/中間CAを起点に、X.509証明書を発行・失効し、CRLや(バージョンにより)OCSPレスポンスを提供するための専用エンジンです。運用の中心は「ロール(roles)」で、発行可能なドメイン、SAN、TTL、鍵種別/サイズ、Key Usageなどの制約を定義します。
推奨設計は、オフラインRoot CAで中間CAを署名し、その中間CAをVaultに搭載して日常の発行を担当させる方式です。CRL配布点や発行済みCA証明書のURLは、pki/config/urlsで公開エンドポイントとして設定します。
試験・実務で混同しやすい点はTTLの境界です。リクエスト時のttlは、ロールのmax_ttlとエンジンのmax-lease-ttl(tuneで設定)の双方を超えられません。失効はserial_number指定で行い、CRLは自動再構築を有効化して最新状態を配布します。
発行フロー(オフラインRoot + Vault中間CA)
[Client] [Vault (pki_int)] [Offline Root]
| CSR (optional) issue/sign | verify policy/role | used only to sign
|------------------------------------->|--------------------------------| intermediate once
| | |
|<------------ cert/key/chain ---------| |
| |-- CRL build / OCSP (ver.dep) --|
|<------------- CRL/OCSP --------------| |
説明:
- Vaultは中間CAを保持。Rootはオフライン保管。
- 発行: issue/<role> で秘密鍵も生成し返却、sign/<role> でCSRを署名。
- CRL/OCSPの配布URLは pki/config/urls で設定。概念セクション(参考:CLIは後続セクションで詳述)
# このセクションは用語と全体像の説明です。
# 実コマンドは次セクション以降を参照してください。最小構成は単一マウントでRootを内蔵して即時発行できますが、実運用は「オフラインRoot + Vault中間CA」構成が基本です。Root用と中間用でマウントを分けるとTTLや運用方針を明確に分離できます。
URL公開(issuing_certificates, crl_distribution_points)は早い段階で設定し、アプリが即時にチェーンとCRLへ到達できるようにします。
| 方式 | 利点 | リスク/注意 | 主な用途 |
|---|---|---|---|
| 内蔵Rootのみ(オンラインRoot) | 最短で試せる・依存が少ない | Root露出の攻撃面が大きい。厳格運用に不向き | 検証・短期PoC |
| オフラインRoot + Vault中間CA | Root秘匿と発行運用の両立。ローテやCRL運用が安定 | 初期手順がやや多い。Root保管の手間 | 本番の標準解 |
| 外部企業CAが中間を署名 | 企業PKIポリシーに準拠可能。既存エコシステムと整合 | 外部CA停止時の発行影響。契約/手続き依存 | 社内共通CA基盤との連携 |
典型的手順(オフラインRoot + Vault中間CA)
# 1) マウント作成(Root/Intermediateを分離推奨)
vault secrets enable -path=pki_root pki
vault secrets tune -path=pki_root -max-lease-ttl=87600h
vault secrets enable -path=pki_int pki
vault secrets tune -path=pki_int -max-lease-ttl=8760h
# 2) Rootを内蔵生成(Rootをオフライン運用するなら以降は停止/隔離)
vault write pki_root/root/generate/internal \
common_name="Example Corp Root CA" \
ttl=87600h
# 3) 中間CAのCSRを生成
vault write -field=csr pki_int/intermediate/generate/internal \
common_name="Example Corp Intermediate CA" > pki_int.csr
# 4) Rootで中間CAを署名し、バンドルを取り込み
vault write -field=certificate pki_root/root/sign-intermediate \
csr=@pki_int.csr format=pem_bundle ttl=43800h > pki_int.pem
vault write pki_int/intermediate/set-signed certificate=@pki_int.pem
# 5) URLの公開設定(CAチェーン/CRLの外部到達性)
vault write pki_int/config/urls \
issuing_certificates="https://vault.example.com/v1/pki_int/ca" \
crl_distribution_points="https://vault.example.com/v1/pki_int/crl"
# 6) ロール作成(発行ポリシー)
vault write pki_int/roles/web \
allowed_domains="example.com" \
allow_subdomains=true \
allow_bare_domains=true \
max_ttl="168h" \
key_type="rsa" key_bits=2048 \
require_cn=false
# 7) 発行(鍵同梱)
vault write pki_int/issue/web \
common_name="api.example.com" \
alt_names="api-1.example.com" \
ip_sans="10.0.0.10" \
uri_sans="spiffe://cluster/ns/prod/sa/api" \
ttl="24h"
# 8) CRL自動更新(名称/詳細はバージョンで差異があるため導入前に確認)
vault write pki_int/config/crl auto_rebuild=true expiry="72h"ロールは「どの名前に、どの鍵・拡張で、最大どれくらいのTTLまで発行できるか」を縛る最小単位です。SANベース運用が主流のため、require_cn=falseを指定し、CNに依存しない設計が安全です。
ttlパラメータはロールのmax_ttlとエンジンのmax-lease-ttlの両方で上限がかかります。どちらか一方でも超えるとエラーになります。KeyUsage/ExtKeyUsageは用途(例:サーバ認証、クライアント認証)に合わせて明示します。
ロール定義とCSR署名の例
# サーバ認証/クライアント認証を許容するロール
vault write pki_int/roles/app \
allowed_domains="svc.cluster.local,example.internal" \
allow_subdomains=true \
require_cn=false \
max_ttl="240h" \
key_type="ec" \
key_bits=256 \
key_usage="DigitalSignature,KeyEncipherment" \
ext_key_usage="ServerAuth,ClientAuth" \
allowed_uri_sans="spiffe://cluster/*" \
allowed_ip_sans="10.0.0.0/8"
# CSRを渡して署名(秘密鍵はアプリ側で管理)
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -subj "/CN=api.svc.cluster.local" -reqexts SAN \
-config <(printf "[req]\ndistinguished_name=req\n[SAN]\nsubjectAltName=DNS:api.svc.cluster.local,URI:spiffe://cluster/ns/prod/sa/api") \
-out server.csr
vault write pki_int/sign/app [email protected] ttl="24h"失効はserial_numberを指定して実行します。CRLは自動再構築を有効化し、配布URLを通じてクライアントが取得できることを定期点検します。発行数が多い場合は、tidyで古いエントリをクリーンアップします(安全バッファを十分に確保)。
OCSPはバージョンにより提供方法や可否が異なるため、導入時にサポート状況を確認してください。CRLのみでの検証でも運用可能ですが、レスポンス速度要件に応じて選択します。
運用系コマンド例(失効、CRL、Tidy)
# 失効(シリアルはコロン区切り形式が一般的)
vault write pki_int/revoke serial_number="15:3a:9f:..."
# CRLの現在値(HTTPで配布する。CLI例は参考)
curl -s https://vault.example.com/v1/pki_int/crl > crl.pem
# Tidy(古い証明書/失効済の整理)。本番はメンテ時間帯などで実行
vault write pki_int/tidy \
safety_buffer="72h" \
tidy_cert_store=true \
tidy_revoked_certs=true発行APIは最小権限で保護します。特定ロールのissue/signのみに絞ったポリシーを付与し、CAやロール定義の変更権限は別ロールに分離します。監査ログを必ず有効化し、発行・失効要求を追える状態にします。
TTLの境界は、エンジン(mount)のmax-lease-ttl、ロールのmax_ttl、発行要求のttlの三層で成立します。期待TTLを満たせない場合、どの層で制限されているかを確認します。Vault自体のHA/レプリケーション設計は、PKIエンジンの可用性を直接左右します。
ポリシー例(特定ロールの発行のみ許可)
# pki-issue.hcl
path "pki_int/issue/web" {
capabilities = ["create", "update"]
}
path "pki_int/sign/web" {
capabilities = ["create", "update"]
}
# 管理系(ロール作成/変更、CA更新)は別ポリシーで管理者のみに付与
# 運用に合わせてマウントの上限TTLを調整
vault secrets tune -path=pki_int -max-lease-ttl=168hTTL超過エラーは、ほとんどがrole.max_ttlまたはmount.max-lease-ttlに起因します。まずロール定義とマウント設定を確認しましょう。SANが拒否される場合は、ロール側のallowed_*_sansに網羅性があるかを見直します。
CRLサイズが肥大化する場合、発行/失効の頻度に対しexpiryや再構築間隔を見直し、tidyの実行も計画に組み込みます。チェーン不整合(中間証明書の欠落)はconfig/urlsのissuing_certificatesが正しく公開されているかを確認します。
確認に使える読み取り系コマンド
# CAチェーンの確認
vault read pki_int/ca/pem
# ある証明書シリアルの詳細(REST経由の例)
curl -s https://vault.example.com/v1/pki_int/cert/15:3a:9f:... | jq .
# URL設定の確認
vault read pki_int/config/urlsAssociate / Ops
問題 1
Vaultのpki_intマウントで、ウェブ証明書を通常は24時間TTLで発行しつつ、最大でも7日を超えないようにしたい。最も適切な設定はどれか?
正解: A
PKIのTTLは三層(mount.max-lease-ttl、role.max_ttl、発行要求ttl)で制御されます。Aは24hの通常発行と7日上限を両方満たします。Bは最大許容を24hに固定してしまい要件不適合。CはトークンTTLと証明書TTLは無関係。DはCRL設定で証明書TTLは制御できません。
issueとsignの違いは?どちらを使えばよいですか?
issue/<role>はVaultが鍵を生成して証明書と一緒に返します。sign/<role>は外部で生成したCSRを署名するエンドポイントです。鍵の保管要件やアプリのキーマネジメント方針に合わせて選びます(外部HSMやアプリ側で鍵を保持したい場合はsign)。
TTLの設定でエラーが出ます。どこを見直せばよいですか?
発行時ttl、ロールのmax_ttl、マウントのmax-lease-ttlの三つを確認してください。いずれかが小さければエラーになります。一般に、mount.max-lease-ttl ≥ role.max_ttl ≥ 発行時ttl となるように設計します。
CRL/OCSPの最小運用はどうすべきですか?
まずCRLの自動再構築(auto_rebuild)と外部公開URL(config/urls)を確実に設定します。OCSPはバージョンや要件により導入可否が分かれるため、要求される検証速度やインフラ制約を踏まえ、サポート状況を確認してから採用を判断します。
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...