tags : mac
macOS Keychain を使って環境変数(APIキーなど)を安全に管理する方法
概要
- macOS の Keychain に各種シークレット(APIキー、トークンなど)を保存し、 ターミナル起動時に `.zshrc` などで読み込んで環境変数として利用する方法。
- `.zshrc` や `.zprofile` を Git 管理していても、安全に秘密情報を扱える。
利点
- 秘密情報をファイルに書かずに済む(平文で残らない)
- macOS 標準機能のみで完結(追加ツール不要)
- ターミナル上での利用に適している(GUIアプリ連携も一応可能)
1. 環境変数を Keychain に登録する(初回のみ)
次のコマンドを使用して任意のシークレットを Keychain に保存する:
security add-generic-password -a "$USER" \
-s YOUR_SECRET_NAME \
-w 'your-secret-value' \
-U- `-s`: 保存時の「サービス名」(例: `github_token`, `aws_secret`, `openai_api_key` など)
- `-a`: アカウント名。`$USER` で自動取得するのが一般的。
- `-w`: 登録する値(シークレット本体)
- `-U`: 既存の同名エントリがあれば更新
2. .zshrc などに環境変数として読み込む設定を追加
Keychain から動的に読み込み、環境変数に設定する。例:
# ~/.zshrc
export OPENAI_API_KEY="$(security find-generic-password -a "$USER" -s openai_api_key -w 2>/dev/null)"
export GITHUB_TOKEN="$(security find-generic-password -a "$USER" -s github_token -w 2>/dev/null)"- `-s` に渡す値は、1で登録したサービス名と一致させる
- `2>/dev/null` は読み込み失敗時のエラー非表示用
3. 動作確認
source ~/.zshrc
echo $OPENAI_API_KEY
echo $GITHUB_TOKEN- 正しく読み込めていれば、各種キーが表示される(※セキュリティ上、表示には注意)
4. 認証プロンプト(パスワードやTouch ID)を抑制する(任意)
初回アクセス時や毎回確認が出る場合は、Keychain 側で明示的に許可する:
- 「Keychainアクセス.app」を開く
- 「ログイン」キーチェーン > 「パスワード」カテゴリ > 該当項目をダブルクリック
- 「アクセス制御」タブを開く
- 「この項目にアクセスを許可するアプリケーションのリスト」に `/usr/bin/security` を追加
- 「変更内容を保存」
5. 注意点と補足
- 読み込みに失敗した場合は変数が空になるため、事前チェックを入れておくと安全:
if [[ -z "$OPENAI_API_KEY" ]]; then
echo "Warning: OPENAI_API_KEY is not set" >&2
fi- `.zshrc` ではなく `.zprofile` に書くことで、ログイン時に1回だけ読み込むことも可能
- GUI アプリでも使いたい場合は `launchctl setenv` を併用する必要がある(別途解説)
6. よく使うシークレットの例(サービス名の命名例)
| 用途 | サービス名(例) | 環境変数名 |
|---|---|---|
| OpenAI | openai_api_key | OPENAI_API_KEY |
| GitHub Token | github_token | GITHUB_TOKEN |
| AWS Secret | aws_secret_access_key | AWS_SECRET_ACCESS_KEY |
| Supabase Key | supabase_anon_key | SUPABASE_ANON_KEY |
| Custom Service | myapp_api_token | MYAPP_API_TOKEN |