macOS Keychain で .env のシークレットを守る — 1Password 不要、無料で実現する AI エージェント時代の秘密管理

前回の記事で、@suin 氏の opx を紹介しました。1Password CLI をラップし、.envop:// 参照だけを書くことで AI エージェントからシークレットを守るツールです。

しかし、opx には 1Password の契約(月額 $2.99〜)が前提という制約があります。実は macOS には Keychain という強力な秘密管理基盤が標準搭載されており、追加コストなしで同等の「プロセススコープ認証」を実現できます。本記事では、macOS 組み込み機能だけで .env の秘密を守る方法を、ツール選定から実践設定まで解説します。

なぜ macOS Keychain なのか

1Password との比較

項目1Password + opxmacOS Keychain
コスト月額 $2.99〜無料(OS 標準)
インストール1Password アプリ + CLI + opx不要(security コマンドが標準搭載)
チーム共有Vault 共有で容易端末ローカル(共有には別の仕組みが必要)
クラウド同期1Password クラウドiCloud Keychain で Apple デバイス間は同期可能
Touch IDop 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 コマンドでアクセスします。

1
2
3
4
5
# シークレットの保存
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 なしで実現します。

インストールと基本操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 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 との比較

1
2
3
4
5
# opx(1Password)
opx npm run dev

# envchain(macOS Keychain)
envchain myapp npm run dev

ほぼ同じ操作感です。違いは以下の通りです。

項目opxenvchain
バックエンド1Password VaultmacOS 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 のように自動で環境変数に注入する機能はありませんが、シンプルさが特徴です。

インストールと基本操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 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 のような実行ラッパー機能がないため、スクリプトを組み合わせます。

1
2
3
4
5
#!/bin/bash
# with-secrets.sh
API_KEY=$(ks show myapp/API_KEY) \
DB_PASSWORD=$(ks show myapp/DB_PASSWORD) \
exec "$@"
1
2
# 使用方法
./with-secrets.sh npm run dev

プロジェクト別 Keychain

ks は -k フラグでプロジェクト別の Keychain を分離できます。

1
2
3
4
5
6
7
# プロジェクト 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 に置き換えるツールです。

特徴的な機能

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 既存の .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 コマンドだけでラッパースクリプトを書けます。

セットアップスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/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 "保存完了"

実行ラッパースクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/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:// 参照版)

1
2
3
4
5
# .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
1
2
# 実行
./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-fingerprintkeymaster などのサードパーティツールを組み合わせる必要があります。

ただし、ログイン 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 に使用方法を記載

1
2
3
4
## 開発サーバー起動
- `envchain myapp npm run dev` で起動
- シークレットは macOS Keychain に保存(envchain 経由)
- 新しいシークレットの追加: `envchain --set myapp NEW_SECRET_NAME`

settings.json で .env アクセスを制限

1
2
3
4
5
6
7
8
9
{
  "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 共有が優位

参考