SecretEnv
あなたのチームでは、.env ファイルや証明書をどう共有していますか?
brew install ebisawa/secretenv/secretenv
「新しい API キーを Slack で送って」――多くのチームがやっていることですが、これには深刻なリスクがあります。
.env.example をリポジトリにコミットし、実際の値は各自が管理するパターン。
専用に作られた SaaS やクラウドの Secrets Manager は強力ですが、すべてのチームに合うわけではありません。
方向性は正しいですが、既存ツールには課題が残ります。
SecretEnv は、.env や証明書などの秘密情報を暗号化して Git リポジトリ上で管理する CLI ツールです。外部サービスやサーバーに依存せず、オフライン完結で動作します。
# 初期セットアップ(1回だけ)
secretenv init --member-handle alice@example.com
# .env を暗号化して Git 管理下に
secretenv import .env
# 値の追加・更新も直接操作
secretenv set DATABASE_URL "postgres://..."
secretenv set API_KEY "sk-..."
暗号化されたファイルは .secretenv/secrets/ に保存され、そのまま Git にコミットできます。平文の .env は不要になるため、秘密情報の漏洩リスクを排除できます。
# 暗号化された .env を環境変数として注入し、コマンドを実行
secretenv run -- docker compose up
secretenv run -- npm start
secretenv run -- rails server
# 個別の値を取得
secretenv get DATABASE_URL
secretenv run は、復号した値を環境変数としてプロセスに注入します。ディスクに平文を書き出さないため、.env ファイルの置き忘れや誤コミットによる漏洩を防げます。
# 新メンバーが参加
secretenv join --member-handle bob@example.com
# → PR を作成してチームにマージしてもらう
# 既存メンバーが rewrap を実行して鍵を配布
secretenv rewrap
# → bob が復号できるようになる
メンバーの追加・削除はすべて Git 上のファイル操作として表現されます。PR レビューを経るため、「知らないうちにアクセス権が付与されていた」という事態を防げます。
# メンバーを削除
secretenv member remove alice@example.com
# 暗号ファイルを再暗号化し、アクセスを遮断
secretenv rewrap
# → removed_recipients に記録され、開示履歴が追跡可能に
SecretEnv は、削除されたメンバーの履歴(removed_recipients)を暗号ファイル内に記録します。「この人は過去にこの秘密情報にアクセスできていた」という事実を可視化することで、メンバー脱退時に更新すべき秘密値の特定が容易になります。
SecretEnv のデータ形式は、.env のキー・バリューを個別に暗号化します。
set コマンドで値を更新すると、変更された entry と署名だけが差分になるrewrap でメンバーを追加しても、暗号化された値そのものは変わらない(鍵の配布情報だけが更新される)暗号ファイルなのに差分が最小限になるため、PR レビューで「何が変わったか」を把握できます。
SecretEnv のコア機能はすべてローカルで完結します。
SecretEnv は独自の暗号アルゴリズムを一切使用せず、標準化された暗号技術だけを組み合わせて設計されています。
各メンバーの公開鍵で個別に暗号化するため、秘密鍵を持つ本人だけが復号できます。暗号化には、Web ブラウザや TLS でも採用が進む HPKE(RFC 9180)を使用しています。
暗号ファイルには Ed25519 電子署名(RFC 8032)が付与されます。リポジトリ上のファイルが不正に書き換えられた場合、復号時に自動で検知します。
メンバー追加時に、SSH 秘密鍵による attestation 署名と GitHub API による公開鍵の突き合わせで本人性を検証し、偽の鍵の混入を防ぎます。
暗号化の過程で「どの秘密に対する暗号文か」「どの鍵世代で暗号化したか」を暗号学的に紐づけています。異なる文脈での暗号文の流用や差し替えはすべて検知されます。
技術詳細は
Security Designssh-keygen -t ed25519 で生成してください# Homebrew
brew install ebisawa/secretenv/secretenv
# 1. workspace を初期化
secretenv init --member-handle alice@example.com
# 2. 既存の .env を暗号化して取り込み
secretenv import .env
これだけで移行は完了です。以降は secretenv run や secretenv get で秘密情報にアクセスできます。
詳しい使い方は
User Guidessh-keygen -t ed25519 で生成してください。secretenv import .env で一括取り込みできます。既存のワークフローを変える必要はなく、secretenv run で従来どおりコマンドを実行できます。secretenv encrypt / secretenv decrypt で扱えます。secretenv run や secretenv get は非対話で動作するため、CI パイプラインに組み込めます。secretenv rewrap --rotate-key で暗号化に使う鍵自体を作り直して再暗号化できます。メンバー変更時だけでなく、定期的なローテーションにも対応しています。さらに詳しく知りたい方は
GitHub で見る