.envはもう不要:Infisical、Docker、Kubernetesによるモダンなシークレット管理

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

開発現場におけるシークレット管理の混沌とした現状

20人規模のスタートアップでの最初の1週間を覚えています。「公式」のオンボーディングは、非公開のSlackチャンネルにピン留めされたメッセージを確認することでした。そのメッセージには50以上の環境変数が含まれていました。新しいエンジニアが入社するたびに、その膨大なテキストの塊をコピーして.envファイルに貼り付ける必要があったのです。案の定、誰かが本番環境のデータベースパスワードを公開のGitHubリポジトリにコミットしてしまいました。その後の48時間は、認証情報のローテーション、ログの監査、そして自分たちの選択を問い直すことに費やされました。

シークレット管理をマスターすることは、モダンなDevOpsにおける必須スキルです。手動の.envファイルから卒業することは、単なるセキュリティチェック項目ではなく、精神衛生を保つためのものです。ステージングや本番環境で数十のマイクロサービスを扱う場合、「コピペ」方式は拡張性が低いだけでなく、デプロイの信頼性を完全に損なってしまいます。

なぜ多くのシークレット管理ワークフローは失敗するのか

シークレットの漏洩は、開発者が怠慢だから起こるわけではありません。「安全な」プロセスに摩擦(手間)が多すぎることが原因です。多くのチームが以下の3つの罠に陥っています。

  • Gitへの流出: .gitignoreの更新忘れや、一時的な「テスト」ファイルのコミットにより, シークレットがGitの履歴に混入します。
  • 構成の乖離 (Configuration Drift): ステージング環境では古いStripe APIキーが使われているのに、本番環境では新しいキーが使われており、ドキュメントは半年間放置されているといった状況です。
  • 「Vault」の壁: HashiCorp Vaultのようなエンタープライズツールは最高水準のセキュリティを提供しますが、学習曲線が非常に急です。小規模なチームにとって、本番グレードのVaultクラスターを管理するのは、スーパーに買い物に行くために宇宙船を建造するようなものです。

主要ツールの比較

私は通常、セットアップ時間、開発者体験(DX)、そしてロックインの3つの基準でシークレットマネージャーを評価します。現在の主要なツールの状況は以下の通りです。

機能 HashiCorp Vault Cloud Secrets (AWS/GCP) Infisical
セットアップの複雑さ 非常に高い (数日〜数週間) 低い (数分) 低い (10分)
セルフホスト はい いいえ (ベンダーロックイン) はい
開発者体験 (UX) CLI中心、硬直的なUI クラウドコンソール モダンで直感的なUI
オープンソース BSL (制限あり) いいえ MIT/オープンソース

最近、私はプロジェクトをInfisicalに移行しました。これはまさに「ちょうどいい」ツールです。DevOps以外のチームメンバーでも操作できる洗練されたUIを備えつつ、エンジニア向けには強力なCLIやKubernetesオペレーターが用意されています。スタック全体でシークレットを同期させる、信頼できる唯一の情報源(Single Source of Truth)として機能します。

DockerによるInfisicalのセットアップ

データを自分で管理するための最も早い方法は、Docker Composeを使用してInfisicalをセルフホストすることです。起動する前に、ENCRYPTION_KEYやデータベースパスワード用に、強力でランダムな文字列がいくつか必要になります。私はこれらを作成するためにパスワードジェネレーターを使用しています。ToolCraftのようなブラウザベースのツールを好むのは、文字列がローカルで生成され、サーバーに送信されないためです。これはセキュリティ上、譲れない条件です。

以下は、すぐに実行できる簡略化されたdocker-compose.ymlです。

version: '3.8'
services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: infisical
      POSTGRES_PASSWORD: 強力なパスワード
      POSTGRES_DB: infisical
    volumes:
      - db_data:/var/lib/postgresql/data

  backend:
    image: infisical/infisical:latest
    depends_on:
      - db
    environment:
      - DB_CONNECTION_URL=postgresql://infisical:強力なパスワード@db:5432/infisical
      - ENCRYPTION_KEY=32バイトの16進数キー
      - AUTH_SECRET=別のランダムな文字列
    ports:
      - "8080:8080"

