🛠️ 開発環境・ツール

SSH鍵管理(Ed25519)と~/.ssh/configの実践設計:複数GitHubアカウントや踏み台サーバーを安全・快適に扱う方法

#SSH#GitHub#セキュリティ#macOS#インフラ

エンジニアとして日々の開発やサーバー運用を行うなかで、「個人用の GitHub アカウントと業務用の GitHub アカウントで SSH 鍵をどう使い分けるか」「踏み台サーバー(Bastion)経由の本番環境へどう安全に接続するか」「新しい Mac に移行した際に毎回パスフレーズを聞かれるのをどう防ぐか」 といった SSH まわりの設定は、一度正しく設計しておくと何年にもわたって作業効率を助けてくれます。

本記事では、現在推奨される Ed25519 暗号アルゴリズムによる鍵生成 から、保守性の高い ~/.ssh/config の分割管理・実践テンプレート まで詳しく解説します。


1. なぜ今から作る SSH 鍵は「Ed25519」一択なのか?

かつて長年にわたり標準だった RSA(2048bit / 4096bit)に代わり、現在の OpenSSH や GitHub 公式ドキュメントでも第一推奨とされているのが Ed25519(エドワーズ曲線デジタル署名アルゴリズム) です。

比較項目RSA (2048bit)RSA (4096bit)Ed25519(推奨)
セキュリティ強度現代基準ではやや心許ない(非推奨化が進む)高い極めて高い(RSA 3000〜4000bit相当以上、サイドチャネル攻撃にも強い)
公開鍵の文字数約 390 文字約 740 文字わずか 68 文字(コンパクトでコピペミスが起きにくい)
署名・検証速度普通鍵生成・署名ともにやや遅い非常に高速
生成コマンドssh-keygen -t rsassh-keygen -t rsa -b 4096ssh-keygen -t ed25519

レガシーな古い機器(OpenSSH 6.5 未満の組み込み機器等)へ接続する特殊なケースを除き、GitHub・GitLab・クラウドサーバー(AWS / GCP / Cloudflare 等)で利用する鍵はすべて Ed25519 で作成するのがベストプラクティスです。


2. 用途別に名前を分けて Ed25519 鍵を生成する手順

デフォルトのまま ssh-keygen を実行すると ~/.ssh/id_ed25519 という単一のファイル名になりますが、後から「どのサービス用の鍵かわからなくなる」のを防ぐため、最初から -f オプションで用途別のファイル名を付け、-C オプションで識別しやすいコメントを入れておきます。

# 1. ~/.ssh ディレクトリの作成とパーミッション設定(必須:700)
mkdir -p ~/.ssh && chmod 700 ~/.ssh

# 2. 個人GitHub用の鍵を生成
ssh-keygen -t ed25519 -C "amori-personal-github-2026" -f ~/.ssh/id_ed25519_github_personal

# 3. 業務(Work)GitHub用の鍵を生成
ssh-keygen -t ed25519 -C "amori-work-github-2026" -f ~/.ssh/id_ed25519_github_work

生成時には必ず パスフレーズ(Passphrase) を設定してください。万が一秘密鍵ファイルが漏洩した場合でも、鍵交換関数(bcrypt KDF)によって保護されるため安全性が飛躍的に高まります。また、後述する macOS キーチェーン連携を設定すれば、日常の操作で毎回パスフレーズを手入力する必要はありません。


3. macOS キーチェーンと IdentitiesOnly yes の基本設定

macOS 環境において、OS 再起動後に毎回パスフレーズを入力する手間を省きつつ、「登録した鍵が多すぎて SSH 接続時に試行回数上限(Too many authentication failures)で弾かれる問題」を防ぐ基本設定を ~/.ssh/config の先頭に記述します。

# ~/.ssh/config

