環境
Ubuntu20.4
はじめに
~/.sshの中に、に、authorized_keysとknown_hostsの2つのファイルが存在しています。この2つのファイルの役割について書いてみました。
因みにこの2つのファイルが保存されている場所は、~/.sshであって、ホスト認証で利用される鍵が保管されている、/etc/sshではありません。
解説
known_hostsとauthorized_keysは、共に、共通鍵が書き込まれています。秘密鍵ではありません。共にテキストファイルであるため、エディタで中身を参照することができます。1行に対し1つの公開鍵が登録されています。データが2行あれば、公開鍵が2件登録されていると判断することができます。
SSHでクライアントからサーバーに接続しにいくとき、ホスト認証と、ユーザー認証の2つの認証が行われます。ホスト認証とは、接続先が本当に正しいホストなのかを、確認するために行われる認証で、ユーザー認証とは、接続しようとしている人が、本当に、正しいユーザーなのかを確認するために行われる認証です。ホスト認証とユーザー認証は、共に、公開暗号方式で行われます。ホスト認証が先に行われ、次にユーザー認証が行われます。2つの認証が共に成功して、晴れて、SSH接続が確立されます。
SSH接続を始めて行うとき、前準備として、ssh-keygenコマンドを使って、公開鍵と秘密鍵のペア鍵を作成しますが、このときに作成する鍵は、ユーザー認証で使う鍵です。
ホスト認証で利用する鍵も、ssh-keygenコマンドで作成することはできますが、普通は作成することはありません。デフォルトでOSの中に既に入っています。大抵の場合、デフォルトで入っている鍵をそのまま使って、ホスト認証を行っています。よって、ホスト認証がどのように行われているのかは、あまり意識する必要がありませんでした。
ユーザー認証で用いられるペア鍵は、大抵、~/.sshに作りますが、ホスト認証で用いられるペア鍵は、/ect/sshの中に入っています。ホスト認証が行われるとき、サーバーは、/ect/sshの中にある公開鍵をクライアント側に送信します。送信された公開鍵は、クライアントの~/.ssh/know_hostsの中に書き込まれます。
公開鍵が書き込まれるときに、「書き込みますがよろしいですか。」といった、注意メッセージが必ず表示されます。注意メッセージが表示されるのは、始めてSSH接続が行われるときだけです。2回目以降の接続時には表示されません。ホスト認証では、~/.ssh/know_hostsに登録された公開鍵を使って暗号化を行い、サーバー側の、/ect/sshにある秘密鍵を使って復号化を行います。
ホスト認証が必要な理由は、なりすましを防止のためです。なりすましとは、自分が接続したい本当のサーバーではなく、誘導されて別のサーバーに接続してしまうことです。ホスト認証で失敗した場合、なりすましのサーバーに誘導された可能性があります。しかし、滅多にある話ではないとは思います。なりすましのサーバーには、本当のサーバーが持っている秘密鍵は持っていないため、公開鍵で暗号化したデータをなりすましサーバーの秘密鍵で復号化しようとして失敗したのです。
もし、本当のサーバーに接続したにも関わらず、ホスト認証で失敗するようなことがあれば、サーバー側でペア鍵が新しく作り変えられた可能性があります。そのようなときは、~/.ssh/know_hostsをエディタで開いて、古い公開鍵が登録されている行を1行削除して、新しい公開鍵をコピペすればOKです。ときどきありがちなトラブルシューティングの例です。
~/.ssh/know_hostsは、ホスト認証を行うために、クライアント側で作成されるのに対し、~/.ssh/authorized_keysはユーザー認証のときに作られます。ユーザー認証は、ホスト認証とは逆で、サーバー側で公開鍵を使って暗号化したデータを、クライアント側に送信し、クライアント側の秘密鍵を使って復号化する手順となります。サーバー側で保持している公開鍵を登録するファイルが、~/.ssh/authorized_keysです。
SSHサーバーは、公開鍵を登録するに従って、~/.ssh/authorized_keysのファイル容量は、どんどんと大きくなっていくが、SSHクライアントは、接続先のSSHサーバーが増えるに従い、~/.ssh/know_hostsの容量が増えていくことになります。SSHクライアントが、ローカルの~/.ssh/authorized_keysに公開鍵を追加することは、ほぼほぼないと思われます。自身の環境においても、~/.ssh/authorized_keysは、389byteであるのに対し、~/.ssh/know_hostsは1.1Kbyteあります。
まとめ
-
~/.ssh/know_hosts
ホスト認証で使われる公開鍵が、クライアント側で登録されています。 -
~/.ssh/authorized_keys
ユーザー認証で使われる公開鍵が、サーバー側で登録されています。