【PowerShell】SSH鍵を複数使い分ける方法|configファイルのHost別設定


【PowerShell】SSH鍵を複数使い分ける方法|configファイルのHost別設定

開発・運用で「GitHub 用」「社内踏み台用」「本番サーバー用」など鍵を分けたい場面は多くあります。
PowerShell から OpenSSH を使うなら、~/.ssh/config に Host 別の設定を書き分けるのが最も安全で実務的です。
ここでは Windows 環境を前提に、複数鍵の作成から Host 別割り当て、ワイルドカードや踏み台経由、ssh-agent の併用、トラブル対処までをまとめます。

前提:鍵を用途ごとに作成し、パスとコメントで見分ける

PowerShell を開き、用途ごとに鍵を作成します。軽量で強度の高い ed25519 を推奨します。

ssh-keygen -t ed25519 -C "github@pc"   -f $HOME\.ssh\id_ed25519_github
ssh-keygen -t ed25519 -C "dev@pc"      -f $HOME\.ssh\id_ed25519_dev
ssh-keygen -t ed25519 -C "prod@pc"     -f $HOME\.ssh\id_ed25519_prod

生成された *.pub は接続先の ~/.ssh/authorized_keys や Git ホスティングの鍵登録画面に追加します。
秘密鍵はローカルに厳重保管し、共有しないでください。

基本:Host 別に鍵を指定し、不要な鍵送信を抑制する

設定ファイルは C:\Users\<ユーザー名>\.ssh\config に置きます。UTF-8(BOM なし)・改行 LF で保存すると読み込み事故を避けられます。
まずは既定の振る舞いを最上段の Host * で定義し、各 Host で鍵を切り替えます。

# ~/.ssh/config (Windows でも同パス)
Host *
  ServerAliveInterval 30
  ServerAliveCountMax 3
  IdentitiesOnly yes
  StrictHostKeyChecking accept-new
  UserKnownHostsFile ~/.ssh/known_hosts

# GitHub には専用鍵
Host github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github

# 開発環境(名前で振り分け)
Host dev-*
  User ec2-user
  IdentityFile ~/.ssh/id_ed25519_dev

# 本番は FQDN を個別指定
Host app-prod-1.example.com
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519_prod
Host db-prod-1.example.com
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519_prod

IdentitiesOnly yes を付けると、IdentityFile に指定した鍵だけが送られます。
エージェントに多数の鍵が読み込まれている環境でも「Too many authentication failures」を防げます。

ワイルドカード・Include・環境別ファイルでスッキリ管理する

似たホスト名が多い場合はワイルドカードでまとめ、巨大化してきたら Include で分割します。

# 既定
Host *
  IdentitiesOnly yes

# プロジェクトごとに分割
Include ~/.ssh/config.d/github.conf
Include ~/.ssh/config.d/dev.conf
Include ~/.ssh/config.d/prod.conf

それぞれのファイル側で Host と鍵を割り当てれば、衝突や設定漏れを防ぎやすくなります。

踏み台経由での鍵使い分け:ProxyJump と Host 別鍵

社外から内側へ入るときは踏み台を経由します。踏み台と内側で異なる鍵を割り当てれば、安全に分離できます。

# 踏み台(bastion)は dev 鍵
Host bastion.example.com
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519_dev

# 内側は prod 鍵で、踏み台を自動経由
Host app.internal
  HostName 10.10.0.21
  User ubuntu
  IdentityFile ~/.ssh/id_ed25519_prod
  ProxyJump bastion.example.com

接続は ssh app.internal の一語で完了します。鍵の境界が明確になり、誤用リスクを下げられます。

windows の ssh-agent と併用してパスフレーズ入力を省略する

パスフレーズ付き鍵は Windows の ssh-agent に登録するとプロンプトが出なくなります。

Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
ssh-add $HOME\.ssh\id_ed25519_github
ssh-add $HOME\.ssh\id_ed25519_dev
ssh-add $HOME\.ssh\id_ed25519_prod
ssh-add -l  # 登録確認

config 側の IdentityFile と組み合わせると、エージェントに鍵が複数載っていても Host ごとに適切な鍵だけが使われます。

Git クライアントでも鍵を使い分ける

Git は内部で ssh を呼び出します。config の Host を使えば、リモート URL に応じて鍵が切り替わります。
もし独自の別名を使いたい場合は、リモート URL を git@github.com:owner/repo.git から git@github-alias:owner/repo.git のように変え、config に Host github-alias を定義します。

Host github-alias
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_github

診断:どの設定・鍵が使われたかを確認する

想定と違う鍵が送られるときは詳細ログを確認します。OpenSSH 9 以降なら最終的な設定もダンプできます。

ssh -v github.com
ssh -vv app.internal
ssh -G app.internal | more   # 解決後の実際の設定一覧を表示

トラブル対処:よくあるつまずき

Permission denied が続く場合は、まず接続先ユーザー名の誤りを疑います。次に IdentitiesOnly yes が Host に入っているか、IdentityFile のパスが正しいかを確認します。
Windows で config が効かない場合は、テキストの文字コードが UTF-8(BOMなし)か、改行が LF かを見直してください。
known_hosts の衝突で止まるときは該当行のみ削除して再登録します。踏み台経由で鍵が違うときは、踏み台側と内側側の Host を分けてそれぞれに鍵を割り当てます。

# サーバー側の典型的な権限(Linux)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R <user>:<user> ~/.ssh

セキュリティ運用のポイント

鍵は用途・端末ごとに発行し、共有しないことが原則です。不要になった公開鍵は速やかに削除し、サーバー側で PasswordAuthentication noPermitRootLogin no を検討します。
さらに Host 別に ProxyJumpPermitOpen・ポートフォワーディング可否を制御するとリスクを局所化できます。

まとめ

PowerShell からの複数鍵の使い分けは、~/.ssh/config に「Host ごとに IdentityFile を指定」「IdentitiesOnly yes で不要鍵を抑制」「必要に応じて ProxyJump」という基本を押さえれば簡潔に実現できます。
ssh-agent を併用すればパスフレーズの入力も省け、Git など他ツールでも同じ設定を再利用できます。まずは小さな Host ブロックから始め、運用に合わせてワイルドカードや Include で拡張していきましょう。