RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

~/.ssh/configを使ってSSH接続を楽にする

こんにちは、インフラエンジニアのfro-rivです。

日々業務でたくさんのサーバにSSH接続をしているわけですが、
ユーザ指定、公開鍵認証、ポート指定、ポートフォワーディングなどを管理できる~/.ssh/configファイルについて深掘りしてみました。

日頃から多くのサーバに接続をしており、
様々なオプションを付ける+覚える必要があって億劫な思いをしている人には役に立つのではないかと思いますので、
ぜひ目を通してみてください。

~/.ssh/configってなに?

~/.ssh/configファイルとは、SSHクライアント用の設定ファイルです。
このファイルにホスト名(またはIPアドレス)ユーザ名SSH接続時のオプションなどを記入でき、
configファイルに記載しておくことでSSH接続を行う際は上記の情報を省略することができます。

configファイルは各ユーザのホームディレクトリ配下の.sshディレクトリで管理します。

configファイルを書くことで何が楽になるのか

例えば、下の図のような感じでクライアントのrootユーザからリモートサーバのtestuserに1022番ポートへ公開鍵認証SSH接続する場合

本来は、

## l→ユーザ名 p→ポート番号 i→クライアントの秘密鍵
ssh ${ホスト名 or IP} -l testuser -p 1022 -i ~/.ssh/id_rsa

とコマンド入力しなければなりません。この1台だけならいいですが、これを何台分も覚えるのは...


上の設定を~/.ssh/configに設定を記述すると、この記述のみでSSH接続できます↓↓↓

## "server"の部分は分かりやすい名前に変更可能
ssh server



ちなみに、~/.ssh/configの記述はこんな感じ

## Host で指定した server という文字でSSH接続できる
Host server
    Hostname ${接続先サーバのホスト名 or IP}
    User testuser
    Port 1022
    IdentityFile ~/.ssh/id_rsa

configファイルを作ってみよう

準備

下をコピペしてください。
ファイルの作成としてはこれで完了です。

次の章でパラメータについて紹介します。

# ユーザのホームディレクトリへ移動
cd ~

# ~/.sshディレクトリを作成(公開鍵認証をしている場合はすでに存在するはず)
# ~/.sshディレクトリの権限は700にしておいてください
mkdir -p -m 700 .ssh

# configファイルを作成(権限はデフォルト644の状態でOK)
touch config

パラメータ一覧

以下に、よく使用するパラメータを表にまとめました。
下に行くにつれて使用頻度は低くなります。

パラメータ 説明
Host ホスト名
(接続時に使用する名前)
Hostname ホスト名 or IPアドレス
User ユーザ名
Port ポート
(デフォルト: 22)
IdentityFile クライアントの秘密鍵
(デフォルト: ~/.ssh/id_rsa)
StrictHostKeyChecking サーバのホスト認証鍵を.ssh/known_hostsに追加するか
yes, no, ask (デフォルト: ask)
no にしておけばfinger printが変わってもSSH接続をはじかれない
UserKnownHostsFile known_hostsファイル
(デフォルト: ~/.ssh/known_hosts)
ProxyCommand ポートフォワードする場合などに使用
使用例: ssh -W %h:%p ${踏み台ホスト名}
※%hは接続ホスト名, %pはポート
ConnectionAttempts 接続試行回数
(デフォルト: 1)
TCPKeepAlive サーバとの接続を保持
(デフォルト: yes)
ServerAliveInterval 何秒間サーバの応答がなければ接続を閉じるか
LogLevel ログの出力レベル(以下、右がより詳細)
QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2

もっと詳しい設定まで確認したい場合は、日本語版のmanをご覧ください。
ssh_config(5) manページ

パターン別サンプルファイル

3パターンの~/.ssh/configサンプルファイルを用意しましたので、参考にしてみてください。

パターン1:SSH接続するサーバ全体に対してホスト鍵認証でエラーが出ないようにする

