~/.ssh/config 活用術 - 接続情報を整理する

~/.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/

scprsync もエイリアスをそのまま使えるのがメリットだ。

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,bastion2

IdentityFile で鍵を使い分ける

用途ごとに別の鍵を使うケースではワイルドカードが便利だ。

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_ed25519
  • ServerAliveInterval 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

次に読む