OSSのシークレット管理比較:HashiCorp Vault vs Infisical vs Doppler代替でAPIキーを安全に管理する
オープンソースラボ編集部 ・ 2026年6月13日
OSSのシークレット管理比較:HashiCorp Vault vs Infisical vs Doppler代替でAPIキーを安全に管理する
AWS Secrets Manager(月$0.40/シークレット〜)・Doppler(月$0/Free〜$24/Team)に対して、HashiCorp Vault(最も強力なエンタープライズシークレット管理)・Infisical(Doppler代替・開発者フレンドリー)・Bitwarden Secrets Manager(パスワードマネージャーのシークレット版)はOSSのシークレット管理サービスです。
シークレット管理が必要な理由
.envファイルにAPIキーを書いてGitにコミットするのは絶対禁止です。実際に起きる問題:
- GitHubスキャン: GitHubは公開リポジトリのシークレットを自動検出してAPIプロバイダーに通報・無効化する
- ログ漏洩:
console.log(process.env)でAPIキーがVercelのビルドログに残る - 権限管理: 退職者のAPIキーを即座に無効化できない
- ローテーション: 90日ごとのパスワード変更を人手で全環境に適用できない
主要ツールの概要
HashiCorp Vault
2015年に公開されたGo製のエンタープライズシークレット管理システムです。GitHubスター31k+。最も機能が充実したOSSシークレット管理ツールで、動的シークレット(使い捨てDBパスワード)・自動ローテーション・監査ログ・マルチクラウド認証(AWS IAM・GCP SA・K8s ServiceAccount)・PKI証明書管理を提供。Kubernetes環境でのシークレット注入に最も使われています。
# HashiCorp Vaultをk8sにインストール(Helm)
helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update
# Vault HA構成(本番推奨)
helm install vault hashicorp/vault --namespace vault --create-namespace --set server.ha.enabled=true --set server.ha.replicas=3 --set server.ha.raft.enabled=true --set ui.enabled=true
# Vaultの初期化
kubectl exec -n vault vault-0 -- vault operator init -key-shares=5 -key-threshold=3 -format=json > vault-init.json
# アンシール(初回のみ)
for i in 0 1 2; do
UNSEAL_KEY=$(cat vault-init.json | jq -r ".unseal_keys_b64[$i]")
kubectl exec -n vault vault-0 -- vault operator unseal $UNSEAL_KEY
done
# Vault CLIでシークレットを操作
export VAULT_ADDR="https://vault.yourcompany.com"
export VAULT_TOKEN=$(cat vault-init.json | jq -r ".root_token")
# KV v2シークレットエンジンを有効化
vault secrets enable -path=myapp kv-v2
# シークレットを登録
vault kv put myapp/production DATABASE_URL="postgresql://user:pass@prod-db:5432/myapp" STRIPE_SECRET_KEY="sk_live_xxxxxxxx" OPENAI_API_KEY="sk-xxxxxxxx" JWT_SECRET="your-jwt-secret-here"
# シークレットを取得
vault kv get -format=json myapp/production
vault kv get -field=DATABASE_URL myapp/production
# シークレットのバージョン履歴を確認
vault kv metadata get myapp/production
# 特定バージョンに戻す
vault kv rollback -version=2 myapp/production
# Pythonアプリ(FastAPI)からVaultのシークレットを取得
import hvac # pip install hvac
import os
from functools import lru_cache
@lru_cache(maxsize=1)
def get_vault_client():
client = hvac.Client(
url=os.environ["VAULT_ADDR"],
token=os.environ["VAULT_TOKEN"], # 本番では AppRole認証を使用
)
assert client.is_authenticated(), "Vault認証失敗"
return client
def get_secret(path: str, mount_point: str = "myapp") -> dict:
client = get_vault_client()
response = client.secrets.kv.v2.read_secret_version(
path=path,
mount_point=mount_point,
)
return response["data"]["data"]
# アプリ起動時にシークレットをロード(環境変数に注入)
secrets = get_secret("production")
os.environ["DATABASE_URL"] = secrets["DATABASE_URL"]
os.environ["OPENAI_API_KEY"] = secrets["OPENAI_API_KEY"]
# Vault Agent Sidecarで Kubernetes PodにシークレットをAutoで注入
# Deployment の annotations でVaultシークレットを自動マウント
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
metadata:
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-inject-status: "update"
vault.hashicorp.com/role: "myapp-production"
# シークレットをファイルとしてマウント
vault.hashicorp.com/agent-inject-secret-config: "myapp/data/production"
vault.hashicorp.com/agent-inject-template-config: |
{{- with secret "myapp/data/production" -}}
export DATABASE_URL="{{ .Data.data.DATABASE_URL }}"
export OPENAI_API_KEY="{{ .Data.data.OPENAI_API_KEY }}"
{{- end }}
spec:
serviceAccountName: myapp
containers:
- name: myapp
image: yourregistry/myapp:latest
command: ["/bin/sh", "-c"]
args: ["source /vault/secrets/config && node server.js"]
Infisical
2022年に公開されたTypeScript製のOSSシークレット管理サービスです。GitHubスター17k+。Dopplerに最も近いUXで、WebUI・CLI・SDK・GitHub Actions・Kubernetes連携など開発者体験を重視した設計。ローカル開発から本番Kubernetesまでシームレスに使えます。
# Infisicalをセルフホスト(Docker Compose)
git clone https://github.com/Infisical/infisical
cd infisical
cp .env.example .env
# .env の設定
# ENCRYPTION_KEY: openssl rand -hex 16 で生成
# AUTH_SECRET: openssl rand -base64 32 で生成
docker compose -f docker-compose.prod.yml up -d
# WebUI: http://localhost:80
# Infisical CLIのインストール
npm install -g @infisical/cli
# プロジェクトに接続
infisical login
infisical init # .infisical.json を生成(gitignoreに追加)
# ローカル開発でシークレットを環境変数としてアプリを起動
infisical run -- npm run dev
infisical run -- python manage.py runserver
infisical run -- node server.js
# シークレットを取得
infisical secrets --env=production
infisical secrets get DATABASE_URL --env=production
// Infisical Node.js SDKでシークレットを取得
import InfisicalClient from "infisical-node";
const client = new InfisicalClient({
token: process.env.INFISICAL_TOKEN, // サービストークン
siteURL: "https://secrets.yourcompany.com", // セルフホストURL
});
// 全シークレットを取得
const secrets = await client.getAllSecrets({
environment: "production",
path: "/",
});
// 特定のシークレットを取得
const dbUrl = await client.getSecret("DATABASE_URL", {
environment: "production",
type: "shared",
});
console.log(dbUrl.secretValue);
// Next.jsのapp/api/route.tsでの使用
export async function GET() {
const openaiKey = await client.getSecret("OPENAI_API_KEY", {
environment: process.env.NODE_ENV === "production" ? "production" : "development",
});
// サーバーサイドのみで使用(クライアントに漏らさない)
const response = await fetch("https://api.openai.com/v1/chat/completions", {
headers: { Authorization: `Bearer ${openaiKey.secretValue}` },
// ...
});
}
機能比較表
| 比較項目 | HashiCorp Vault | Infisical | Bitwarden SM |
|---|---|---|---|
| 動的シークレット | ✅(DBパスワード自動生成) | ❌ | ❌ |
| Kubernetes統合 | ✅(最高) | ✅ | 限定的 |
| 開発者UX | 複雑 | ✅(Doppler級) | 中 |
| GitHub Actions統合 | ✅ | ✅ | ✅ |
| 監査ログ | ✅ | ✅ | ✅ |
| 言語 | Go | TypeScript | .NET/JS |
| GitHub Stars | 31k+ | 17k+ | 3k+ |
シークレットをCI/CDに安全に渡すにはDevOpsカテゴリ/categories/devopsのGitLab CI・GitHub Actionsでinfisical run --コマンドを使います。Kubernetesへのシークレット自動注入はSecurityカテゴリ/categories/securityのVaultサイドカーパターンが最も実績があります。
FAQ
Q. .envファイルの代わりにどのシークレット管理ツールを選ぶべきですか?
A. スタート規模による: 個人・スモールチーム(5人以下): Infisicalの無料プランかBitwarden Secrets Manager。WebUIが直感的でCLI一発起動。中規模チーム(5〜50人): Infisicalセルフホスト。Dopplerの代替として機能が揃い、月$0でセルフホスト可能。Kubernetes本番運用: HashiCorp Vault。動的シークレット・サイドカーインジェクション・細かいポリシーが必要なら一択。エンタープライズ・セキュリティ要件厳しい: Vault Enterprise(有料)かAWS Secrets Managerとの組み合わせ。開発速度重視ならInfisical、本番セキュリティ重視ならVaultと使い分けが現実的です。
Q. HashiCorp VaultでPostgreSQLのパスワードを動的生成するには?
A. Vaultのデータベースシークレットエンジンで実現できます。
# PostgreSQLデータベースシークレットエンジンを有効化
vault secrets enable database
vault write database/config/myapp plugin_name=postgresql-database-plugin allowed_roles="myapp-readonly,myapp-readwrite" connection_url="postgresql://vault:vault_password@prod-db:5432/myapp?sslmode=verify-full" username="vault" password="vault_password"
# ロール定義(TTL 1時間の一時パスワード)
vault write database/roles/myapp-readonly db_name=myapp creation_statements="CREATE ROLE '{{name}}' WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO '{{name}}';" default_ttl="1h" max_ttl="24h"
# 動的パスワードを取得(アプリ起動ごとに新しいパスワードが発行される)
vault read database/creds/myapp-readonly
# username: v-token-myapp-abcdef123456
# password: A1b2C3d4-xxxxx-xxxxx(1時間で自動失効)
Q. Infisicalをローカル開発で使う際にチーム全員の設定を統一するには?
A. .infisical.json(gitにコミット可能・シークレットは含まれない)でプロジェクト設定を統一します。infisical initで生成後、リポジトリに含めてください。新しいメンバーは①Infisicalアカウント作成②プロジェクトへの招待③infisical loginでログインするだけでinfisical run -- npm run devが使えます。各環境(development/staging/production)でシークレットを分けて管理し、開発者はdevelopmentのみアクセス・本番シークレットはCI/CDだけがアクセスできるRBACを設定するのがベストプラクティスです。
Q. GitHub ActionsでInfisicalのシークレットを使うには?
A. GitHub Actions用のInfisical公式Actionがあります。
# .github/workflows/deploy.yml
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Infisicalからシークレットを取得
uses: Infisical/secrets-action@v1
with:
client-id: ${{ secrets.INFISICAL_CLIENT_ID }}
client-secret: ${{ secrets.INFISICAL_CLIENT_SECRET }}
env-slug: production
project-id: your-project-id
infisical-url: https://secrets.yourcompany.com # セルフホストURL
# 取得したシークレットはGitHub ActionsのEnvに自動セットされる
- name: デプロイ(シークレットが環境変数として使える)
run: npx vercel --prod --token $VERCEL_TOKEN
まとめ
| ユースケース | 推奨ツール |
|---|---|
| エンタープライズ・K8s・動的シークレット | HashiCorp Vault |
| Doppler代替・開発者UX重視 | Infisical |
| チームパスワード+シークレット統合管理 | Bitwarden Secrets Manager |