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 側で明示的に許可する:

  1. 「Keychainアクセス.app」を開く
  2. 「ログイン」キーチェーン > 「パスワード」カテゴリ > 該当項目をダブルクリック
  3. 「アクセス制御」タブを開く
  4. 「この項目にアクセスを許可するアプリケーションのリスト」に `/usr/bin/security` を追加
  5. 「変更内容を保存」

5. 注意点と補足

  • 読み込みに失敗した場合は変数が空になるため、事前チェックを入れておくと安全:
if [[ -z "$OPENAI_API_KEY" ]]; then
  echo "Warning: OPENAI_API_KEY is not set" >&2
fi
  • `.zshrc` ではなく `.zprofile` に書くことで、ログイン時に1回だけ読み込むことも可能
  • GUI アプリでも使いたい場合は `launchctl setenv` を併用する必要がある(別途解説)

6. よく使うシークレットの例(サービス名の命名例)

用途サービス名(例)環境変数名
OpenAIopenai_api_keyOPENAI_API_KEY
GitHub Tokengithub_tokenGITHUB_TOKEN
AWS Secretaws_secret_access_keyAWS_SECRET_ACCESS_KEY
Supabase Keysupabase_anon_keySUPABASE_ANON_KEY
Custom Servicemyapp_api_tokenMYAPP_API_TOKEN