前置き
開発エージェントAIとしてPJに導入する際の要件として、".env"の中身をエージェントに読み取られないようにすることというものがありました。
そこでdotenvxを導入したのですが、完全に私のミスで秘密鍵の漏洩をやらかしてしまいましたのでここで供養を行います。
要約
dotenvx encryptで暗号化を行う際に、同名の環境変数があった場合、二つ目の変数は暗号化されません
例
.env
secretkey=hoge
secretkey=fuga
another_secretkey=piyo
// another_secretkey=piyo2
これをdotenvx encryptで暗号化すると...
.env
secretkey=hoge // 暗号化されていない!!
secretkey=encrypted:~~~~~~~~~~~~~~
another_secretkey=encrypted:~~~~~~~~~~~~
// another_secretkey=piyo2 // これも暗号化されない!!
- 同名の環境変数がある場合
- 環境変数がコメントアウトされている場合
は暗号化が行われないため注意が必要です。
無論、そもそも同名の環境変数やコメントアウトによる管理そのものが良くないのですが...
対策で作ったlefthook
check-env-encryption.sh
#!bin/bash
set -e
echo "Checking for unencrypted secrets in .env..."
# .env ファイルが存在しなければスキップ
if [ ! -f ".env" ]; then
echo ".env file not found, skipping check"
exit 0
fi
# コメント行、空行、公開鍵、暗号化済みの行をスキップ
unencrypted_lines=$(grep -v "^#" .env | \
grep -v "^$" | \
grep -v "^DOTENV_PUBLIC_KEY" | \
grep -v "encrypted:" | \
grep "=" || true)
if [-n "$unecrypted_lines" ]; then
echo "ERROR: Unecrypted secrets detected in .env file!"
echo "Please encrypt using: dotenvx encrypt"
exit 1
fi
echo "All .env values are properly encrypted!"
exit 0
lefthook.yml
pre-commit:
commands:
env-encryption-check:
glob: ".env"
run: bash .githooks/check-env-encryption.sh
fail_text: ".env file must be encrypted with dotenv encrypt!"