環境変数を暗号化実行ファイルにする envball を作りました
.env による情報漏洩のリスクの低減、チーム開発で .env を安全に受け渡したい人向けに
環境変数を暗号化された自己完結型の実行ファイルにする Go 製の CLI ツール envball を作りました。
GitHub: https://github.com/masoo/envball
なぜ作ったのか
チーム開発では平文の .env ファイルを受け渡しすることがよくあります。
しかし平文の .env は、git に登録してしまったり、 npm/rubygems 経由の脆弱性に巻き込まれたり、AI ツール経由でいとも簡単に漏れてしまいます。
envball はこれを次の 2 つに置き換えます。
- 暗号化された自己展開型のバンドルバイナリ
- 別管理のトークンファイル(デフォルト:
<binary>.token)
トークンが無ければバンドルは復号できません。
設計のポイント
- 復号にクラウド鍵を必要としない(sops のように復号のたびクラウド(KMS)へ問い合わせる必要がなく、手元のトークンだけでオフライン復号できます)
- 平文の
.envをディスクに復元しません(復号はメモリ内のみ) - トークンはバイナリに埋め込まない(別ファイルで受け渡し)
- env 変数の名前と値の両方を暗号化(名前は暗号化ペイロードの内側にあります)
既存ツールとの違い
.env の保護にはすでにいくつかの方法があります。envball はそのどれとも少し違う立ち位置です。
| ツール | 暗号化 | 配布形態 | クラウド/外部依存 | 変数名の秘匿 |
|---|---|---|---|---|
| dotenv | なし(平文) | .env ファイル |
なし | × |
| git-crypt | あり | リポジトリ内ファイル | GPG 鍵 | × |
| sops | あり | 暗号化ファイル | KMS / age など | × |
| envball | あり | 自己完結型の実行ファイル | なし(既定) | ○ |
envball の特徴は、復号して実行するところまでを 1 つのバイナリにまとめている点です。
復号した .env をディスクに書き出さず、変数名まで暗号化ペイロードの内側に隠すため、ファイルシステムを走査するツールからは中身が見えません。
使い方
前提
- Go(ビルドに使用)
- Task(
task buildを実行するため)
1. CLI をビルドする
task build
2. 暗号化された実行可能バンドルをビルドする
./bin/envball build -f .env -o env.ball
env.ball(パーミッション 0755)と env.ball.token(0600)の両方が出力されます。
復号せずにフォーマットバージョン・署名などを確認できます。
3. 子プロセスに env を注入して実行する
./env.ball -- env
./env.ball -- bin/rails server
--token-file を指定しない場合は、バイナリの隣にある env.ball.token を自動的に探します。
-- 以降はそのまま子コマンドへ渡されます。
トークンは環境変数経由では渡さない
トークンの受け渡しはファイル経由を基本にしています。
ENVBALL_TOKEN のような環境変数経由は、シェル履歴、CI ログなどから漏洩するため、あえてサポートしていません。
トークンの解決順は次のとおりです。
--token-file <path>— 明示的なフラグ(-または/dev/stdinで標準入力から読み込み)$CREDENTIALS_DIRECTORY/envball-token— systemd の credentials ディレクトリ<executable>.token— バンドルバイナリの隣のトークンファイル
例えばパイプで渡すこともできます。
cat env.ball.token | ./env.ball --token-file - -- bin/rails server
なお、AWS Secrets Manager などの外部シークレットストアからトークンを取得する仕組みも今後対応を検討しています。その場合もトークンは環境変数経由では渡さない方針は変えません。
まとめ
envball は、平文の .env を持ち回ることへの不安を、暗号化された自己完結型バイナリとトークンファイルの組み合わせに置き換えるツールです。
- 平文の
.envをディスクに残さない - 復号にクラウド鍵が不要(既定ではネットワーク通信なし)
- 変数名と値の両方を暗号化
チーム開発での .env の受け渡しや、AI ツールにリポジトリを触らせる環境での秘匿に向いています。
気になった方は GitHub リポジトリ を覗いてみてください。Star やフィードバックも歓迎です。