Mac で複数の GitHub アカウントを SSH で管理 — 仕事用+個人用キーを分ける
~/.ssh/config を使って複数のホスト・アカウント(仕事用 GitHub、個人 GitHub、外部クライアント)をクリーンに分離するシンプルな方法。
同じマシンで仕事用と個人の GitHub アカウントを使うと、初日からトラブルが起きる — git push が間違ったアカウントに飛ぶ、クローンしたばかりのリポジトリがアクセス拒否になる、gh CLI が常に同じアカウントでサインインされてしまう。このガイドは macOS 14 以降 / OpenSSH 9.x で ~/.ssh/config を使ってアカウント・ホストを分離するシンプルな方法を説明する。SSH 設定の本質はセキュリティではなく明示性にあると考える — ホストエイリアスによって「どのキーでどのアカウントに接続するか」が一目瞭然になり、以前のような誤送信が起きなくなるからだ。
Mac 初期セットアップ で ed25519 キーを 1 つ作成した前提。外部クライアントの GitLab/Bitbucket にも応用できる。
TL;DR
- アカウントごとに個別の SSH キー(ed25519)を作成し、ファイル名を区別する
~/.ssh/configに、ホストごとのIdentityFile+Hostエイリアスを明示的に設定- クローン URL にエイリアスを使う:
git@github.com:...の代わりにgit@github-work:user/repo.git .gitconfigのincludeIfで作業ディレクトリに応じてuser.emailを自動切り替えghCLI 1.x 以降は複数アカウントに同時サインインできる
前提条件
- macOS 14 以降、OpenSSH 9.x(
ssh -Vで確認) - アカウントごとの GitHub/GitLab アカウント
- Mac 初期セットアップ 相当の既存の単一キーセットアップ
1. アカウント別 SSH キーの作成 — 5 分
ファイル名でアカウントを識別できるよう、意図的に異なる名前を使う。
# 仕事用アカウント
ssh-keygen -t ed25519 -C "work@example.com" -f ~/.ssh/id_ed25519_work
# 個人アカウント
ssh-keygen -t ed25519 -C "personal@example.com" -f ~/.ssh/id_ed25519_personal
# 外部クライアント(任意)
ssh-keygen -t ed25519 -C "client-foo@example.com" -f ~/.ssh/id_ed25519_client各 GitHub/GitLab アカウントに公開鍵(.pub)のみを登録する:
pbcopy < ~/.ssh/id_ed25519_work.pub # 仕事用 GitHub
pbcopy < ~/.ssh/id_ed25519_personal.pub # 個人 GitHubブラウザで https://github.com/settings/ssh/new にアクセスし、各アカウントでサインインして貼り付け、保存する。
GitHub は同じキーを複数アカウントで共用することを拒否する(「Key is already in use」)。アカウントごとに異なるキーを作成することは必須だ。
2. ~/.ssh/config を書く — 10 分
ホストエイリアスで分割する。macOS Keychain+Touch ID 拡張と統合する。
# ~/.ssh/config
# 仕事用 GitHub
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_work
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes
# 個人 GitHub
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_personal
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes
# クライアント GitLab
Host gitlab-client
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_ed25519_client
IdentitiesOnly yes
AddKeysToAgent yes
UseKeychain yes重要なオプション:
IdentitiesOnly yes— エージェントが他のキーを持っていても、明示したキーのみを使う。これがないと、別のキーが先に試されて GitHub が 403 を返す。AddKeysToAgent yes+UseKeychain yes— macOS Keychain と統合。パスフレーズを一度入力すれば以降は不要。
SSH エージェントにキーを追加
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_personal
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_client確認
ssh -T git@github-work
# Hi work-username! You've successfully authenticated...
ssh -T git@github-personal
# Hi personal-username! You've successfully authenticated...間違ったアカウントが表示された場合は §3 またはトラブルシューティングを参照。
3. クローン URL にエイリアスを使う — 日常パターン
仕事用リポジトリ:
# 通常の GitHub URL — IdentitiesOnly があれば正しいキーを選ぶが、明示的なエイリアスの方がクリーン
git clone git@github.com:org/repo.git # IdentitiesOnly+最初のマッチ — 曖昧
# エイリアスを使う — 明示的
git clone git@github-work:org/repo.git個人リポジトリ:
git clone git@github-personal:me/myrepo.gitすでにクローン済みのリポジトリ: リモートを変更する。
cd ~/work/repo
git remote set-url origin git@github-work:org/repo.git
cd ~/personal/myrepo
git remote set-url origin git@github-personal:me/myrepo.gitgit remote -v で確認。
4. user.email を自動切り替え — includeIf — 5 分
フォルダの場所に応じて git config user.email を自動切り替えする。仕事フォルダのコミットには仕事用メール、個人フォルダには個人用メールを強制する。
メインの ~/.gitconfig
[user]
name = Your Name
# デフォルトメールは空にするか最も多く使うものを設定
[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/personal/"]
path = ~/.gitconfig-personal⚠️
gitdir:の後のパスはスラッシュで終わる必要がある。~/workは間違い、~/work/が正しい。
~/.gitconfig-work
[user]
email = you@company.com
name = Your Name (Company)
[commit]
gpgsign = true # 仕事のポリシーで署名済みコミットが必要な場合
[gpg]
format = ssh
[gpg "ssh"]
defaultKeyCommand = ssh-add -L
program = ssh-keygen~/.gitconfig-personal
[user]
email = you@personal.com
name = Your Name確認
cd ~/work/some-repo
git config user.email
# you@company.com
cd ~/personal/some-repo
git config user.email
# you@personal.com自動ルーティングが機能している。これにより構造的に間違ったメールでのコミットを防げる。
5. gh CLI マルチアカウント — 同時認証
gh 2.40 以降はマルチアカウントをサポートする。同じマシンから仕事用と個人の GitHub.com に同時サインインできる。
認証を追加
# 最初のアカウント(すでにサインイン済みならスキップ)
gh auth login
# 2 つ目のアカウント
gh auth login # 別の GitHub.com アカウントでサインインアクティブなアカウントを切り替え
gh auth status
# サインイン済みのすべてのアカウントとアクティブなものを一覧表示
gh auth switch
# インタラクティブ — 別のアカウントを選ぶ
gh auth switch -u personal-usernameリポジトリごとのアクティブアカウント(任意)
# 仕事用リポジトリで仕事用アカウントをアクティブ化
cd ~/work/repo
gh auth switch -u work-usernamegh コマンドはアクティブなアカウントを使う。SSH は §2 の設定で分岐しているため、競合しない。
6. よくある詰まりポイント
6.1 Personal Access Token(PAT)の競合
gh auth login で HTTPS を選んだ場合、PAT が OS キーチェーンに保存される。他のアカウントで間違った PAT が使われる場合:
gh auth status # どの PAT がどこに保存されているか確認
security find-internet-password -s github.com -a "your-username"
security delete-internet-password -s github.com -a "wrong-username"
gh auth login # 再認証6.2 両方のアカウントが同じ組織にアクセスする
個人アカウントが仕事用 GitHub 組織のコラボレーターでもある場合、クローン URL が曖昧になる:
# 明示的なエイリアスを使う
git clone git@github-work:org/shared-repo.git work-side
git clone git@github-personal:org/shared-repo.git personal-side別々のディレクトリに置くことで user.email+キーの選択が分かれる。
6.3 macOS キーチェーンがパスフレーズを忘れる
一部の macOS 15 以降のセットアップでは UseKeychain yes が無視される。回避策:
# ssh-agent を明示的に起動してキーを追加
eval "$(ssh-agent -s)"
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work必要であれば、自動登録スニペットを .zshrc に追加できる。
7. セキュリティチェックリスト
- 秘密鍵は絶対に共有しない —
.pubのみ登録 - パスフレーズを使う — キーファイルを暗号化。macOS Keychain が一度の入力後にキャッシュ
- 仕事用と個人用のキーを分ける — 一方が漏洩しても被害を最小化
-
~/.ssh/configのパーミッション —chmod 600 ~/.ssh/config -
~/.sshディレクトリのパーミッション —chmod 700 ~/.ssh - ハードウェアキー(任意) — YubiKey+FIDO2 via
ssh-keygen -t ed25519-sk(別ガイド)
8. トラブルシューティング
明示的なキーを指定しているのに Permission denied (publickey)
IdentitiesOnly yes が欠けている — エージェントの他のキーが最初に試されて拒否される。config に追加する。
ssh -vT git@github-work 2>&1 | grep -E "(Offering|identity file)"複数のキーが試されているなら IdentitiesOnly yes が欠けている。
間違ったアカウントとして認識される
ssh -T git@github-work が個人アカウントを返す。原因:
- ssh-agent で間違ったキーが優先されている
~/.ssh/configのHost github-work/IdentityFileのブロック順またはタイポ
ssh-add -L # エージェントにあるキーを確認
ssh-add -D # すべてクリア
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
ssh -T git@github-workgit push が個人アカウントに飛ぶ
URL が git@github.com:org/repo.git で、エージェントの個人キーが優先されている。URL を変更する。
git remote set-url origin git@github-work:org/repo.gitincludeIf が発動しない
- パスの末尾スラッシュが欠けている(
~/work❌、~/work/✅) - フォルダがシンボリックリンク — OS 依存。実際のパスを使う。
gh auth switch が使えない
gh が 2.40 より古い。アップグレード:
brew upgrade gh
gh --version次のステップ
- Mac 初期セットアップ — 最初の SSH キー生成
- Mac dotfiles —
.ssh/configと.gitconfigを dotfiles として管理 - Brewfile 管理 — 残りの開発環境を固定する
参考リンク
更新履歴
- 2026-05-12 — 初稿(devAlice M3 シード展開)