メインコンテンツへスキップ

~/.ssh/configによるssh接続の管理

··2 分·
Makoto Morinaga
著者
Makoto Morinaga
技術メモ、コーディング、環境構築のための個人ノート。
目次

この記事では、ssh接続を効率的に管理するための ~/.ssh/config の使い方を紹介します。

複数のサーバに接続する環境では、毎回 ssh user@host -p port -i keyfile を入力するのは手間がかかります。 ~/.ssh/config を設定しておくことで、ホスト名や鍵ファイルをサーバごとに記録し、短いコマンドで接続できるようになります。

なお、今回の設定は、サーバ側に鍵認証が済み、ssh接続が可能であることが前提となっていますので、まだssh接続を設定していない場合はsshの基本設計sshの鍵認証設定を参考に設定してみてください。

configファイルの作成
#

sshの鍵認証設定の記事を参考にsshの鍵認証設定を実施している場合は、既に~/.sshディレクトリを作成していますので、~/.ssh/configの作成に進んでください。

クライアント端末での~/.sshディレクトリの作成
#

クライアント端末側で、ターミナルからホームディレクトリを開いた状態にします。以下のコマンドでディレクトリ・ファイルの一覧を表示し、~/.ssh ディレクトリの有無を確認します。

Terminal
ls -la

~/.ssh ディレクトリが存在しなければ、以下のコマンドでディレクトリを作成して、700のアクセス権限(ディレクトリのオーナー以外はアクセス不可)を付与します。

Terminal
mkdir ~/.ssh
chmod 700 ~/.ssh

~/.ssh/configの作成
#

以下のコマンドで ~/.ssh 配下にconfigファイルを作成します。

Terminal
touch ~/.ssh/config

~/.ssh/config の編集
#

~/.ssh/config を編集して、接続したいサーバのsshの接続情報を記載します。 以下は、~/.ssh/config の書き方の代表的な例です。

~/.ssh/config
# Aサーバ
Host serverA
    Hostname hogehoge.com
    Port 22
    User makoto
    IdentityFile ~/.ssh/serverA.key

# Bサーバ
Host serverB
    Hostname 192.168.1.10
    Port 50134
    User makoto
    IdentityFile ~/.ssh/serverB.key

# Cサーバ
Host serverC
    Hostname test.co.jp
    Port 48912
    User makoto

~/.ssh/config の各パラメータの意味は以下のとおりです。他にもパラメータがありますが、今回はある程度必要なものだけを記載しています。

パラメータ 内容
Host 接続に使用する短いエイリアス名(sshコマンドで使う名前)
HostName 接続したいサーバのドメイン名、もしくはIPアドレス
Port ssh接続のポート番号(デフォルトは22番)
User ssh接続のユーザ名
IdentityFile (鍵認証を行う場合)秘密鍵ファイルのパス

サーバへの接続
#

~/.ssh/config の設定が完了すると、サーバへ接続する場合は先程設定したHostのエイリアスを使って以下のように接続できます。

サーバAに接続する場合

Terminal
ssh serverA

サーバBに接続する場合

Terminal
ssh serverB

サーバCに接続する場合

Terminal
$ ssh serverC

便利な追加設定
#

基本設定に加えて、以下のオプションを使うとさらに使いやすくなります。

RemoteForwardによるGPGエージェント転送
#

RemoteForward を使うと、ローカルの UNIX ソケットをリモート側に転送できます。 秘密鍵をコピーすることなく、リモートで git commit -S(署名付きコミット)などを行うことができます。

注意点
#

  • RemoteForwardに設定する最初のパスがリモート側、次のパスがローカル側
  • リモートに古いソケットが残っていると失敗するため StreamLocalBindUnlink yes を併用する
  • Linux と macOS ではソケットパスが異なる

ソケットパス一覧
#

OS・環境 ソケット例
Linux (systemd) /run/user/<UID>/gnupg/S.gpg-agent
macOS (GPGTools / brew) /Users/<username>/.gnupg/S.gpg-agent

以下のコマンドでソケットパスを確認できます。

ls -l /run/user/$(id -u)/gnupg/ 2>/dev/null
ls -l ~/.gnupg/ 2>/dev/null

