~/.ssh/config 活用術 - 接続情報を整理する
~/.ssh/config とは何か?
~/.ssh/config を使うと、ssh user@192.0.2.10 -i ~/.ssh/mykey -p 2222 のような長いコマンドを ssh myserver の一行に短縮できる。接続先ごとのホスト名・ユーザー・ポート・鍵ファイルをまとめて管理できるため、複数サーバを扱う実務で必須の設定ファイルだ。
結論(実務の型)
- 長い
sshコマンドはすべて~/.ssh/configのエイリアスに集約する - 踏み台経由接続は
ProxyJumpで 1 行で書ける Host *はファイル末尾に置いてデフォルト値を一括管理する
前提(対象環境)
- OS:Ubuntu / Linux(OpenSSH クライアント)
- SSH 鍵認証が設定済みであること(未設定ならSSH 鍵認証セットアップを先に参照)
設定ファイルの作成と権限設定
ファイルが存在しない場合は作成してパーミッションを設定する。
touch ~/.ssh/config chmod 600 ~/.ssh/config
600 は必須。 グループ・その他に読み取り権限があると OpenSSH が設定ファイルを無視し、エラーが発生する。
Bad owner or permissions on /home/user/.ssh/config
このエラーが出たら chmod 600 ~/.ssh/config で修正する。
基本構文
Host キーワードで始まるブロックを並べる形式。ブロック内のオプションはインデントして記述する(空白 4 つが慣習的)。
Host <エイリアス>
HostName <実際のIPまたはFQDN>
User <ログインユーザー名>
Port <ポート番号>
IdentityFile <秘密鍵のパス>OpenSSH はファイルを上から順に評価し、最初にマッチしたブロックを優先する。同一オプションが複数のブロックにあっても上書きされないため、具体的な設定を上に、デフォルト設定は下に書く。
よく使うオプション一覧
| オプション | 説明 | 例 |
|---|---|---|
HostName |
実際のIPまたはFQDN | 192.0.2.10 |
User |
ログインユーザー | ubuntu |
Port |
ポート番号 | 2222 |
IdentityFile |
秘密鍵ファイルパス | ~/.ssh/id_ed25519_work |
ProxyJump |
踏み台接続 | bastion |
ServerAliveInterval |
KeepAlive 間隔(秒) | 60 |
ServerAliveCountMax |
無応答でのカット回数 | 3 |
Compression |
圧縮転送の有効化 | yes |
ForwardAgent |
SSH エージェント転送 | yes |
AddKeysToAgent |
ssh-agent への自動追加 | yes |
StrictHostKeyChecking |
ホスト鍵検証の挙動 | accept-new |
複数サーバをエイリアスで管理する
最も基本的な使い方。接続先ごとにブロックを記述する。
Host web01
HostName 192.0.2.10
User ubuntu
Port 22
IdentityFile ~/.ssh/id_ed25519
Host web02
HostName 192.0.2.20
User ec2-user
IdentityFile ~/.ssh/id_ed25519_aws
Host staging
HostName staging.example.com
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_staging設定後は短いエイリアスで接続できる。
ssh web01 ssh staging scp file.txt staging:/home/deploy/
scp や rsync もエイリアスをそのまま使えるのがメリットだ。
ProxyJump で踏み台経由接続
本番環境では「踏み台(bastion)経由でのみアクセス可能」なサーバが多い。ProxyJump を使うと透過的に接続できる。
Host bastion
HostName bastion.example.com
User ubuntu
IdentityFile ~/.ssh/id_ed25519
Host prod01
HostName 10.0.0.10
User ubuntu
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519
Host prod02
HostName 10.0.0.11
User ubuntu
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519接続コマンドは変わらない。
ssh prod01
内部で bastion に接続し、そこから prod01 に転送される。scp / rsync もそのまま動作する。
ProxyJump は OpenSSH 7.3 以降。古い環境では ProxyCommand ssh -W %h:%p bastion で代替できる。バージョンは ssh -V で確認。
多段踏み台(bastion1 → bastion2 → target)もカンマで書ける。
Host deep-prod
HostName 10.1.0.5
User ubuntu
ProxyJump bastion1,bastion2IdentityFile で鍵を使い分ける
用途ごとに別の鍵を使うケースではワイルドカードが便利だ。
Host github.com
IdentityFile ~/.ssh/id_ed25519_github
User git
Host *.company.internal
IdentityFile ~/.ssh/id_ed25519_company
User sato
Host *.amazonaws.com
IdentityFile ~/.ssh/id_rsa_aws
User ec2-user*.company.internal のようにワイルドカードを使うと、同一ドメインのサーバ群に同じ鍵と設定を一括適用できる。
Host * でデフォルト設定を一括管理
Host * はすべての接続に適用されるデフォルト設定ブロック。ファイルの末尾に置くのが鉄則。
# 個別設定(上に置く)
Host web01
HostName 192.0.2.10
User ubuntu
Host bastion
HostName bastion.example.com
User ubuntu
# デフォルト設定(必ずファイル末尾)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519ServerAliveInterval 60+ServerAliveCountMax 3:180 秒無応答で切断。ネットワーク越しに接続が固まるのを防ぐ。AddKeysToAgent yes:初回接続時に自動でssh-agentへ鍵を追加し、同一セッション内ではパスフレーズ入力を省略できる。
設定の確認方法
実際にどの設定が使われるか確認するには -G フラグが便利。接続せずに解決済みのオプションを一覧表示する。
ssh -G prod01
接続時に詳細なデバッグ情報を表示するには -v を使う。
ssh -v prod01 2>&1 | grep -E "identity|proxy|config"
どの IdentityFile が試されているか、どの ProxyJump が使われているかを確認できる。
設定例テンプレート(コピペ用)
最小構成テンプレート
# 踏み台サーバ
Host bastion
HostName bastion.example.com
User ubuntu
IdentityFile ~/.ssh/id_ed25519
# 本番サーバ(踏み台経由)
Host prod01
HostName 10.0.0.10
User ubuntu
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519
# デフォルト設定(必ず末尾)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
StrictHostKeyChecking accept-new