シークレット管理比較:HashiCorp Vault vs Infisical vs Doppler でシークレットを管理する
オープンソースラボ編集部 ・ 2026年6月13日
シークレット管理比較:HashiCorp Vault vs Infisical vs Doppler でシークレットを管理する
APIキー・DBパスワード・SSL証明書・OAuthシークレットを.envファイルで管理することはセキュリティリスクです。シークレット管理プラットフォームにより、シークレットを暗号化して中央管理・アクセス制御・監査ログ・自動ローテーションを実現します。HashiCorp Vault(OSS・最大シェア・エンタープライズ)・Infisical(Vault代替・モダンDX)・Doppler(SaaS+OSS代替)の3つが2026年の主要シークレット管理ツールです。
シークレット管理ツールを使う理由
- Gitへの誤コミット防止: APIキーが
.envや設定ファイルに書かれてGitに混入するリスクをゼロに - 動的シークレット: DBパスワードを15分ごとに自動ローテーション→漏洩しても短時間で無効化
- 監査ログ: 誰がいつどのシークレットにアクセスしたかをすべて記録→コンプライアンス対応
- 最小権限: サービス別・環境別(Dev/Stag/Prod)にアクセス制御→必要最小限のシークレットのみ渡す
主要ツールの概要
HashiCorp Vault
2015年公開(HashiCorp)、Go製のOSSです。GitHubスター30k+。最大シェアのOSSシークレット管理プラットフォームで、動的シークレット(DBの一時ユーザー自動生成)・シークレットエンジン(KV・PKI・AWS IAM・Kubernetes)・ポリシーベースのアクセス制御・完全な監査ログを提供します。2023年のBSL変更でOpenBao(OSSフォーク)が生まれました。
# docker-compose.yml: HashiCorp Vault(開発/本番)
version: "3.8"
services:
vault:
image: hashicorp/vault:1.18
restart: unless-stopped
ports:
- "8200:8200"
environment:
VAULT_ADDR: http://0.0.0.0:8200
VAULT_DEV_ROOT_TOKEN_ID: ${VAULT_ROOT_TOKEN} # 開発のみ
VAULT_DEV_LISTEN_ADDRESS: 0.0.0.0:8200
cap_add: [IPC_LOCK]
volumes:
- vault_data:/vault/data
- ./vault-config.hcl:/vault/config/vault.hcl
vault-init:
image: hashicorp/vault:1.18
depends_on: [vault]
environment:
VAULT_ADDR: http://vault:8200
VAULT_TOKEN: ${VAULT_ROOT_TOKEN}
command: |
sh -c '
vault secrets enable -path=secret kv-v2 &&
vault kv put secret/myapp/prod DB_PASSWORD=supersecret API_KEY=sk-xxxxx JWT_SECRET=jwt-secret &&
vault auth enable approle &&
vault policy write myapp-policy - <<EOF
path "secret/data/myapp/*" { capabilities = ["read"] }
EOF
vault write auth/approle/role/myapp-role token_policies="myapp-policy" token_ttl=1h token_max_ttl=4h
'
volumes:
vault_data:
# Python: HashiCorp Vault でシークレットを取得してアプリに注入
import hvac
import os
VAULT_ADDR = os.environ.get('VAULT_ADDR', 'http://localhost:8200')
VAULT_TOKEN = os.environ.get('VAULT_TOKEN', 'dev-root-token')
def get_vault_client() -> hvac.Client:
'''Vault クライアントを初期化(AppRole認証)'''
client = hvac.Client(url=VAULT_ADDR)
# AppRole 認証(本番環境)
role_id = os.environ.get('VAULT_ROLE_ID')
secret_id = os.environ.get('VAULT_SECRET_ID')
if role_id and secret_id:
client.auth.approle.login(role_id=role_id, secret_id=secret_id)
else:
# 開発環境: トークン認証
client.token = VAULT_TOKEN
return client
def get_secrets(path: str) -> dict:
'''KV v2からシークレットを取得'''
client = get_vault_client()
response = client.secrets.kv.v2.read_secret_version(path=path, mount_point='secret')
return response['data']['data']
def inject_secrets_to_environment(vault_path: str):
'''Vaultからシークレットを取得してOS環境変数に注入(アプリ起動前に呼び出す)'''
secrets = get_secrets(vault_path)
for key, value in secrets.items():
os.environ[key] = str(value)
print(f'注入完了: {list(secrets.keys())}')
def rotate_secret(path: str, key: str, new_value: str):
'''シークレットを更新(ローテーション)'''
client = get_vault_client()
current = get_secrets(path)
current[key] = new_value
client.secrets.kv.v2.create_or_update_secret(path=path, secret=current, mount_point='secret')
print(f'ローテーション完了: {path}/{key}')
# 使用例
inject_secrets_to_environment('myapp/prod')
db_password = os.environ.get('DB_PASSWORD')
print(f'DB接続: postgresql://admin:{db_password}@db:5432/myapp')
# Kubernetes での Vault エージェント サイドカー設定
k8s_annotation = '''
# Pod仕様のアノテーション(Vault Agent Injectorが自動でシークレットを注入)
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/agent-inject-secret-db: "secret/data/myapp/prod"
vault.hashicorp.com/agent-inject-template-db: |
{{- with secret "secret/data/myapp/prod" -}}
export DB_PASSWORD="{{ .Data.data.DB_PASSWORD }}"
export API_KEY="{{ .Data.data.API_KEY }}"
{{- end }}
vault.hashicorp.com/role: "myapp-role"
'''
Infisical
2022年公開、TypeScript製のOSSです。GitHubスター17k+。Vault代替として台頭するモダンなオープンソースシークレット管理プラットフォームで、Webダッシュボード・CLI・SDK・GitHub/GitLab/Kubernetes統合・シークレットバージョニング・ブランチ別シークレット管理・シークレットのオーバーライド(開発者が個別設定を上書き可能)が特徴です。
# docker-compose.yml: Infisical セルフホスト
version: "3.8"
services:
infisical:
image: infisical/infisical:latest
restart: unless-stopped
ports:
- "8080:8080"
environment:
NODE_ENV: production
ENCRYPTION_KEY: ${INFISICAL_ENCRYPTION_KEY} # 32バイトのランダム文字列
AUTH_SECRET: ${INFISICAL_AUTH_SECRET}
MONGO_URL: mongodb://mongo:27017/infisical
REDIS_URL: redis://redis:6379
SMTP_HOST: ${SMTP_HOST}
SMTP_PORT: 587
SMTP_FROM_ADDRESS: noreply@example.com
SMTP_FROM_NAME: Infisical
SMTP_USERNAME: ${SMTP_USER}
SMTP_PASSWORD: ${SMTP_PASS}
SITE_URL: https://secrets.example.com
depends_on: [mongo, redis]
mongo:
image: mongo:7-jammy
volumes:
- mongo_data:/data/db
redis:
image: redis:7-alpine
volumes:
mongo_data:
# Infisical CLI でシークレットをCI/CDで注入
npm install -g @infisical/cli
# ログイン(機械アカウント用トークン)
export INFISICAL_TOKEN="st.xxxxxxxxx"
# シークレットを環境変数に注入してコマンドを実行
infisical run --env=production --projectId=<project-id> -- node dist/server.js
# シークレットをファイルに出力
infisical export --env=production --format=dotenv > .env.production
# GitHub Actions での利用
# infisical secrets get DB_PASSWORD --env=production --plain
Doppler
クラウドSaaSですが比較のため掲載(OSS代替: Infisical)。最もシンプルなシークレット管理SaaSで、環境ごとのシークレット管理・GitHub Actions統合・シークレット変更時のWebhook通知・自動環境変数注入(CLI・Docker・K8s)を提供します。
# Doppler CLI セットアップ
brew install dopplerhq/cli/doppler
# ログインとプロジェクト設定
doppler login
doppler setup # プロジェクト・環境を選択
# シークレットを注入してアプリを実行
doppler run -- node server.js
# .envファイルとして出力(Doppler→Infisicalへの移行時など)
doppler secrets download --no-file --format=env > .env
機能比較表
| 比較項目 | HashiCorp Vault | Infisical | Doppler |
|---|---|---|---|
| OSSセルフホスト | ✅ | ✅ | ❌ SaaSのみ |
| 動的シークレット | ✅ 最強 | 限定 | ❌ |
| DX・UI | 中 | ✅ 最良 | ✅ |
| Kubernetes統合 | ✅(Injector) | ✅ | ✅ |
| GitHub Stars | 30k+ | 17k+ | N/A |
シークレット管理はセキュリティカテゴリ/categories/securityのKeycloak・Vaultwardenと並ぶセキュリティインフラの柱で、DevOpsカテゴリ/categories/devopsのKubernetes・GitHub Actions・OpenTofuと統合して「インフラコードに一切のシークレットを書かない」DevSecOpsを実現します。
FAQ
Q. Vaultで動的DBシークレット(一時パスワード)を設定するには?
A. VaultのDatabase Secrets Engineを有効化してDBの一時クレデンシャルを自動生成します。設定: ①vault secrets enable database②PostgreSQL接続設定: vault write database/config/mydb plugin_name=postgresql-database-plugin connection_url="postgresql://vaultuser:pass@db:5432/myapp" allowed_roles="myapp-role"③ロール作成: vault write database/roles/myapp-role db_name=mydb creation_statements="CREATE ROLE '{{name}}' WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' IN ROLE myapp_user;" default_ttl=15m max_ttl=1h④アプリはデプロイ時にvault read database/creds/myapp-roleを呼んで一時的なパスワード(15分で失効)を取得→DB接続。効果: 漏洩したパスワードは最大15分で無効→常時固定パスワードより大幅にリスク低下。
Q. InfisicalをGitHub ActionsのCI/CDパイプラインに統合するには?
A. Infisical公式GitHub Actionsを使ってシークレットをCI環境変数に注入します。設定: ①Infisical Dashboard→Service Tokens→CI/CD用トークンを生成②GitHub Settings→Secrets→INFISICAL_TOKENとして設定③GitHub Actions workflow: uses: Infisical/secrets-action@v1 with env: production・projectId: <id>・infisicalToken: ${{ secrets.INFISICAL_TOKEN }}→以降のstepでシークレットが環境変数として自動利用可能。複数環境: if: github.ref == 'refs/heads/main'でmainブランチはproduction・developブランチはstagingのシークレットを使用→ブランチで環境を切り替え。
Q. VaultとInfisicalの選び方は?
A. Kubernetes・動的シークレット・エンタープライズ・大規模ならVault、モダンUI・開発者体験重視・スタートアップ・シンプルKVストアならInfisicalが向いています。Vault優位: ①動的シークレット(DB・AWS IAM・PKI証明書の自動発行)②Kubernetes Auth(Pod ServiceAccountで自動認証)③HA構成(Raft統合ストレージ)で高可用性④詳細なポリシー言語(HCL)でゼロトラスト制御。Infisical優位: ①シンプルなWebダッシュボード(Vault UIより直感的)②シークレットオーバーライド(開発者が自分用の値を上書き可能)③GitへのDirect統合(ブランチでDev/Stag/Prod切り替え)④セットアップが簡単(docker-compose 1コマンド)。
Q. シークレットをGitに誤ってコミットしてしまった場合の対処は?
A. 即座に漏洩と判断してAPIキーを失効・ローテーションしてGit履歴から削除します。対処手順: ①漏洩したシークレット(APIキー・パスワード)を即座に無効化(APIプロバイダーのダッシュボードで失効)→新しいキーを発行②Git履歴から削除: git filter-repo --path <file> --invert-paths(or BFG Repo Cleaner: bfg --delete-files .env)→git push --force-with-lease origin --all③GitHub/GitLab: 「シークレットスキャン」が自動検出して通知してくれる場合あり(GitHub: Settings→Security→Secret scanning)。防止策: ①pre-commitフックでgitleaks・truffleHogを実行→コミット前にシークレット検出②.gitignoreに.env*・*.key・*secret*を追加③全員がgit-secretsをインストール→AWS/GCPキーのパターンをプッシュ前に自動チェック。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 動的シークレット・K8s・エンタープライズ | HashiCorp Vault |
| モダンUI・開発者体験・シンプルKV | Infisical |
| SaaS・セットアップ最速・チーム共有 | Doppler |