devAlice
← Mac

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

  1. アカウントごとに個別の SSH キー(ed25519)を作成し、ファイル名を区別する
  2. ~/.ssh/config に、ホストごとの IdentityFileHost エイリアスを明示的に設定
  3. クローン URL にエイリアスを使う: git@github.com:... の代わりに git@github-work:user/repo.git
  4. .gitconfigincludeIf で作業ディレクトリに応じて user.email を自動切り替え
  5. gh CLI 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 yesUseKeychain 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.git

git 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-username

gh コマンドはアクティブなアカウントを使う。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/configHost github-work / IdentityFile のブロック順またはタイポ
ssh-add -L                          # エージェントにあるキーを確認
ssh-add -D                          # すべてクリア
ssh-add --apple-use-keychain ~/.ssh/id_ed25519_work
ssh -T git@github-work

git push が個人アカウントに飛ぶ

URL が git@github.com:org/repo.git で、エージェントの個人キーが優先されている。URL を変更する。

git remote set-url origin git@github-work:org/repo.git

includeIf が発動しない

  • パスの末尾スラッシュが欠けている(~/work ❌、~/work/ ✅)
  • フォルダがシンボリックリンク — OS 依存。実際のパスを使う。

gh auth switch が使えない

gh が 2.40 より古い。アップグレード:

brew upgrade gh
gh --version

次のステップ

参考リンク

更新履歴

  • 2026-05-12 — 初稿(devAlice M3 シード展開)