fnox を使って zshrc/bashrc から平文のシークレットをなくす
fnoxとは
シークレット管理用のCLIツールです。
ローカルでの暗号化や、AWS Secrets Manager, 1Password, OS keychainなどと連携できます。
mise作者の方の新作です。
インストール
miseでのインストールが推奨されています。
mise use -g fnox
その他のインストール方法については以下にまとまっています。
使ってみる
Quick Startをみながら進めてみます。
Quick Startでは age を使用したローカルでの暗号化で設定していますが、今回は MacOS の Keychain Access を使用する形で進めます。
※ version 1.3.0を使用しています。
init
initコマンドを使用すると初期設定のwizardが起動します。
OS Keychainを使う形で進めます。
~/work/fnox_test
% fnox init
🔐 Welcome to fnox setup wizard!
This will help you configure your first secret provider.
Would you like to set up a provider now? Yes
What type of provider do you want to use? OS Keychain
🔐 OS Keychain setup:
Uses your operating system's secure keychain
- macOS: Keychain Access
- Windows: Credential Manager
- Linux: Secret Service (GNOME Keyring, KWallet)
Service name (namespace for your secrets): fnox
Secret name prefix (optional): myapp/
Provider name: keychain
Would you like to add an example secret? No
✓ Created new fnox configuration at 'fnox.toml'
Next steps:
• Add secrets: fnox set MY_SECRET <value>
• List secrets: fnox list
• Use in commands: fnox exec -- <command>
~/work/fnox_test
%
~/work/fnox_test
% cat fnox.toml
default_provider = "keychain"
[providers.keychain]
type = "keychain"
service = "fnox"
prefix = "myapp/"
~/work/fnox_test
%
set
適当なシークレットを追加します。
~/work/fnox_test
% fnox set MY_PASSWORD "MyP@ssw0rd"
✓ Set secret MY_PASSWORD
~/work/fnox_test
% cat fnox.toml
[providers.keychain]
type = "keychain"
service = "fnox"
prefix = "myapp/"
[secrets]
MY_PASSWORD= { provider = "keychain", value = "MY_PASSWORD" }
~/work/fnox_test

この状態で Keychain accessを見てみると値が追加されています。
edit
editコマンドで値の更新ができます。
シークレットが展開された形でエディタが起動します。
~/work/fnox_test
% fnox edit
# FNOX EDIT - Decrypted Secrets
# This is a temporary file with decrypted secret values.
# Secrets marked as READ-ONLY cannot be modified (from 1Password, Bitwarden, etc.)
# After you save and close this file, fnox will re-encrypt changed secrets.
# DO NOT share this file as it contains plaintext secrets!
[providers.keychain]
type = "keychain"
service = "fnox"
prefix = "myapp/"
[secrets]
MY_PASSWORD= { provider = "keychain", value = "MyP@ssw0rd" }
get/run
fnoxのコマンドから値を取得したり、値を設定した状態でコマンド実行もできます。
~/work/fnox_test
% fnox get MY_PASSWORD
MyP@ssw0rd
~/work/fnox_test
% cat script.sh
#!/usr/bin/env bash
echo $MY_PASSWORD
~/work/fnox_test
% fnox exec -- bash script.sh
MyP@ssw0rd
~/work/fnox_test
%
shell integration
シェルと連携することによって、自動で環境変数に設定してくれます。
# Enable for your shell
eval "$(fnox activate bash)" # or zsh, fish
# Add to your shell profile for persistence
echo 'eval "$(fnox activate bash)"' >> ~/.bashrc
~/work/fnox_test
% echo $MY_PASSWORD
~/work/fnox_test
% eval "$(fnox activate zsh)"
fnox: +1 MY_PASSWORD
~/work/fnox_test
% echo $MY_PASSWORD
MyP@ssw0rd
~/work/fnox_test
% cd ..
fnox: -1 MY_PASSWORD
~/work
% echo $MY_PASSWORD
fnox: +1 MY_PASSWORD などの表示は FNOX_SHELL_OUTPUT=none を設定すると表示を抑制できます。
zshrc等に合わせて記載しておくと良さそうです。
~/work/fnox_test
% tail -n 2 ~/.zshrc
eval "$(fnox activate zsh)"
export FNOX_SHELL_OUTPUT=none
~/work/fnox_test
%
globalでの設定
miseの場合は ~/.config/mise/config.toml に設定するとホームディレクトリ以下全体で有効になっていました。
fnoxの場合は現時点だと~/fnox.toml を配置することで全体に適用できそうです。
まとめ
これまで bashrc (zshrc) に平文で書かざるを得なかった秘匿情報を、fnoxを使うことでよりセキュアに管理できそうです。
昨今のサプライチェーン攻撃対策としても有効だと思います。
またAWSなどのproviderを使うことでチームでの開発でも活用できそうなので、色々試してみたいです。
Discussion