過去に存在していたSSH接続経験のあるIPアドレスやホスト名でサーバを構築しなおした場合、
以下のようなエラーが表示されることがあります。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /root/.ssh/known_hosts:XX
ECDSA host key for [XXX.XXX.XXX.XXX]:1022 has changed and you have requested strict checking.
Host key verification failed.

これを回避するために、以下の設定を~/.ssh/configに追記します。
Hostを"*(アスタリスク)"とすることで全てのSSH接続に適用されます。

### UserKnownHostsFile→何らかの拍子にフィンガープリントが変わっても接続がはじかれないようにする
### StrictHostKeyChecking→初回のログイン時も接続の可否を聞かれないようにする
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile=/dev/null

上記の設定を行うことで、SSH接続がホスト鍵認証の段階ではじかれることはなくなります。 新しいサーバにSSH接続する機会が多い場合、おすすめの設定です。

※但し、この設定は社内や家庭内などのLAN環境で使用することをお勧めします。
 本来、なりすましを防ぐためのチェックのため、インターネットからアクセス可能なサーバには設定しない方がセキュリティ的に安全です。

パターン2:接続先のユーザ名・ポートが違う場合

最初の方の説明でも記載しましたが、以下のような場合です。
root@client.localからtestuser@server.local:1022に接続する場合(公開鍵認証設定済み)

## server という文字でSSH接続する想定
## IdentityFileはデフォルトで`~/.ssh/id_rsa`なので省略可
Host server
    Hostname server.local
    User testuser
    Port 1022
    IdentityFile ~/.ssh/id_rsa

この設定をすることで# ssh serverとコマンド入力するだけでtestuer@server.local:1022に接続できてしまいます。

パターン3:ポートフォワーディングする

先ほどのパターン2で紹介したserver.localを中継させて、下の図の様に
root@server2.local:22SSH接続をしたいと思います。
(testuser@server.localの公開鍵はroot@server2.local:~/.ssh/authorized_keysに登録済み)

## server.localには server という文字でSSH接続する
## IdentityFileはデフォルトで`~/.ssh/id_rsa`なので省略可
Host server
    Hostname server.local
    User testuser
    Port 1022
    IdentityFile ~/.ssh/id_rsa

## server2.localには server2 という文字でSSH接続する
## ProxyCommandオプションにて中継サーバを指定
Host server2
    Hostname server2.local
    User root
    Port 22
    ProxyCommand ssh -W %h:%p server
    IdentityFile ~/.ssh/id_rsa

この設定を追記することで# ssh server2とコマンド入力するだけでroot@server2.local:22に接続できます。

本来は、
# ssh -o ProxyCommand='ssh -W %h:%p testuser@server.local -p 1022' root@server2.local
または
# ssh root@172.20.100.137 -L 1022:testuser@172.20.100.128:22
といったように、長々とコマンドを打たなければなりませんが、そんな手間を~/.ssh/configは解決してくれます。

更に、scpコマンドでファイル転送をしないといけない場合も大活躍で、root@client.localroot@server2.local間でファイル転送を行う場合も

scp server2:/tmp/test.file ./
scp ./test.file server2:/tmp/

と表記するだけでOKです。

最後に

~/.ssh/configファイルを使用して、SSH接続を楽にするということでパラメータやパターン別の
サンプルファイルを紹介させていただきました。

特に、サーバでSSHDの待ち受けポートを22番以外に設定しているサーバや、
ポートフォワーディングが必要なサーバの場合はconfigファイルが役に立つのではないかと思います。

また、SSH接続は勿論ですが、個人的にはポートフォワーディングしているサーバからSCPでファイル転送を行う際に
一番力を発揮してるなと感じました。

今回はconfigファイルでよく使用する頻度の高いパラメータを中心に紹介しましたが、
気になる方は下の参考文献で紹介しているmanページも確認してみてください。

というわけで、~/.ssh/configファイルでSSH接続を楽にする方法の紹介でした。

参考文献


◆TECH PLAY
techplay.jp

◆connpass
rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.