例: macOS → Linux
#

~/.ssh/config
Host remote-with-gpg
    HostName dev.example.com
    User makoto
    StreamLocalBindUnlink yes
    RemoteForward /run/user/1000/gnupg/S.gpg-agent /Users/makoto/.gnupg/S.gpg-agent

StreamLocalBindUnlink yes により、既存のソケットが削除され、以下のようなエラーを防止します。

bind: Address already in use
channel_setup_fwd_listener: cannot listen to path ...

この設定により、秘密鍵をローカルに保持したまま、リモート側で署名操作や SSH 認証が行えます。

StreamLocalBindUnlinkのサーバ側での設定
#

通常StreamLocalBindUnlinkはクライアントの~/.ssh/configに記述しますが、サーバ側のsshd_configに設定すれば、全ユーザー・全転送に対して統一的に適用できます。

/etc/ssh/sshd_config
StreamLocalBindUnlink yes

反映には SSH デーモンの再起動が必要です。

sudo systemctl restart sshd

まとめると、

  • クライアント側設定 → 自分の接続だけ振る舞いを変えたい場合
  • サーバ側設定 → サーバのポリシーとして統一したい場合

のように使い分けます。

IdentitiesOnlyによる鍵の選択制御
#

複数の鍵が読み込まれている場合、意図しない鍵で接続しようとして認証に失敗することがあります。 IdentitiesOnly yes を使うと指定した鍵のみを使用できます。

~/.ssh/config
Host serverA
   HostName example.com
   User makoto
   IdentityFile ~/.ssh/serverA.key
   IdentitiesOnly yes

複数鍵を扱う場合は特に有効です。

ProxyJumpによる踏み台経由接続
#

踏み台サーバ経由で内部サーバに接続する場合、ProxyJumpを使うと便利です。

~/.ssh/config
Host bastion
    HostName bastion.example.com
    User makoto

Host internal-server
    HostName 10.0.0.50
    User makoto
    ProxyJump bastion
Terminal
   ssh internal-server

LocalForwardによるローカルポートフォワード
#

LocalForwardは、ローカルポートから内部ネットワークのサービスへ安全に接続するためのトンネルを作成します。

~/.ssh/config
Host db-server
    HostName internal-db.example.com
    User makoto
    LocalForward 15432 127.0.0.1:5
Terminal
ssh db-server
pgsql -h localhost -p 15432

用途としては以下が挙げられます。

  • 内部の PostgreSQL / MySQL にアクセス
  • 開発中サービスのローカル公開
  • 内部ダッシュボードを安全に閲覧

Host * による共通設定
#

共通設定は Host * にまとめられます。

~/.ssh/config
Host *
    IdentitiesOnly yes
    ServerAliveInterval 30
    AddKeysToAgent yes

設定順序の注意
#

sshの設定はファイルに書かれた順に適用されます。 Host * を先頭に置くと、特定ホストの設定が上書きされてしまいます。

~/.ssh/config
# 具体的なホスト設定を先に
Host bastion
    User makoto
    IdentityFile ~/.ssh/bastion.key

# 最後に共通設定
Host *
    IdentitiesOnly yes
    ServerAliveInterval 30

パターンマッチの注意
#

Host のパターンは 部分一致です。

~/.ssh/config
# "-test" で終わるホスト
Host *-test
    User tester

# "db" で始まるホスト
Host db*
    LocalForward 15432 127.0.0.1:5432

# 全てのホスト
Host *
    IdentitiesOnly yes

パターンマッチの注意点としては、以下があげられます。

  • *-testqa-test, prod-test, test-test などに一致する
  • Host serverHost * より前に書かないと上書きされてしまう

便利な追加設定一覧まとめ
#

パラメータ 目的
RemoteForward ローカルの GPG/SSH ソケットをリモートに転送
StreamLocalBindUnlink 古いソケット削除による転送エラー防止
IdentitiesOnly 指定鍵のみ使用し認証問題を防ぐ
ProxyJump 踏み台サーバ経由での接続
LocalForward ローカルポートから内部サービスへアクセス
Host * 共通設定。順序とパターンの扱いが重要

関連記事