第5章 .ssh/config による接続管理
なぜ ssh-agent を使わずに .ssh/config を使うのか
SSH の接続管理では、パスフレーズ入力を省略・保持するために ssh-agent を利用する方法が紹介されることがあります。
しかし、ssh-agent はバックグラウンド常駐プロセスの管理や環境変数の引き継ぎが必要であり、端末の再起動や新しいシェル起動時にプロセスが二重起動したり切断されたりする管理上の煩雑さがあります。
また、エージェントに多数の秘密鍵が登録されていると、接続時に保有するすべての鍵を順次試行してしまい、サーバ側の最大試行回数を超過して Too many authentication failures エラーで接続が拒否されるトラブルが頻発します。
これに対し、クライアント設定ファイル(~/.ssh/config)のみを用いた管理方式には以下の決定的な利点があります。
-
プロセスの常駐が不要:
単なるプレーンテキストの設定ファイルであるため、エージェントプロセスの起動や状態を気にする必要がありません。
-
ホストと秘密鍵の完全な 1 対 1 紐付け:
どのサーバにどのユーザー名、ポート番号、秘密鍵でアクセスするかが設定ファイル上で明示的に宣言され、意図しない鍵の誤用や試行オーバーを完全に防ぐことができます。
-
極めて短いコマンド実行:
長大なホスト名やポート指定、秘密鍵オプションを入力することなく、短い別名(エイリアス)を指定するだけで接続が完了します。
.ssh/config の基本構文と主要ディレクティブ
クライアントのホームディレクトリ配下に config ファイルを作成します。
~/.ssh/config
基本構成は Host <エイリアス> から始まり、インデントして接続パラメータを記述します。
Host dev-server
HostName 192.168.1.50
User developer
Port 22
IdentityFile ~/.ssh/id_ed25519_dev
IdentitiesOnly yes
主要ディレクティブの意味
-
Host:
コマンドラインで指定する接続エイリアス(別名)です。任意の識別しやすい文字列を指定します。
-
HostName:
実際の接続先 IP アドレス、またはドメイン名(FQDN)を指定します。
-
User:
ログインするリモートサーバ上のユーザー名を指定します。
-
Port:
接続先の SSH ポート番号を指定します(省略時は 22)。
-
IdentityFile:
このホストへの接続に使用する秘密鍵のパスを指定します。
-
IdentitiesOnly yes:
極めて重要なディレクティブです。明示的に指定した
IdentityFileの鍵のみを認証に使用するよう SSH クライアントに強制します。デフォルト鍵や他の鍵を自動試行させないことで、認証エラーを根本から排除します。
実践的な設定例
複数のサーバを用途別に整理し、全ホスト共通のタイムアウト対策を加えた標準的な設定例です。
# 共通のベース設定(全ホストに適用)
Host *
# 接続が切れないよう 60 秒ごとにキープアライブパケットを送信
ServerAliveInterval 60
ServerAliveCountMax 3
# 明示指定した鍵のみを使用
IdentitiesOnly yes
# 開発用 Debian サーバ
Host dev
HostName 192.168.1.100
User debian
Port 22
IdentityFile ~/.ssh/id_ed25519_dev
# 社内 Windows サーバ(ポート 2222)
Host win-server
HostName 192.168.1.150
User admin
Port 2222
IdentityFile ~/.ssh/id_ed25519_win
# クラウド本番サーバ
Host prod
HostName 203.0.113.10
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519_prod
上記のように記述しておけば、ターミナルで以下の短いコマンドを叩くだけで、正しいポート、ユーザー、秘密鍵で即座に接続されます。
ssh dev
ssh win-server
ssh prod
踏み台サーバ(ジャンプホスト)経由の接続
セキュリティの厳しい社内ネットワークや VPC 環境では、プライベートネットワーク内のサーバへ直接アクセスできず、踏み台(Bastion)サーバを経由してアクセスする構成が一般的です。
ProxyJump ディレクティブを使用すると、透過的な踏み台接続を 1 行で定義できます。
# 外部公開されている踏み台サーバ
Host bastion
HostName 203.0.113.5
User bastion-user
Port 22
IdentityFile ~/.ssh/id_ed25519_bastion
IdentitiesOnly yes
# プライベート空間にある内部 DB サーバ
Host internal-db
HostName 10.0.1.20
User db-admin
Port 22
IdentityFile ~/.ssh/id_ed25519_internal
IdentitiesOnly yes
ProxyJump bastion
この設定により、利用者は単に以下を実行するだけで、クライアントが裏で自動的に踏み台サーバを経由して内部サーバへ安全にトンネリング接続します。
ssh internal-db
ファイルのアクセス権限管理
config ファイルは、他者から改ざんされると不正なホストへ接続させられるリスクがあるため、アクセス権限を厳格にしておく必要があります。
Linux / macOS / WSL の場合
chmod 600 ~/.ssh/config
Windows の場合
PowerShell で以下のコマンドを実行し、現在のユーザーのみにフルコントロール権限を与え、他ユーザーの権限を削除します。
$path = "$HOME\.ssh\config"
icacls.exe $path /inheritance:r /grant "$($env:USERNAME):(F)"