【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 no
・PermitRootLogin no
を検討します。
さらに Host 別に ProxyJump
・PermitOpen
・ポートフォワーディング可否を制御するとリスクを局所化できます。
まとめ
PowerShell からの複数鍵の使い分けは、~/.ssh/config
に「Host ごとに IdentityFile
を指定」「IdentitiesOnly yes
で不要鍵を抑制」「必要に応じて ProxyJump
」という基本を押さえれば簡潔に実現できます。
ssh-agent を併用すればパスフレーズの入力も省け、Git など他ツールでも同じ設定を再利用できます。まずは小さな Host ブロックから始め、運用に合わせてワイルドカードや Include で拡張していきましょう。