.ssh/configの記述量を減らしたいしホスト鍵警告メッセージも減らしたい

今日もみなさんどんどん 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` のデフォルト値ですので、こちらも必要に応じて変更可能です。