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 コマンドでアクセスします。
| |
-a はアカウント名、-s はサービス名(ラベル)、-w はパスワードの値です。-U は既存エントリの上書きを許可します。
方法1: envchain — opx に最も近い体験
envchain は macOS Keychain をバックエンドに使う環境変数注入ツールです。opx と同じ「プロセススコープ認証」のパターンを、1Password なしで実現します。
インストールと基本操作
| |
opx との比較
| |
ほぼ同じ操作感です。違いは以下の通りです。
| 項目 | 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 のように自動で環境変数に注入する機能はありませんが、シンプルさが特徴です。
インストールと基本操作
| |
環境変数への注入(スクリプトで実現)
ks 単体には envchain のような実行ラッパー機能がないため、スクリプトを組み合わせます。
| |
| |
プロジェクト別 Keychain
ks は -k フラグでプロジェクト別の Keychain を分離できます。
| |
方法3: EnvGuard — .env ワークフローをそのまま Keychain に移行
EnvGuard は .env ファイルの操作感をそのまま維持しながら、バックエンドを OS の Keychain に置き換えるツールです。
特徴的な機能
| |
.env からの移行が容易
既存の .env ファイルを持つプロジェクトなら、envg migrate で一括インポートできます。移行後は .env を削除し、.gitignore からも外せます。
ただし、現時点ではアルファ版です。本番利用には注意が必要です。
方法4: security コマンドで自作する
サードパーティツールを入れたくない場合、macOS 標準の security コマンドだけでラッパースクリプトを書けます。
セットアップスクリプト
| |
実行ラッパースクリプト
| |
.env ファイル(keychain:// 参照版)
| |
| |
この方式なら、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 に使用方法を記載
| |
settings.json で .env アクセスを制限
| |
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 を安全にする(前回記事)