macOS Keychain で .env のシークレットを守る — 1Password 不要、無料で実現する AI エージェント時代の秘密管理
前回の記事で、@suin 氏の opx を紹介しました。1Password CLI をラップし、.env に op:// 参照だけを書くことで AI エージェントからシークレットを守るツールです。
しかし、opx には 1Password の契約(月額 $2.99〜)が前提という制約があります。実は macOS には Keychain という強力な秘密管理基盤が標準搭載されており、追加コストなしで同等の「プロセススコープ認証」を実現できます。本記事では、macOS 組み込み機能だけで .env の秘密を守る方法を、ツール選定から実践設定まで解説します。
なぜ macOS Keychain なのか
1Password との比較
| 項目 | 1Password + opx | macOS Keychain |
|---|---|---|
| コスト | 月額 $2.99〜 | 無料(OS 標準) |
| インストール | 1Password アプリ + CLI + opx | 不要(security コマンドが標準搭載) |
| チーム共有 | Vault 共有で容易 | 端末ローカル(共有には別の仕組みが必要) |
| クラウド同期 | 1Password クラウド | iCloud Keychain で Apple デバイス間は同期可能 |
| Touch ID | op run 時に認証 | Keychain アクセス時に認証(設定が必要) |
| Linux 対応 | 1Password CLI あり | gnome-keyring / KeePassXC で代替 |
| 暗号化 | 1Password 独自(AES-256-GCM) | macOS Keychain(AES-256) |
個人開発やスモールチームなら、macOS Keychain で十分です。チーム全体でシークレットを共有したい場合は 1Password の Vault 共有が優位ですが、「AI エージェントに .env を読まれても安全にする」という目的だけなら無料で実現できます。
macOS Keychain の基本
macOS Keychain は OS レベルの暗号化ストレージです。
macOS Keychain アーキテクチャ:
ユーザーログイン
└── ログイン Keychain(自動アンロック)
├── Wi-Fi パスワード
├── Safari パスワード
├── アプリケーション証明書
└── ★ 開発用シークレット ← ここに保存
CLI からは security コマンドでアクセスします。
# シークレットの保存
security add-generic-password -a "$USER" -s "myapp/API_KEY" -w "sk-xxxxx" -U
# シークレットの取得
security find-generic-password -a "$USER" -s "myapp/API_KEY" -w
-a はアカウント名、-s はサービス名(ラベル)、-w はパスワードの値です。-U は既存エントリの上書きを許可します。
方法1: envchain — opx に最も近い体験
envchain は macOS Keychain をバックエンドに使う環境変数注入ツールです。opx と同じ「プロセススコープ認証」のパターンを、1Password なしで実現します。
インストールと基本操作
# Homebrew でインストール
brew install envchain
# 名前空間 "myapp" にシークレットを保存(対話的に値を入力)
envchain --set myapp AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY STRIPE_SECRET_KEY
# シークレットを注入してコマンドを実行
envchain myapp npm run dev
# 複数の名前空間を同時に指定
envchain aws,stripe npm run dev
opx との比較
# opx(1Password)
opx npm run dev
# envchain(macOS Keychain)
envchain myapp npm run dev
ほぼ同じ操作感です。違いは以下の通りです。
| 項目 | opx | envchain |
|---|---|---|
| バックエンド | 1Password Vault | macOS Keychain |
| .env ファイル | op:// 参照を書いたファイルが必要 | 不要(Keychain に直接保存) |
| .env の Git コミット | 可能(参照のみなので安全) | 不要(.env 自体が存在しない) |
| 名前空間 | 1Password の Vault / Item 構造 | envchain-{namespace} でグループ化 |
| 自動 .env 検索 | プロジェクトルートから自動検索 | 名前空間を明示的に指定 |
Keychain Access での確認
envchain で保存したシークレットは、macOS の「キーチェーンアクセス」アプリで確認できます。envchain-myapp というラベルで保存されます。
キーチェーンアクセス:
ログイン Keychain
├── envchain-myapp (AWS_ACCESS_KEY_ID)
├── envchain-myapp (AWS_SECRET_ACCESS_KEY)
└── envchain-myapp (STRIPE_SECRET_KEY)
セキュリティモデル
envchain のプロセススコープ認証:
macOS Keychain(暗号化ストレージ)
│
├── Keychain アクセス認証(パスワード or Touch ID)
│
└── envchain myapp npm run dev
│
├── Keychain からシークレットを復号
├── 子プロセスの環境変数として注入
└── プロセス終了で自動消去
│
└── npm run dev(このプロセス内でのみ有効)
1Password の op run と同じ構造です。シークレットはシェル環境に残らず、指定した子プロセスだけが持ちます。
方法2: ks — シンプルな Keychain シークレットマネージャー
ks は macOS Keychain のラッパーで、シークレットの保存・取得に特化しています。envchain のように自動で環境変数に注入する機能はありませんが、シンプルさが特徴です。
インストールと基本操作
# Homebrew でインストール
brew tap loteoo/formulas
brew install ks
# シークレットを保存
ks add myapp/API_KEY 'sk-xxxxx'
# ランダムなシークレットを生成して保存
ks rand | ks add myapp/DB_PASSWORD
# シークレットを取得
ks show myapp/API_KEY
# クリップボードにコピー
ks cp myapp/API_KEY
# 一覧表示
ks ls
環境変数への注入(スクリプトで実現)
ks 単体には envchain のような実行ラッパー機能がないため、スクリプトを組み合わせます。
#!/bin/bash
# with-secrets.sh
API_KEY=$(ks show myapp/API_KEY) \
DB_PASSWORD=$(ks show myapp/DB_PASSWORD) \
exec "$@"
# 使用方法
./with-secrets.sh npm run dev
プロジェクト別 Keychain
ks は -k フラグでプロジェクト別の Keychain を分離できます。
# プロジェクト A 用の Keychain を初期化
ks -k project-a init
ks -k project-a add API_KEY 'key-for-project-a'
# プロジェクト B 用
ks -k project-b init
ks -k project-b add API_KEY 'key-for-project-b'
方法3: EnvGuard — .env ワークフローをそのまま Keychain に移行
EnvGuard は .env ファイルの操作感をそのまま維持しながら、バックエンドを OS の Keychain に置き換えるツールです。
特徴的な機能
# 既存の .env ファイルを Keychain に一括移行
envg migrate
# .env と同じ感覚で編集(対話メニュー)
envg edit
# 直接設定・取得
envg set API_KEY sk-xxxxx
envg get API_KEY
# 環境の切り替え(dev / staging / prod)
envg switch staging
envg copy --from dev --to prod
# チーム向けテンプレート生成(値なし、キー名のみ)
envg template
.env からの移行が容易
既存の .env ファイルを持つプロジェクトなら、envg migrate で一括インポートできます。移行後は .env を削除し、.gitignore からも外せます。
ただし、現時点ではアルファ版です。本番利用には注意が必要です。
方法4: security コマンドで自作する
サードパーティツールを入れたくない場合、macOS 標準の security コマンドだけでラッパースクリプトを書けます。
セットアップスクリプト
#!/bin/bash
# setup-secrets.sh - Keychain にシークレットを保存
NAMESPACE="myapp"
echo "=== $NAMESPACE のシークレットを Keychain に保存 ==="
read -rp "AWS_ACCESS_KEY_ID: " val
security add-generic-password -a "$USER" -s "$NAMESPACE/AWS_ACCESS_KEY_ID" -w "$val" -U
read -rsp "AWS_SECRET_ACCESS_KEY: " val
echo
security add-generic-password -a "$USER" -s "$NAMESPACE/AWS_SECRET_ACCESS_KEY" -w "$val" -U
read -rsp "STRIPE_SECRET_KEY: " val
echo
security add-generic-password -a "$USER" -s "$NAMESPACE/STRIPE_SECRET_KEY" -w "$val" -U
echo "保存完了"
実行ラッパースクリプト
#!/bin/bash
# with-keychain.sh - Keychain からシークレットを注入して実行
NAMESPACE="${WITH_KEYCHAIN_NS:-myapp}"
ENV_FILE="${WITH_KEYCHAIN_ENV:-.env}"
# .env ファイルがあれば、keychain:// 参照を解決
if [[ -f "$ENV_FILE" ]]; then
while IFS='=' read -r key value; do
[[ "$key" =~ ^#.*$ || -z "$key" ]] && continue
key=$(echo "$key" | xargs) # trim
value=$(echo "$value" | xargs)
if [[ "$value" == keychain://* ]]; then
service="${value#keychain://}"
value=$(security find-generic-password -a "$USER" -s "$service" -w 2>/dev/null)
fi
export "$key=$value"
done < "$ENV_FILE"
fi
exec "$@"
.env ファイル(keychain:// 参照版)
# .env - Git にコミット可能(実際の値は含まない)
AWS_ACCESS_KEY_ID=keychain://myapp/AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY=keychain://myapp/AWS_SECRET_ACCESS_KEY
STRIPE_SECRET_KEY=keychain://myapp/STRIPE_SECRET_KEY
PORT=3000
# 実行
./with-keychain.sh npm run dev
この方式なら、opx の op:// 参照と同様に .env を Git にコミットでき、チームメンバーには「Keychain にこの名前でシークレットを登録して」と伝えるだけで済みます。
Touch ID との連携
macOS Keychain は Touch ID と統合できますが、CLI の security コマンドからの利用には制限があります。
| 方式 | Touch ID 対応 |
|---|---|
| Keychain Access アプリ | 対応 |
security コマンド | 非対応(パスワード認証 or 「常に許可」) |
1Password CLI (op run) | 対応 |
| keychain-fingerprint | 対応(サードパーティ) |
| keymaster | 対応(サードパーティ) |
security コマンドは標準では Touch ID に対応していません。Touch ID を強制したい場合は、keychain-fingerprint や keymaster などのサードパーティツールを組み合わせる必要があります。
ただし、ログイン Keychain はユーザーログイン時に自動アンロックされるため、通常の開発フローでは追加認証なしでアクセスできます。Touch ID を挟みたい場合は、専用の Keychain を作成してロック状態を維持する設計が必要です。
Apple パスワードアプリ(macOS Sequoia)との関係
macOS Sequoia(macOS 15)で導入された「パスワード」アプリは、主に Web サイトのログイン情報とパスキーの管理を目的としています。
| 項目 | パスワードアプリ | Keychain(security コマンド) |
|---|---|---|
| 用途 | Web ログイン、パスキー | 汎用シークレット(API キー等) |
| CLI アクセス | 公式 API なし | security コマンドで完全対応 |
| プログラマティックアクセス | ASAuthorizationPasswordProvider(アプリ向け) | find-generic-password で直接取得 |
| 環境変数注入 | 不可 | 可能 |
apw という非公式の CLI ツールが Apple パスワードへのアクセスを提供していますが、開発シークレットの管理には Keychain の security コマンドの方が適しています。パスワードアプリは「Web サイトのパスワード」、Keychain は「開発シークレット」と使い分けるのが現実的です。
Claude Code での実践設定
CLAUDE.md に使用方法を記載
## 開発サーバー起動
- `envchain myapp npm run dev` で起動
- シークレットは macOS Keychain に保存(envchain 経由)
- 新しいシークレットの追加: `envchain --set myapp NEW_SECRET_NAME`
settings.json で .env アクセスを制限
{
"permissions": {
"deny": [
"Read(.env*)",
"Edit(.env*)",
"Bash(security find-generic-password*)"
]
}
}
security コマンドへのアクセスも制限することで、AI エージェントが直接 Keychain を読む経路も塞ぎます。
ツール選定フローチャート
macOS で .env のシークレットを守りたい
│
├── チームでシークレットを共有したい?
│ ├── はい → 1Password + opx(Vault 共有)
│ └── いいえ ↓
│
├── サードパーティツールを入れてよい?
│ ├── はい → envchain(brew install で完了、最も手軽)
│ └── いいえ ↓
│
├── .env ファイルを Git にコミットしたい?
│ ├── はい → security コマンドで自作(keychain:// 参照パターン)
│ └── いいえ → envchain(.env ファイル自体が不要)
│
└── 既存の .env を一括移行したい?
└── EnvGuard(envg migrate)※ アルファ版
まとめ
- macOS Keychain で opx と同等のことが無料でできる:
securityコマンドは macOS 標準搭載。追加コストなしでプロセススコープ認証を実現 - envchain が最も手軽:
brew install envchainだけで、envchain myapp npm run devのワンライナーで使える。opx に最も近い体験 - ks はシンプルな Keychain ラッパー: 保存・取得・クリップボードコピーに特化。環境変数注入はスクリプトで補完
- security コマンドで自作も可能:
keychain://参照パターンで .env を Git コミット可能にする opx 相当のラッパーを作れる - Touch ID は制限あり:
securityコマンド経由では Touch ID 非対応。サードパーティツールで補完可能 - パスワードアプリは開発向けではない: macOS Sequoia の「パスワード」アプリは Web ログイン用。開発シークレットには Keychain の
securityコマンドを使う - チーム共有が唯一の弱点: macOS Keychain は端末ローカル。チーム共有が必要なら 1Password の Vault 共有が優位
参考
- envchain - GitHub (sorah)
- ks - Command-line secrets manager - GitHub (loteoo)
- EnvGuard - GitHub (amannirala13)
- apw - A CLI for Apple Passwords - GitHub (bendews)
- keychain-fingerprint - Touch ID for Keychain CLI - GitHub
- keymaster - TouchID access to Mac Keychain via CLI - GitHub
- OSX Keychain Environment Variables - Gist (bmhatfield)
- Stop Putting Secrets in .env Files - jonmagic.com
- Reducing Attack Surface for AI Agents: Process-Scoped Credentials - dreamiurg.net
- Storing Secrets Using the MacOS Keychain CLI - aria.ai
- security コマンドリファレンス - SS64
- opx × 1Password CLI ラッパーで AI エージェント時代の .env を安全にする(前回記事)