今日もみなさんどんどん ssh でどっかのホストにログインするのにお忙しい事と思います。最近のプロジェクトでは、ぼくもどんどん ssh でどっかのホストにログインするのにお忙しくて、ログインし続けていたら一日が終わる。
さて、ssh を使うときの個人用設定としては ~/.ssh/config
が使われるのは周知の通りですが、結構業務効率を左右するような状況にもなってきたので色々と調べてみました。
設定をシンプル (DRY) に
~/.ssh/config
内では、ホストごとに設定を切り替えることができます。
Host hoge.com
というような設定を記述して ssh hoge.com
用の設定を行う方も多いでしょう。
ここで問題になったりするのが踏み台とそれ以外のサーバであり、また、その数が多くなった場合です。踏み台サーバと踏み台を踏んだ後のサーバ群は設定が異なることが多いですし、サーバが多くなるほど Host
の数も増えて ~/.ssh/config
の扱いも面倒になりがちです。
実は Host
にはパターンを渡すことができ、それによって設定の数をへらすことができます。
例えば、よくありがちなこんなパターンですが、
# web サーバ
Host prod_web
HostName: xxx.xxx.xxx.xxx
Port 22
User prod_dev
IdentityFiel ~/.sshlocal/keys/prod.pem
ProxyCommand ssh prod_bastion -W %h:%p
# API サーバ
Host prod_api
HostName: xxx.xxx.xxx.xxx
Port 22
User prod_dev
IdentityFiel ~/.sshlocal/keys/prod.pem
ProxyCommand ssh prod_bastion -W %h:%p
# 踏み台サーバ
Host prod_bastion
HostName: xxx.xxx.xxx.xxx
Port 22
User prod_dev
IdentityFiel ~/.sshlocal/keys/prod.pem
Host
にパターンを指定することで設定量を減らすことが可能です。
注意点としては、~/.ssh/config
の各設定項目は「最初に見つかったもの」が評価されることを鑑み、先頭の方により汎用的な設定を記述することでしょうか。
# prod 環境の共通設定
Host prod*
Port 22
User prod_dev
IdentityFiel ~/.sshlocal/keys/prod.pem
# prod 環境の bation (踏み台) 以外で使う設定
Host prod* !prod-bastion
ProxyCommand ssh prod_bastion -W %h:%p
# 以下、各 prod 環境サーバごとの設定
Host prod_web
HostName: xxx.xxx.xxx.xxx
Host prod_api
HostName: xxx.xxx.xxx.xxx
Host prod_bastion
HostName: xxx.xxx.xxx.xxx
警告メッセージを黙らせたい
ssh 接続先サーバを作り直すということが imuutable infrastructure としては増えてきていると思います。作り直す都度、ssh 接続しようとすると以下のような警告メッセージが表示された上接続が拒否されます。
もうこれ死ぬほどだるい、もう次に拒否されたら死ぬ、みたいなこともあろうかと思います。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
*****
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending key in /home/user/.ssh/known_hosts:1
RSA host key for ***** has changed and you have requested strict checking.
Host key verification failed.
これを軽々に無視することは セキュリティ的にオススメしない (どこかできちんと書きたい…)ですが、~/.ssh/config
設定でこれを回避する方法はあって、それが
StrictHostKeyChecking no
です。この設定項目を no
にすると、ホスト鍵チェックをすっ飛ばして、known_hosts
ファイルにホスト鍵を無条件登録し、拒否されることなく ssh 接続を行えるようになります。
さらに、StrictHostKeyChecking yes
を設定しても、それでもまだ上記のエラーメッセージの一部が出力されてターミナルが汚れます。それすらも嫌だ、ということであれば、
UserKnownHostsFile=/dev/null
を追加しましょう。これによりホスト鍵は完全にファイル保存されなくなるので、「常に新しいホストに接続する」という状況になります。結果として上記のようなエラーメッセージは表示されません。
もしあなたの環境が絶対に安全だ、という場合は、
Host *
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
なんて書いておけば、ホスト鍵チェックに煩わされることはなくなるでしょう(煩わされるのはセキュリティのためである点には注意してください)
ssh 接続を切断させない
無通信だったら ssh 接続が閉じてしまうっていうときは、
ServerAliveInterval 60
を指定します。数字は適宜調整してください。
ServerAliveInterval
はサーバ生存確認メッセージをサーバに飛ばす間隔を秒単位で指定するものです。逆に言えば、このメッセージが定期的に送信されるので、切断されにくくなります。
なお、このサーバ生存確認メッセージに対して、サーバが ACK を 3 回返却しない状況になると、ssh 接続は切断されます。この「3」という値は ServerAliveCountMax
のデフォルト値ですので、こちらも必要に応じて変更可能です。