# 個別設定ファイルを読み込む(仕事用・検証環境用などを別ファイルに分離可能)
Include ~/.ssh/conf.d/*.conf

# 全ホスト共通のデフォルト設定(末尾または共通ブロックとして定義)
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentitiesOnly yes
  ServerAliveInterval 60
  ServerAliveCountMax 3

各オプションの重要な役割

  • AddKeysToAgent yes / UseKeychain yes:初回接続時に一度パスフレーズを入力すると、macOS のキーチェーンに安全に保存され、次回以降は ssh-agent が自動で鍵を読み込みます。
  • IdentitiesOnly yes:これが極めて重要です。デフォルトの SSH クライアントは、ssh-agent に読み込まれているすべての鍵を順番にサーバーへ提示しようとします。鍵を5〜6個以上持っていると、本来の鍵に到達する前にサーバー側の MaxAuthTries(通常6回)制限に達して切断されてしまいます。IdentitiesOnly yes を指定すると、「その Host ブロックの IdentityFile で明示した鍵だけを使う」 挙動に限定できます。
  • ServerAliveInterval 60:60秒ごとに無通信キープアライブパケットを送信し、Wi-Fi ルーターや NAT によるアイドル切断を防ぎます。

4. 複数 GitHub アカウント(個人用・業務用)を切り替える設定

1台の Mac で個人用(github.com)と業務用アカウントを使い分ける場合、~/.ssh/config でホストエイリアスを定義します。

# 個人用 GitHub アカウント(標準の github.com として利用)
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_personal

# 業務用 GitHub アカウント(github-work エイリアスで利用)
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github_work

接続確認と git clone 時の使い分け

まず、ssh -T コマンドでそれぞれ意図したアカウント名で認証されるかテストします。

ssh -T git@github.com
# => Hi <個人アカウント名>! You've successfully authenticated...

ssh -T git@github-work
# => Hi <業務アカウント名>! You've successfully authenticated...

さらに、コミット時の user.name や user.email もディレクトリ単位で自動切り替えされるよう、~/.gitconfig の includeIf 機能を組み合わせると、設定ミスによる「個人メールでの業務リポジトリへの誤コミット」を100%防ぐことができます。

# ~/.gitconfig
[user]
  name = Amori
  email = personal@example.com

# ~/Work/ 配下のリポジトリでは自動的に業務用設定を上書き適用
[includeIf "gitdir:~/Work/"]
  path = ~/.gitconfig-work
# ~/.gitconfig-work
[user]
  name = Amori (Work)
  email = work@company.example.com

# ~/Work/ 配下では https://github.com/ や git@github.com: を自動的に github-work の鍵へルーティング
[url "git@github-work:"]
  insteadOf = git@github.com:

この url."git@github-work:".insteadOf を設定しておけば、業務リポジトリのURLを書き換えることなく、普通に git clone git@github.com:company/repo.git と打つだけで自動的に業務用の SSH 鍵が使われます。


5. ProxyJump で踏み台サーバー(Bastion)経由の接続を1コマンド化する

プライベートサブネット内にある本番DBサーバーやアプリケーションサーバーへ、踏み台サーバー(bastion)経由で接続する場合、古い ProxyCommand ssh -W %h:%p ... の代わりに ProxyJump ディレクティブ を使うと非常に簡潔に記述できます。

# 踏み台サーバー(パブリックIPあり)
Host bastion
  HostName 203.0.113.10
  User ec2-user
  Port 22
  IdentityFile ~/.ssh/id_ed25519_infra

# プライベートサブネット内のAPサーバー(踏み台経由で直接接続)
Host prod-app-01
  HostName 10.0.10.25
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519_infra
  ProxyJump bastion

これにより、ターミナルから ssh prod-app-01(または scp file.txt prod-app-01:/tmp/)と打つだけで、裏側で自動的に bastion を経由した安全な多段トンネルが確立されます。なお、エージェント転送(ForwardAgent yes)は踏み台サーバーが侵害された際に手元の全秘密鍵を悪用されるリスクがあるため、使わずに必ず ProxyJump を使用してください。


まとめ

SSH の設定は一度 .ssh/config と .gitconfig の includeIf を整理してしまえば、鍵の指定漏れや誤コミットを気にするストレスから完全に解放されます。セキュリティと利便性を両立するためにも、ぜひ Ed25519 + IdentitiesOnly yes + ProxyJump の構成へアップデートしてみてください。


📚 関連する技術記事

開発環境・ツールの記事一覧 →

AIコーディングエージェントとのペアプロでアプリ開発速度を最大化する実践ワークフローとコンテキスト設計

自立型AIコーディングエージェントを使った個人アプリ・Web開発において、手戻りを減らし一発で高品質な実装を得るための要件定義、ディレクトリ設計、テスト自動化、Git worktree活用術を解説します。