ssh
初めて接続するサーバーなどではsshでは以下のようなプロンプトが出ることがある.
$ ssh git@github.com
`The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
このようなプロンプトは自動化を行う上での障害となる.
確認しないのであれば
ssh -o StrictHostKeyChecking=no
オプションを使えばよい.
gitなどほかのツールを用いた場合のssh接続であれば,
ssh-keyscan {hostname} >> ~/.ssh/known_hosts
しかしそもそもこのプロンプトは中間者攻撃などを防ぐために,正しいサーバーに接続していることを証明書のハッシュ値を表示することで確認を促すプロンプトだ.確認するのがセキュリティ的には正しいものと思われる.githubなどは確かにここでfingerpirntを公開している.これはhttps接続しているページでもあるわけだから,ブラウザが変な公開鍵を信頼していなければ,PKI的に信頼性のある情報となっているはずだ.
これを適当なファイル(ここではhashfile
としよう)にコピペしておいて,半自動で確認するようにさせたい.
コマンド
ssh-keygen -E md5 -lf <(ssh-keyscan github.com 2>/dev/null)
によってmd5のハッシュ値を生成できる.上のコマンドの出力は
2048 MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48 github.com (RSA)
のようになる.
真ん中の値16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
が事前に取得したものと一致していることを確認してやればよいだろう.
そこでcutコマンドを使って適宜加工し,diffをとってやる
diff <(ssh-keygen -E md5 -lf <(ssh-keyscan github.com 1>tmp1 2>/dev/null; cat tmp1) | cut -d' ' -f2| cut -d':' -f2-) <(cat hashfile)
(diff <(command1) <(command2)
で確認が可能)
そしてこの結果が一致すれば
tmp1 >> ~/.ssh/known_hosts
などとすることによって,known_hostsに加えてやればよい.
まとめてワンライナーにするとこのような形だろうか.
if diff -q <(ssh-keygen -E md5 -lf <(ssh-keyscan github.com 1>tmp1 2>/dev/null; cat tmp1) | cut -d' ' -f2 | cut -d':' -f2-) hashfile >/dev/null; then cat tmp1 >> ~/.ssh/known_hosts; else echo "different hash
"; fi
これをやってから例えば,githubに接続すると,以下のような表示が出て,追加のプロンプトは出てこない.
$ ssh git@github.com
Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts.
感想
普通にオプションでファイルを指定したら,自動で確認してくれるようにできないのだろうか…
Linuxコマンドは素人なので,ミス・改善点などあったらコメント・編集リクエストお願いします.