この記事では、ssh接続を効率的に管理するための ~/.ssh/config の使い方を紹介します。
複数のサーバに接続する環境では、毎回 ssh user@host -p port -i keyfile を入力するのは手間がかかります。
~/.ssh/config を設定しておくことで、ホスト名や鍵ファイルをサーバごとに記録し、短いコマンドで接続できるようになります。
なお、今回の設定は、サーバ側に鍵認証が済み、ssh接続が可能であることが前提となっていますので、まだssh接続を設定していない場合はsshの基本設計とsshの鍵認証設定を参考に設定してみてください。
configファイルの作成 #
sshの鍵認証設定の記事を参考にsshの鍵認証設定を実施している場合は、既に~/.sshディレクトリを作成していますので、~/.ssh/configの作成に進んでください。
クライアント端末での~/.sshディレクトリの作成
#
クライアント端末側で、ターミナルからホームディレクトリを開いた状態にします。以下のコマンドでディレクトリ・ファイルの一覧を表示し、~/.ssh ディレクトリの有無を確認します。
ls -la~/.ssh ディレクトリが存在しなければ、以下のコマンドでディレクトリを作成して、700のアクセス権限(ディレクトリのオーナー以外はアクセス不可)を付与します。
mkdir ~/.ssh
chmod 700 ~/.ssh~/.ssh/configの作成
#
以下のコマンドで ~/.ssh 配下にconfigファイルを作成します。
touch ~/.ssh/config~/.ssh/config の編集
#
~/.ssh/config を編集して、接続したいサーバのsshの接続情報を記載します。
以下は、~/.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に接続する場合
ssh serverAサーバBに接続する場合
ssh serverBサーバCに接続する場合
$ 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 #
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-agentStreamLocalBindUnlink yes により、既存のソケットが削除され、以下のようなエラーを防止します。
bind: Address already in use
channel_setup_fwd_listener: cannot listen to path ...
この設定により、秘密鍵をローカルに保持したまま、リモート側で署名操作や SSH 認証が行えます。
StreamLocalBindUnlinkのサーバ側での設定
#
通常StreamLocalBindUnlinkはクライアントの~/.ssh/configに記述しますが、サーバ側のsshd_configに設定すれば、全ユーザー・全転送に対して統一的に適用できます。
StreamLocalBindUnlink yes反映には SSH デーモンの再起動が必要です。
sudo systemctl restart sshdまとめると、
- クライアント側設定 → 自分の接続だけ振る舞いを変えたい場合
- サーバ側設定 → サーバのポリシーとして統一したい場合
のように使い分けます。
IdentitiesOnlyによる鍵の選択制御
#
複数の鍵が読み込まれている場合、意図しない鍵で接続しようとして認証に失敗することがあります。
IdentitiesOnly yes を使うと指定した鍵のみを使用できます。
Host serverA
HostName example.com
User makoto
IdentityFile ~/.ssh/serverA.key
IdentitiesOnly yes複数鍵を扱う場合は特に有効です。
ProxyJumpによる踏み台経由接続
#
踏み台サーバ経由で内部サーバに接続する場合、ProxyJumpを使うと便利です。
Host bastion
HostName bastion.example.com
User makoto
Host internal-server
HostName 10.0.0.50
User makoto
ProxyJump bastion ssh internal-serverLocalForwardによるローカルポートフォワード
#
LocalForwardは、ローカルポートから内部ネットワークのサービスへ安全に接続するためのトンネルを作成します。
Host db-server
HostName internal-db.example.com
User makoto
LocalForward 15432 127.0.0.1:5ssh db-server
pgsql -h localhost -p 15432用途としては以下が挙げられます。
- 内部の PostgreSQL / MySQL にアクセス
- 開発中サービスのローカル公開
- 内部ダッシュボードを安全に閲覧
Host * による共通設定
#
共通設定は Host * にまとめられます。
Host *
IdentitiesOnly yes
ServerAliveInterval 30
AddKeysToAgent yes設定順序の注意 #
sshの設定はファイルに書かれた順に適用されます。
Host * を先頭に置くと、特定ホストの設定が上書きされてしまいます。
# 具体的なホスト設定を先に
Host bastion
User makoto
IdentityFile ~/.ssh/bastion.key
# 最後に共通設定
Host *
IdentitiesOnly yes
ServerAliveInterval 30パターンマッチの注意 #
Host のパターンは 部分一致です。
# "-test" で終わるホスト
Host *-test
User tester
# "db" で始まるホスト
Host db*
LocalForward 15432 127.0.0.1:5432
# 全てのホスト
Host *
IdentitiesOnly yesパターンマッチの注意点としては、以下があげられます。
*-testはqa-test,prod-test,test-testなどに一致するHost serverをHost *より前に書かないと上書きされてしまう
便利な追加設定一覧まとめ #
| パラメータ | 目的 |
|---|---|
RemoteForward |
ローカルの GPG/SSH ソケットをリモートに転送 |
StreamLocalBindUnlink |
古いソケット削除による転送エラー防止 |
IdentitiesOnly |
指定鍵のみ使用し認証問題を防ぐ |
ProxyJump |
踏み台サーバ経由での接続 |
LocalForward |
ローカルポートから内部サービスへアクセス |
Host * |
共通設定。順序とパターンの扱いが重要 |