🔏

fnox を使って zshrc/bashrc から平文のシークレットをなくす

に公開

fnoxとは

https://fnox.jdx.dev

シークレット管理用のCLIツールです。
ローカルでの暗号化や、AWS Secrets Manager, 1Password, OS keychainなどと連携できます。

mise作者の方の新作です。

https://github.com/jdx/fnox

インストール

miseでのインストールが推奨されています。

mise use -g fnox

その他のインストール方法については以下にまとまっています。

https://fnox.jdx.dev/guide/installation.html

使ってみる

https://fnox.jdx.dev/guide/quick-start.html

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 に設定するとホームディレクトリ以下全体で有効になっていました。

https://mise.jdx.dev/configuration.html#global-config-config-mise-config-toml

fnoxの場合は現時点だと~/fnox.toml を配置することで全体に適用できそうです。

まとめ

これまで bashrc (zshrc) に平文で書かざるを得なかった秘匿情報を、fnoxを使うことでよりセキュアに管理できそうです。
昨今のサプライチェーン攻撃対策としても有効だと思います。
またAWSなどのproviderを使うことでチームでの開発でも活用できそうなので、色々試してみたいです。

Discussion