Linuxコマンド

SSH接続する時の確認メッセージを表示させない方法

投稿日:

sshコマンドで知らない(未知)のサーバーへ接続するとき、次のようなメッセージが表示されると思います。

The authenticity of host '192.168.1.20 (192.168.1.20)' can't be established.
ECDSA key fingerprint is SHA256:GglDWZzFbtwgvXx9TmSScmWkDGFpRdMTFST3z6JgAPk.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

これは未知のサーバーを信頼して、サーバーに接続していいかをユーザーに問い合わせるメッセージです。

サーバーが詐称されていないかを確認すためのSSHのセキュリティ機構ですが、確実にサーバーを信頼できる場合には、不必要なものでもあります。

このメッセージを表示させない方法を先に言うと、次のように「StrictHostKeyChecking」に「accept-new」、「no」、「off」のいずれかを指定するとメッセージは表示されなくなります。

$ ssh -o StrictHostKeyChecking=accept-new foo.example.com
$ ssh -o StrictHostKeyChecking=noo foo.example.com
$ ssh -o StrictHostKeyChecking=off foo.example.com

なぜこのようにするとメッセージが表示されなくなるのか?「accept-new」「no」「off」のどれを指定するのが良いのか?についての回答は、この後、詳細に説明します。

また、サーバーの公開鍵が変わった場合は、次のメッセージが表示されてSSH接続できなくなります。これについての対処方法についても説明します。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

SSH接続時のサーバー認証(公開鍵の確認)の仕組み

まずはメッセージが表示される理由から説明しましょう。

SSHにはクライアントがサーバーへ接続するとき、サーバーを認証する仕組みがあります。

クライアントがサーバー認証をするとは、平たく言えば、サーバーが「私は正しいサーバーですよ。」と言うのに対して、クライアントが「確かに正しいサーバーですね。承認します。」と受け入れることです。

先程の最初のメッセージは、「私は正しいサーバーですよ。」と言っているところです。

具体的には、サーバーは自身の公開鍵をクライアントへ送って、「私はこういう公開鍵を持っているものです」と言っています。メッセージにはユーザーが確認しやすい(とは思えませんが)ように、この公開鍵のフィンガープリントが表示されています。

ここで「yes」を入力すると、サーバーが正しいことを受け入れたことになります。それと同時に、ユーザーの「~/.ssh/known_hosts」にサーバーの公開鍵が登録されます。

しかし、上記のメッセージが表示されたときにそれが正しいサーバーか、たいては判断できないでしょう。ほとんどの場合、初回は正しいと思って受け入れるしかないと思います。

一度公開鍵が登録されると、次回以降のSSH接続時に上記のメッセージは表示されなくなります。

これはSSHクライアントプログラムが「~/.ssh/known_hosts」をチェックして、正しいサーバーへ接続しているかを自動的に判断するためです。

StrictHostKeyCheckingを指定するとメッセージが表示されなくなる理由

StrictHostKeyCheckingは名前から推測できる通り、サーバーの公開鍵を厳密にチェックするかを制御します。指定できる値は次の通りです。

yes
known_hostsにサーバーの公開鍵を自動的に追加しない。サーバーの公開鍵が変更されていたら接続は拒絶される。
accept-new
新しい(未知の)サーバーへの接続なら、known_hostsにサーバーの公開鍵を自動的に追加する。サーバーの公開鍵が変更されていたら接続は拒絶される。
no または off
新しい(未知の)サーバーへの接続なら、known_hostsにサーバーの公開鍵を自動的に追加する。いくつかの条件のもと、公開鍵が変更されたサーバーのへの接続を続行します。
ask(デフォルト)
yesで回答してユーザーがサーバーの公開鍵を受け入れると、known_hostsにサーバーの公開鍵を追加する。サーバーの公開鍵が変更されていたら接続は拒絶される。

この説明から分かる通り「accept-new」または「no か off」を指定すると、ユーザーに確認を求めないでサーバーの公開鍵を自動的に受け入れます。そして公開鍵をknown_hostsに追加します。

そのため、問い合わせのメッセージは表示されなくなります。

「yes」を指定してもメッセージは表示されなくなりますが、known_hostsをチェックしてサーバーの公開鍵が登録されていなければ接続に失敗します。未知のサーバーへの接続はknown_hostsに登録がないので必ず失敗します。

「accept-new」または「no か off」の違いは、known_hostsへ自動的に追加した後の動作です。

「accept-new」はサーバーの公開鍵が変更された場合、接続は拒絶されますが、「no か off」は一定の条件のもと接続を続行します(ただ、条件は調べてみてもわかりませんでした。)。

したがって、未知のサーバーへ接続する時にメッセージを抑止するには、StrictHostKeyCheckingに「accept-new」を指定するのが最もふさわしいでしょう。

$ ssh -o StrictHostKeyChecking=accept-new foo.example.com

なお本来、StrictHostKeyCheckingはSSHクライアントの設定ファイルに記載するパラメータです。そのためクライアントの設定ファイルに記載すれば、接続ごとに指定するが必要がなくなります。

「-o」は設定ファイルに記載できるパラメータをコマンドラインに指定するためのオプションです。

サーバーの公開鍵が変更されて接続できないときの対処法

既知のサーバー(つまりknown_hostsに公開鍵が登録されているサーバー)へ接続した時に、次のメッセージが表示されて接続できないことがあります。

これはサーバーの送ってきた公開鍵が、known_hostsに記載された公開鍵と違っているからです。同じホスト名やIPアドレスで新しくサーバーを建て直した時などに起こります。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

この場合、known_hostsに記載されている対象サーバーの行を削除して対処するのが一般的です。viで直接対象の行を削除してもいいですが、次のようにssh-keygenコマンドを使うのが簡単です。

$ ssh-keygen -R foo.example.com

これはknown_hostsファイルから、foo.example.comの公開鍵の登録をすべて削除します。

これでfoo.example.comは未知のサーバーとなったので、前述したような方法で接続できるようになります。

これ以外の方法として、上記のメッセージを出力させないで接続する方法もあります。それには次のようにします。

$ ssh -o StrictHostKeyChecking=accept-new -o UserKnownHostsFile=/dev/null foo.example.com

デフォルトでサーバーの公開鍵はknown_hostsでチェックされます。

UserKnownHostsFileはデフォルトのknown_hostsの代わりに使うファイルを指定するためのオプションです。

これに指定されている「/dev/null」はヌルデバイスと呼ばれる特殊なファイルです。このファイルから読み込んでも何も読み込まれません。

したがって、サーバーの公開鍵は何も登録されていないものとして処理されますので、未知のサーバーへの接続になります。

「StrictHostKeyChecking=accept-new」も指定されているので、確認メッセージも表示されません。

そして、サーバーの公開鍵情報はヌルデバイス(/dev/null)に書き込まれますが、ヌルデバイスはそれを黙って捨ててしまいます。

このようにして何もメッセージが表示されることなく接続できるわけです。

まとめ

表示されるメッセージはサーバーの詐称を防止するためのセキュリティ機能です。ここで紹介した方法を使う場合は、理解した上で実施しましょう。

サーバーの公開鍵が変更された場合の方法も少しトリッキーな方法なので、もっと他に方法がないか調べましたが見つかりませんでした。また、機会があったら調べてみたいと思います。

-Linuxコマンド
-

Copyright© アナグマのモノローグ , 2022 All Rights Reserved Powered by STINGER.