SSH接続先管理を簡単にする (SSHクライアント設定)

開発業務をやっていると、客先サーバーやら自社サーバー、ローカルの仮想サーバーなどいろいろ増えてツラくなってきます。
接続先が増えるとIPアドレスや鍵ファイル等の管理が面倒になってくるので、設定ファイルで管理しておくと簡単に接続できるようになります。

例えばSSH接続する時には

$ ssh user@hostname_or_ip -p 22 -i ~/.ssh/id_ed_25519

みたいな感じにしますが、設定しておくことで、

$ ssh nc_whale

みたいな感じに接続することができるようになります。

.sshディレクトリ構成

今回の設定方法ですが、.sshディレクトリ配下はこんな感じにします。

  • .ssh/
    • config.d/
      • project_a.conf
      • project_b.conf
      • develop.conf
      • localdev.conf
    • keys/
      • client_a_web.key
      • github_rsa
      • github_rsa.key
    • config
    • known_hosts
    • id_ed25519
    • id_ed25519.pub
    • id_rsa
    • id_rsa.pub

今回キーになるのは、configファイルとconfig.dディレクトリ、keysディレクトリになります。

  • configファイル: 共通設定と外部設定ファイルの読み込み設定を記述
  • config.dディレクトリ: 各サーバーへの接続設定を記述
  • keysディレクトリ: 接続時の使用する鍵ファイルを管理します。

configファイル

configファイルにはSSH接続時に共通で使用するパラメータと外部設定ファイル読み込み設定を記述します。
私の場合はこんな感じにしています。

Host *
    ServerAliveInterval 60

Include config.d/*.conf

共通設定として、接続時のタイムアウトによる切断を回避したいので、60秒ごとにビーコンを発信するようにします。

外部設定の読み込みは config.dディレクトリ配下にあるconf拡張子を持ったファイルを読み込むようにしています。

config.dディレクトリ

このディレクトリには接続先設定を含んだファイルを格納します。
私の場合、案件やローカル開発環境毎に分けて管理しています。グループに分けて接続先を管理できるので大量にあっても「なにがなんだかわからんぞ…」みたいなことになりにくいです。

各設定ファイルにはこんな感じに記述します。

# Cloudstack on WHALE
Host nc_whale
     HostName 192.168.1.16
     Port     22
     User     yusuke
     IdentityFile ~/.ssh/id_ed25519

Host nc_shark
     HostName shark.local
     Port     60022
     User     yusuke
     HostKeyAlgorithms ssh-rsa
     PubkeyAcceptedKeyTypes ssh-rsa
     IdentityFile ~/.ssh/id_rsa

Hostから始まるカタマリが 1つの接続設定で、1つの .conf ファイルには複数の接続先を設定できます。
また、#(シャープ)でコメントも書けるので、管理はしやすいかと思います。

よく使うパターンとしては、このパラメータを使う事が多いかと思います。

  • HostName: ホスト名やIPアドレス、DNSから引けるドメインなど
  • Port: ポート番号。22番はデフォルトポートなのでPortパラメータを省略すると22番ポートで接続しようとします。
  • User: 接続ユーザ名
  • IdentityFile: 接続に使用する鍵ファイルを指定

Hostの後ろにあるnc_whaleやnc_sharkはsshコマンドの引数として使用します。
192.168.1.16のサーバーに接続する場合、

$ ssh nc_whale

みたいな感じに書きます。

古いサーバーに接続する場合、HostKeyAlgorithms や PubkeyAcceptedKeyTypes なんかのパラメータを設定することで接続先毎に設定を変えることができます。
本番環境で多段SSHする時は ProxyCommand を使います。

パラメータについてはこのあたりが参考になります。(ありがたや!)

keysディレクトリ

keysディレクトリには接続に使用する鍵ファイルを放り込んでます。
ディレクトリを作成して分類した方が管理しやすくなると思いますが、今のところただ放り込んでます。

SSHコマンドの補完

接続先が増えると、Hostで指定した名前も覚えられなくなります…
ので、タブキーで補完できる設定もあります。

RedHat系もあると思いますが、DebianやUbuntuでBashを使っている場合は、bash-completion パッケージを導入します。
このコマンドでインストールします。

$ sudo apt install bash-completion

インストールしたら、~/.bashrcファイルに下記を追記します。

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

保存したら、このコマンドで.bashrcを再読み込みするか、ログインし直してください。

$ . ~/.bashrc

これでホスト名を補完できるようになります。
補完の仕方は、cd コマンドでディレクトリを探す感じで、タブキーを連打するだけです。超便利!