
envsec v1.0.0-rc.2
ネイティブOSの資格情報ストア(macOSキーチェーン、Linux Secret Service、Windows Credential Manager)を使用して環境シークレットを管理するためのセキュアなCLIツール
envsec
ネイティブOSの資格情報ストアを使用した安全な環境シークレット管理。
デモ

機能
- シークレットをOSネイティブの資格情報ストアに保存(プレーンテキストファイルではない)
- クロスプラットフォーム:macOS、Linux、Windows
- コンテキストごとにシークレットを整理(例:
myapp.dev、stripe-api.prod、work.staging) - SQLiteによるシークレットメタデータ(キー名、タイムスタンプ)の追跡
- globパターンによるコンテキストとシークレットの検索
- シークレット補間を使用したコマンド実行
cmdによるコマンドの保存と再実行(検索、一覧表示、実行、削除)- シークレットの
.envファイルへのエクスポート(auditによる生成追跡付き) - シークレットのシェル環境変数としてのエクスポート(
eval $(envsec env)) .envファイルからのシークレット読み込み(競合検出付き)- チームメンバー向けにGPGで暗号化したシークレットの共有
- コマンドを覚えることなくシークレットを管理できるインタラクティブターミナルUI(
envsec tui)
パッケージ
これは以下のパッケージを含むモノレポです:
| パッケージ | 説明 | npm |
|---|---|---|
envsec | シークレット管理用CLIツール | |
@envsec/sdk | シークレットをプログラムで読み込むためのNode.js / Bun SDK | |
@envsec/core | コアエンジン — OS資格情報ストアアダプター + メタデータDB | |
@envsec/tui | シークレット管理用インタラクティブターミナルUI |
SDKクイックスタート
Node.jsまたはBunからプログラムでシークレットにアクセスするには、@envsec/sdkを使用します:
npm install @envsec/sdk
import { loadSecrets } from "@envsec/sdk";
// Load and inject into process.env
await loadSecrets({ context: "myapp.dev", inject: true });
// Or use the client for full control
import { EnvsecClient } from "@envsec/sdk";
const client = await EnvsecClient.create({ context: "myapp.dev" });
const apiKey = await client.get("api.key");
await client.close();
すべてのAPI、マルチコンテキストサポート、およびオプションについては、完全なSDKドキュメントを参照してください。
要件
- Node.js >= 22
macOS
追加の依存関係はありません。security CLIツールを介して組み込みのKeychainを使用します。
Linux
libsecret-tools(secret-toolコマンドを提供)が必要です。これはD-Busを介してGNOME Keyring、KDE Wallet、または任意のSecret Service APIプロバイダーと通信します。
# Debian / Ubuntu
sudo apt install libsecret-tools
# Fedora
sudo dnf install libsecret
# Arch
sudo pacman -S libsecret
実行中の D-Bus セッションとキーリングデーモン(例: gnome-keyring-daemon)がアクティブである必要があります。ほとんどのデスクトップ環境では自動的に処理されます。
Windows
追加の依存関係はありません。cmdkey と PowerShell を介して、組み込みの Windows 資格情報マネージャーを使用します。
インストール
Homebrew (macOS / Linux)
brew tap davidnussio/homebrew-tap
brew install envsec
npm
npm install -g envsec
npx(インストール不要)
npx envsec
mise
mise use -g npm:envsec
使用方法
ほとんどのコマンドでは、--context(または -c)で指定するコンテキストが必要です。コンテキストはシークレットをグループ化するための自由形式のラベルです — 例えば myapp.dev、stripe-api.prod、work.staging などです。
グローバルオプション
これらのオプションはすべてのコマンドで使用できます:
--context,-c— コンテキスト名(例:myapp.dev、stripe-api.prod)。ENVSEC_CONTEXT環境変数も読み取ります--debug,-d— デバッグログを有効にします--json— スクリプト用に JSON 形式で出力します--db— SQLite データベースファイルへのパス(デフォルト:~/.envsec/store.sqlite)。ENVSEC_DB環境変数も読み取ります
カスタムデータベースパス
デフォルトでは、メタデータは ~/.envsec/store.sqlite に保存されます。これは --db または ENVSEC_DB 環境変数で上書きできます:
# Use a project-local database
envsec --db ./local-store.sqlite -c myapp.dev list
# Or via environment variable
export ENVSEC_DB=/shared/team/envsec.sqlite
envsec -c myapp.dev list
--db フラグは ENVSEC_DB より優先されます。ユースケースには、プロジェクトごとのデータベース、ネットワークドライブ上のチーム共有データベース、エフェメラルストレージを使用する CI/CD などがあります。
シークレットの追加
OS の資格情報ストアにシークレットを保存します。
<key>— シークレットキー名(例:api.key、db.password)--value、-v— 保存する値(省略すると対話式のマスク入力プロンプトが表示されます)--expires、-e— 有効期限(例:30m、2h、7d、4w、3mo、1y)
# Store a value inline
envsec -c myapp.dev add api.key --value "sk-abc123"
# Or use the short alias
envsec -c myapp.dev add api.key -v "sk-abc123"
# Omit --value for an interactive masked prompt
envsec -c myapp.dev add api.key
# Set an expiry duration with --expires (-e)
envsec -c myapp.dev add api.key -v "sk-abc123" --expires 30d
# Supported duration units: m (minutes), h (hours), d (days), w (weeks), mo (months), y (years)
# Combinable: 1y6mo, 2w3d, 1d12h
envsec -c myapp.dev add api.key -v "sk-abc123" -e 6mo
シークレットの取得
OS の資格情報ストアからシークレット値を取得します。
<key>— 取得するシークレットキー名--quiet,-q— 生の値のみを出力(警告や余分な出力なし)--json— JSON 形式で出力(context、key、value、expires_at を含む)
envsec -c myapp.dev get api.key
# Print only the raw value (no warnings or extra output)
envsec -c myapp.dev get api.key --quiet
envsec -c myapp.dev get api.key -q
シークレットの削除
OS の資格情報ストアからシークレットを削除します。
<key>— 削除するシークレットキー名(--allを使用する場合は省略可能)--yes,-y— 確認プロンプトをスキップ--all— コンテキスト内のすべてのシークレットを削除
envsec -c myapp.dev delete api.key
# or use the alias
envsec -c myapp.dev del api.key
シークレットの名前変更
同じコンテキスト内でシークレットキーの名前を変更します。値と有効期限のメタデータは保持されます。
<old-key>— 現在のシークレットキー名<new-key>— 新しいシークレットキー名--force,-f— ターゲットが既に存在する場合は上書きする
# Rename a key
envsec -c myapp.dev rename old.key new.key
# Overwrite target if it already exists
envsec -c myapp.dev rename old.key existing.key --force
コンテキスト内のすべてのシークレットを一覧表示
コンテキスト内のすべてのシークレットキーとメタデータを一覧表示します。
--json— JSON形式で出力
envsec -c myapp.dev list
すべてのコンテキストを一覧表示
シークレット数とともに利用可能なすべてのコンテキストを一覧表示します。
--json— JSON形式で出力
# Without --context, lists all available contexts with secret counts
envsec list
シークレットの検索
glob パターンを使用してシークレットまたはコンテキストを検索します。
<pattern>— 検索する glob パターン(例:api.*、myapp.*)--json— JSON 形式で出力
# Search secrets within a context
envsec -c myapp.dev search "api.*"
# Search contexts by pattern (without --context)
envsec search "myapp.*"
コンテキスト間でシークレットを移動
シークレットをあるコンテキストから別のコンテキストへ移動します。移動後、移動元のシークレットは削除されます。
<pattern>— 移動するシークレットの glob パターンまたは完全一致キー(--all使用時は省略可能)--to,-t— シークレットの移動先コンテキスト--all— 移動元コンテキストからすべてのシークレットを移動--force,-f— 移動先コンテキストの既存シークレットを上書き--yes,-y— 確認プロンプトをスキップ
# Move a single secret
envsec -c myapp.dev move api.token --to myapp.prod
# Move secrets matching a glob pattern
envsec -c myapp.dev move "redis.*" --to myapp.prod -y
# Move all secrets from one context to another
envsec -c myapp.dev move --all --to myapp.prod -y
# Overwrite existing secrets in the target context
envsec -c myapp.dev move "redis.*" --to myapp.prod --force -y
コンテキスト間でシークレットをコピー
あるコンテキストから別のコンテキストへシークレットをコピーします。コピー元のシークレットはそのまま残ります。
<pattern>— コピーする Glob パターンまたは完全一致のキー(--allを使用する場合は省略可能)--to,-t— シークレットのコピー先コンテキスト--all— コピー元コンテキストからすべてのシークレットをコピー--force,-f— コピー先コンテキストの既存シークレットを上書き--yes,-y— 確認プロンプトをスキップ
# Copy a single secret
envsec -c myapp.dev copy api.token --to myapp.staging
# Copy secrets matching a glob pattern
envsec -c myapp.dev copy "redis.*" --to myapp.staging -y
# Copy all secrets from one context to another
envsec -c myapp.dev copy --all --to myapp.staging -y
# Overwrite existing secrets in the target context
envsec -c myapp.dev copy "redis.*" --to myapp.staging --force -y
シークレットを使用してコマンドを実行する
プレースホルダーを介してシークレット値を補間するか、環境変数として注入してコマンドを実行します。
<command>— 実行するコマンド。シークレットの補間には{key}プレースホルダーを使用します--inject,-i— すべてのコンテキストシークレットを環境変数として注入します(KEY.NAME→KEY_NAME)--save,-s— このコマンドを後で使用するために保存します--name,-n— 保存されたコマンドの名前(--saveと共に省略した場合は対話的に入力が求められます)