HashiCorp Vault
HashiCorp Vault シークレットエンジン ウェビナー — コンテンツ補足資料
最終更新: 2026/8/12
HashiCorp Vault シークレットエンジン ウェビナー — コンテンツ補足資料
位置づけ: ウェビナー参加者向けの事後配布・参照資料
対象: Vault 導入検討者・初学者〜中級者
1. シークレットエンジンとは
シークレットエンジンは Vault の マウントポイント(パス) に紐付いたプラグインコンポーネントです。 それぞれが独自のロジックでシークレットを「保存・生成・暗号化」します。
vault secrets list
Path Type Description
---- ---- -----------
aws/ aws AWS 動的クレデンシャル
database/ database DB 動的認証情報
pki/ pki PKI 証明書管理
secret/ kv KV v2 静的ストレージ
transit/ transit 暗号化 as a Service
エンジンの有効化パターン
# デフォルトパスで有効化(パス名 = エンジン種別名)
vault secrets enable kv-v2
# カスタムパスで有効化(同じエンジンを複数マウント可能)
vault secrets enable -path=team-a/secrets kv-v2
vault secrets enable -path=team-b/secrets kv-v2
2. ライフサイクルオペレーション詳解
2-1 enable(有効化)
# 基本
vault secrets enable <engine-type>
# オプション例
vault secrets enable \
-path=mydb \
-description="Production Database Secrets" \
-default-lease-ttl=1h \
-max-lease-ttl=24h \
database
主なオプション:
| オプション | 説明 | デフォルト |
|---|---|---|
-path | マウントパス | エンジン種別名 |
-description | 説明テキスト | 空 |
-default-lease-ttl | デフォルト TTL | システム設定に依存 |
-max-lease-ttl | 最大 TTL | システム設定に依存 |
-local | ローカルマウント(レプリケーション対象外) | false |
2-2 tune(チューニング)
再マウント不要でマウント設定を変更できます。
# TTL 変更
vault secrets tune -max-lease-ttl=8760h pki/
# 説明の更新
vault secrets tune -description="Updated description" database/
# 現在の設定確認
vault read sys/mounts/database
2-3 move(移動)
データを保持したままマウントパスを変更します。移動中は一時的にアクセス不可になります。
vault secrets move database/ prod/database/
⚠️ ポリシー内のパス参照は手動で更新が必要です。
2-4 disable(無効化)
vault secrets disable database/
⚠️ そのパスのデータは 完全削除 されます。事前にバックアップを取得してください。
3. KV v2 シークレットエンジン
Config と Role
KV には「Config」「Role」の概念はありません。パスベースのアクセス制御はポリシーで行います。
# ポリシー例:特定アプリの KV 読み取り専用
path "secret/data/myapp/*" {
capabilities = ["read", "list"]
}
path "secret/metadata/myapp/*" {
capabilities = ["list"]
}
KV v1 vs v2
| 機能 | KV v1 | KV v2 |
|---|---|---|
| バージョン管理 | なし | あり(デフォルト最大 10 バージョン) |
| ソフト削除 | なし | あり(kv delete) |
| 完全削除 | vault delete | vault kv destroy |
| CAS(競合防止) | なし | あり |
| メタデータ | なし | あり |
パスの構造(v2)
secret/data/myapp/config ← 実データの読み書き
secret/metadata/myapp/config ← メタデータ(バージョン情報)の読み書き
secret/delete/myapp/config ← ソフト削除
secret/undelete/myapp/config ← ソフト削除の取り消し
secret/destroy/myapp/config ← 完全削除
4. PKI シークレットエンジン
証明書階層の設計パターン
【パターン A:Vault をルート CA として使う】
Vault Root CA (pki/)
└── Vault Intermediate CA (pki_int/)
└── アプリ証明書発行ロール
【パターン B:外部ルート CA の中間 CA として Vault を使う】
外部 Root CA(例:企業 PKI)
└── Vault Intermediate CA (pki_int/) ← Vault が CSR 生成・署名申請
└── アプリ証明書発行ロール(推奨)
中間 CA 構成の手順
# Step 1:ルート CA の有効化(本番では外部ルート CA を使うこと)
vault secrets enable -path=pki pki
vault secrets tune -max-lease-ttl=87600h pki
vault write pki/root/generate/internal \
common_name="Root CA" ttl=87600h
# Step 2:中間 CA の有効化
vault secrets enable -path=pki_int pki
vault secrets tune -max-lease-ttl=43800h pki_int
# Step 3:CSR を生成
vault write pki_int/intermediate/generate/internal \
common_name="Intermediate CA" > /tmp/pki_int.csr
# Step 4:ルート CA で中間 CA を署名
vault write pki/root/sign-intermediate \
csr=@/tmp/pki_int.csr format=pem_bundle ttl=43800h > /tmp/int_cert.pem
# Step 5:中間 CA 証明書を設定
vault write pki_int/intermediate/set-signed \
certificate=@/tmp/int_cert.pem
# Step 6:証明書発行ロールの作成
vault write pki_int/roles/my-server \
allowed_domains="internal.example.com" \
allow_subdomains=true max_ttl="720h"
SSH 証明書の動的発行
# SSH シークレットエンジンの有効化
vault secrets enable ssh
# CA キーの生成
vault write ssh/config/ca generate_signing_key=true
# Vault ホスト用ロール(サーバー証明書)
vault write ssh/roles/server-role \
key_type=ca \
ttl=30m \
allow_host_certificates=true \
allowed_domains="example.com" \
allow_subdomains=true
# ユーザー証明書ロール
vault write ssh/roles/client-role \
key_type=ca \
ttl=30m \
allow_user_certificates=true \
allowed_users="*" \
default_extensions="permit-pty="
# ユーザーの公開鍵に署名(SSH 証明書の発行)
vault write ssh/sign/client-role \
public_key=@$HOME/.ssh/id_rsa.pub
# 発行された証明書で SSH 接続
vault write -field=signed_key ssh/sign/client-role \
public_key=@$HOME/.ssh/id_rsa.pub > ~/.ssh/id_rsa-cert.pub
ssh -i ~/.ssh/id_rsa -i ~/.ssh/id_rsa-cert.pub user@server.example.com
5. Database シークレットエンジン
サポートされる DB エンジン
| データベース | プラグイン名 | 特記事項 |
|---|---|---|
| PostgreSQL | postgresql-database-plugin | 最も一般的 |
| MySQL / MariaDB | mysql-database-plugin | ユーザー名 32 文字制限に注意 |
| MongoDB | mongodb-database-plugin | JSON 形式の creation_statements |
| MSSQL | mssql-database-plugin | SQL Server 認証 |
| Oracle | oracle-database-plugin | Enterprise 版のみ |
| Cassandra | cassandra-database-plugin | CQL 形式 |
| Redis | redis-database-plugin | ACL ベース |
| Elasticsearch | elasticsearch-database-plugin | ロールマッピング |
動的 vs 静的ロール
# 動的ロール:毎回新しいユーザーを生成
vault write database/roles/dynamic-role \
db_name=my-postgres \
creation_statements="CREATE ROLE ..." \
default_ttl="1h"
vault read database/creds/dynamic-role # → 新しいユーザー生成
# 静的ロール:既存ユーザーのパスワードを自動ローテーション
vault write database/static-roles/static-role \
db_name=my-postgres \
username="existing_app_user" \ # 既存 DB ユーザー
rotation_period="24h"
vault read database/static-creds/static-role # → ローテーション済みパスワードを返す
使い分けのポイント:
- 動的ロール → 短期間・使い捨て・最もセキュア(漏洩時は TTL を待つか即失効)
- 静的ロール → 既存ユーザーを使わざるを得ない場合・長期サービス用のパスワード自動ローテーション
6. AWS シークレットエンジン
3 種類の Credential Type
| タイプ | 仕組み | TTL | 推奨度 |
|---|---|---|---|
iam_user | IAM ユーザーを動的作成・削除 | 設定可能(注意:IAM レート制限) | 中 |
assumed_role | 既存 IAM ロールを STS AssumeRole | 最大 12h(AWS STS 制限) | 高(推奨) |
federation_token | GetFederationToken で一時クレデンシャル | 最大 36h | 低(制約多い) |
assumed_role の内部動作(詳細)
クライアント
│ vault read aws/creds/my-role
↓
Vault (aws engine)
│ 1. トークン検証・ポリシー確認
│ 2. config/root のクレデンシャルを取得
│ 3. AWS STS::AssumeRole(RoleArn, SessionName, DurationSeconds)
↓
AWS STS
│ 一時クレデンシャルを生成・返却
│ (AccessKeyId, SecretAccessKey, SessionToken, Expiration)
↓
Vault
│ 4. リース生成 (lease_id, lease_duration)
│ 5. クライアントへ返却
↓
クライアント
│ AWS API 呼び出し(AccessKey + SessionToken 必須)
↓
TTL 超過 または vault lease revoke
│ STS セッション自然満了 または AWS API で無効化
IAM Trust Policy の設定例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/vault-root-user"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "vault-webinar-demo"
}
}
}
]
}
Vault ルートユーザーに必要な最小 IAM 権限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:AttachUserPolicy",
"iam:CreateAccessKey",
"iam:CreateUser",
"iam:DeleteAccessKey",
"iam:DeleteUser",
"iam:DeleteUserPolicy",
"iam:DetachUserPolicy",
"iam:ListAttachedUserPolicies",
"iam:ListUserPolicies",
"iam:PutUserPolicy",
"sts:AssumeRole"
],
"Resource": "*"
}
]
}
7. リース管理のベストプラクティス
TTL 設計の考え方
Max TTL >= Default TTL
短命推奨(セキュリティ優先):
DB 認証情報: default_ttl=30m, max_ttl=2h
AWS クレデンシャル(iam_user): default_ttl=15m, max_ttl=1h
PKI 証明書(内部サービス): max_ttl=24h
PKI 証明書(人間向け): max_ttl=7d
リース操作コマンド一覧
# 特定リースの情報確認
vault lease lookup <lease_id>
# リースの更新(TTL をリセット)
vault lease renew <lease_id>
vault lease renew -increment=2h <lease_id>
# 特定リースの失効
vault lease revoke <lease_id>
# プレフィックスで一括失効(緊急時)
vault lease revoke -prefix database/creds/app-role/
vault lease revoke -prefix aws/creds/
# 全リースの失効(緊急時のみ)
vault lease revoke -prefix /
8. セキュリティとコンプライアンス上の注意点
監査ログの活用
# 監査デバイスの有効化
vault audit enable file file_path=/var/log/vault/audit.log
# 監査ログの確認(特定パスのアクセス履歴)
grep '"path":"database/creds"' /var/log/vault/audit.log | jq .
# 監査ログのポイント:
# - シークレット値は HMAC-SHA256 でハッシュ化されて記録
# - クライアント IP、トークン ID、操作種別(read/write)が記録
# - コンプライアンス要件(SOC2, PCI-DSS など)への対応
最小権限の原則
# NG:ワイルドカードで広い権限
path "aws/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# OK:必要なパスと操作のみ
path "aws/creds/s3-reader" {
capabilities = ["read"]
}
path "aws/creds/s3-writer" {
capabilities = ["read"]
}
9. 参考リンク
| リソース | URL |
|---|---|
| Vault 公式ドキュメント(シークレットエンジン一覧) | https://developer.hashicorp.com/vault/docs/secrets |
| AWS シークレットエンジン | https://developer.hashicorp.com/vault/docs/secrets/aws |
| PKI シークレットエンジン | https://developer.hashicorp.com/vault/docs/secrets/pki |
| Database シークレットエンジン | https://developer.hashicorp.com/vault/docs/secrets/databases |
| HashiCorp Japan Vault Workshop | https://github.com/hashicorp-japan/vault-workshop-jp |
| YouTube 解説動画 | https://www.youtube.com/watch?v=w2Rb5IwD-sM |
このコンテンツ資料は content/vault/webinar_secrets_engine_content.md に保存されています。