サーバー接続のタイピングを激減させる。「~/.ssh/config」の整理術と現場の運用パターン
目次
開閉
開発環境やステージング環境、本番サーバーにログインする際、ターミナルでこんな長いコマンドを毎回手入力(あるいはシェルの履歴検索)していないでしょうか。
ssh -i ~/.ssh/my-special-key.pem -p 2222 ec2-user@198.51.100.42
さらに「セキュリティ上、踏み台サーバー(Bastion Host)を経由しなければ内部のDBサーバーにアクセスできない」という現場では、踏み台に一度SSHログインしてから、そこでもう一度SSHを叩くという二度手間を踏んでいるケースも少なくありません。
こうしたタイピングの手間と脳内メモリの浪費は、ローカルの ~/.ssh/config(Windowsの場合は C:\Users\<ユーザー名>\.ssh\config)を一度適切にセットアップするだけで完全にゼロにできます。
今回は、業界20年の現場運用で落ち着いた「本当に実用的で破綻しない ~/.ssh/config の整理術」をご紹介します。
基本設定:ホスト名とユーザー名のエイリアス化
まずは基本の書き方です。接続先の「識別しやすい短い名前(エイリアス)」を定義し、そこに実ホスト名・ユーザー名・ポート番号・秘密鍵を紐付けます。
Host dev-web
HostName 198.51.100.42
User ec2-user
Port 2222
IdentityFile ~/.ssh/id_ed25519_company
IdentitiesOnly yes
これだけで、ターミナルで叩くコマンドは以下の一撃で済むようになります。
ssh dev-web
ここで地味ながら必須なのが IdentitiesOnly yes という指定です。これがないと、SSHエージェントに登録されている鍵を手当たり次第に試行してしまい、サーバー側から「認証試行回数オーバー(Too many authentication failures)」で拒絶される原因になります。
踏み台経由の接続を一瞬にする「ProxyJump」
現代のクラウドインフラでは、プライベートサブネット内のサーバーへ直接インターネット経由でSSHすることは原則禁止されており、踏み台サーバーを経由するのが標準です。
以前は ProxyCommand ssh -W %h:%p bastion といった呪文のような設定が必要でしたが、OpenSSH 7.3以降では ProxyJump ディレクティブを使うことで驚くほどシンプルに書けます。
# 踏み台サーバー(インターネットから直接アクセス可能)
Host bastion
HostName bastion.example.com
User admin
IdentityFile ~/.ssh/id_ed25519_bastion
IdentitiesOnly yes
# 内部ネットワークのDBサーバー(インターネット非公開)
Host internal-db
HostName 10.0.2.15
User postgres
IdentityFile ~/.ssh/id_ed25519_internal
ProxyJump bastion
IdentitiesOnly yes
この設定をしておけば、手元のマシンで ssh internal-db と叩くだけで、OpenSSHが自動的に bastion へのセッションを張り、そのトンネル越しに内部の 10.0.2.15 へ直接ダイレクトにログインしてくれます。
踏み台サーバー側に内部接続用の秘密鍵を置く必要(セキュリティ上の重大なリスク)も一切ありません。
セッションの維持とタイムアウト切断防止
作業中にブラウザでドキュメントを調べたり席を外したりした際、ターミナルに戻ると Write failed: Broken pipe と表示されて接続が切断されてしまうストレス。
これも config の共通設定(Host *)で解決できます。
# すべてのホストに適用される共通デフォルト設定
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive yes
AddKeysToAgent yes
ServerAliveInterval 60: 60秒ごとにクライアントからサーバーへ無害な応答確認パケット(心拍信号)を送ります。ServerAliveCountMax 3: 3回応答がなければ切断されたと判断します。AddKeysToAgent yes: SSH接続時に使用した秘密鍵を自動的にSSHエージェント(ssh-agent)へ追加し、パスフレーズの再入力を省きます。
この共通設定をファイルの末尾(または先頭)に置いておくだけで、NATルーターやクラウドのアイドルタイムアウトによる意図しない切断をほぼ完全に防げます。
まとめ
~/.ssh/config は、一度自分なりのテンプレートを作ってしまえば、新しいプロジェクトや検証サーバーが増えた時も数行書き足すだけで即座に快適な接続環境が整います。
また、MacとWindowsの両マシンで開発を行っている場合、ターミナルエミュレータと合わせてSSH設定のフォーマットを共通化しておくと、頭の切り替えコストを最小限に抑えられます。クロスプラットフォームのターミナル構築については、以下の記事もぜひ参考にしてみてください。