こんにちは、インフラエンジニアの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:22にSSH接続をしたいと思います。
(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.localとroot@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接続を楽にする方法の紹介でした。
参考文献
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com