volumes:
  db_data:

docker-compose up -dを実行してください。インスタンスはlocalhost:8080で起動します。オンボーディングウィザードに従えば、2分以内に最初の組織とプロジェクトを作成できます。

ローカルファイルを使わずにシークレットを注入する

シークレットをInfisicalに保存したら、それらを.envファイルにダウンロードするのはやめましょう。代わりに、Infisical CLIを使用してアプリケーションのプロセスに直接注入します。これにより、シークレットはハードドライブではなく、メモリ内にのみ存在することになります。

# CLIをインストール
curl -1sLf 'https://dl.cloudsmith.io/public/infisical/infisical-cli/setup.deb.sh' | sudo -E bash
sudo apt-get install -y infisical

# ログインと初期化
infisical login
infisical init

# シークレットを注入してアプリを実行
infisical run -- npm run dev

このコマンドは、インスタンスから最新のシークレットを取得し、それらを環境変数としてNode.jsに提供します。クリーンで高速、そして何より悪意のあるスクリプトに発見されるようなファイルが残りません。

Kubernetesへのスケール

KubernetesでSecretsオブジェクトを手動で管理することは、構成の乖離を招く原因となります。Infisicalは、ダッシュボードからクラスターへシークレットを自動的に同期する**Kubernetesオペレーター**でこの問題を解決します。

まず、Helm経由でオペレーターをインストールします。

helm repo add infisical-helm-charts https://dl.cloudsmith.io/public/infisical/helm-charts/helm/charts/
helm repo update
helm install infisical-operator infisical-helm-charts/infisical-operator

次に、InfisicalSecretリソースを定義します。特定のJSON構造を必要とする内部APIを扱う場合は、デプロイ前にYAML to JSONコンバーターを使用してマニフェストのフォーマットを確認します。標準的なYAML構造は以下の通りです。

apiVersion: secrets.infisical.com/v1alpha1
kind: InfisicalSecret
metadata:
  name: my-app-secrets
spec:
  hostAPI: https://あなたのInfisicalインスタンス.com/api
  authentication:
    universalAuth:
      secrets:
        clientSecretName: infisical-auth
        clientSecretNamespace: default
  managedSecretReference:
    secretName: app-config-secrets
    secretNamespace: production
  source:
    projectId: あなたのプロジェクトID
    environment: prod

オペレーターは橋渡しの役割を果たします。InfisicalのダッシュボードでデータベースのURLを変更すると、オペレーターがその変更を検知し、Kubernetes内のapp-config-secretsを自動的に更新します。Reloaderのようなツールを使用していれば、Podがローリングアップデートを実行し、新しい値を反映させることも可能です。

ワークフローの生産性を高めるヒント

これらのパイプラインを構築する際、データを即座に変換する必要があることがよくあります。例えば、SSL証明書や大きな設定ブロックをシークレットとして保存する場合、事前にエンコードが必要になることがあります。私はKubernetesマニフェスト用にこれらの文字列を準備するためにBase64エンコーダーを使用しています。毎回ターミナルコマンドを実行するよりもはるかに高速です。

さらに、常にデータの整合性を確認してください。バイナリファイルや複雑な設定の塊をアップロードする場合、ハッシュジェネレーターで素早くチェックすることで、アップロードしたファイルとアプリが受信したファイルが同一であることを確認できます。これは、後の大規模なデバッグの苦労を防ぐための小さなステップです。

結論

シークレット管理は、「安全ではない」か「使いにくい」かの二択であるべきではありません。Infisicalは、モダンなチームが期待するユーザー体験と、Vaultのようなエンタープライズグレードのセキュリティを両立させています。まずは CLIを使用してローカルの.envワークフローを整理することから始めましょう。慣れてきたら、オペレーターを使用してKubernetesへのデプロイを自動化してください。このアプローチは漏洩を防ぐだけでなく、デプロイパイプライン全体をより堅牢にし、管理を大幅に容易にします。

Share: