システム屋まそおロゴ

環境変数を暗号化実行ファイルにする envball を作りました

report

.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(ビルドに使用)
  • Tasktask 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 ログなどから漏洩するため、あえてサポートしていません。

トークンの解決順は次のとおりです。

  1. --token-file <path> — 明示的なフラグ(- または /dev/stdin で標準入力から読み込み)
  2. $CREDENTIALS_DIRECTORY/envball-token — systemd の credentials ディレクトリ
  3. <executable>.token — バンドルバイナリの隣のトークンファイル

例えばパイプで渡すこともできます。

cat env.ball.token | ./env.ball --token-file - -- bin/rails server


なお、AWS Secrets Manager などの外部シークレットストアからトークンを取得する仕組みも今後対応を検討しています。その場合もトークンは環境変数経由では渡さない方針は変えません。


まとめ

envball は、平文の .env を持ち回ることへの不安を、暗号化された自己完結型バイナリとトークンファイルの組み合わせに置き換えるツールです。

  • 平文の .env をディスクに残さない
  • 復号にクラウド鍵が不要(既定ではネットワーク通信なし)
  • 変数名と値の両方を暗号化

チーム開発での .env の受け渡しや、AI ツールにリポジトリを触らせる環境での秘匿に向いています。
気になった方は GitHub リポジトリ を覗いてみてください。Star やフィードバックも歓迎です。