AI

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 VaultInfisicalBitwarden SM
動的シークレット✅(DBパスワード自動生成)
Kubernetes統合✅(最高)限定的
開発者UX複雑✅(Doppler級)
GitHub Actions統合
監査ログ
言語GoTypeScript.NET/JS
GitHub Stars31k+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

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。