known_hostsの役割とは?SSH接続先を検証する仕組みと管理方法

known_hostsの役割とは?

known_hostsを理解してSSHのなりすまし対策を学ぼう

SSHを利用してLinuxサーバへ接続していると、初回接続時に「Are you sure you want to continue connecting?」というメッセージが表示された経験がある方も多いでしょう。

また、サーバを再構築した後などに「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」という警告を見たことがある方もいるかもしれません。

これらはすべてknown_hostsというファイルに関係しています。

SSHでは公開鍵認証によって利用者を認証するだけでなく、接続先サーバが本物であることも確認しています。

その仕組みを実現しているのがknown_hostsです。

本記事ではknown_hostsの役割や仕組み、実務での管理方法について詳しく解説します。

known_hostsとは何か

known_hostsとは、SSHクライアントが接続先サーバのホスト鍵情報を保存するファイルです。

SSH接続時にサーバの正当性を確認するために利用されます。

通常は以下の場所に保存されています。

~/.ssh/known_hosts

例えばstudentユーザーの場合です。
/home/student/.ssh/known_hosts

WindowsのOpenSSH Clientでは以下に保存されます。
C:\Users\ユーザー名\.ssh\known_hosts

なぜknown_hostsが必要なのか

SSHは暗号化通信を提供しますが、暗号化だけでは十分ではありません。

例えば攻撃者が偽のSSHサーバを立ち上げた場合を考えてみましょう。

利用者がその偽サーバへ接続すると、パスワードや認証情報を盗まれる可能性があります。

これを中間者攻撃(Man in the Middle Attack)と呼びます。

known_hostsは接続先サーバの公開鍵を記録することで、このような攻撃を検知する仕組みです。

ホスト鍵とは何か

SSHサーバにはホスト鍵と呼ばれる鍵ペアがあります。

一般的には以下の場所に保存されています。

/etc/ssh/

例です。
ssh_host_ed25519_key
ssh_host_ed25519_key.pub

この鍵はサーバ自身を識別するために利用されます。

ユーザー認証で利用する公開鍵とは別物です。

初回接続時に何が起きているのか

SSHで初めて接続するサーバへアクセスすると、以下のようなメッセージが表示されます。

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

これは接続先サーバのホスト鍵を確認している状態です。

利用者が「yes」を入力すると、そのホスト鍵がknown_hostsへ保存されます。

known_hostsへ保存される内容

実際にファイルを確認してみましょう。

$ cat ~/.ssh/known_hosts

表示例です。
192.168.60.101 ssh-ed25519 AAAAC3Nza...

保存される主な情報は以下です。

  • ホスト名
  • IPアドレス
  • ホスト公開鍵

SSHクライアントは次回以降この情報を利用して接続先を検証します。

2回目以降の接続

再度接続する場合、SSHクライアントは以下を比較します。

  • known_hostsに保存された公開鍵
  • サーバから送られてきた公開鍵

一致すれば接続を継続します。

これにより接続先サーバが本物であることを確認できます。

ホスト鍵が変わった場合

サーバ再構築やOS再インストールを行うとホスト鍵が変わることがあります。

その場合は以下の警告が表示されます。

ARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

これはknown_hostsに保存された情報と異なるためです。

非常に重要な警告なので無視してはいけません。

なぜ危険なのか

この警告は中間者攻撃でも発生します。

つまり本当にサーバを再構築したのか、それとも攻撃者が偽サーバを用意しているのか判断できないためです。

実務では必ず原因を確認してから対応します。

known_hostsから削除する方法

ホスト鍵変更が正当な理由によるものであれば、古い情報を削除します。

推奨される方法です。

$ ssh-keygen -R 192.168.60.101

実行後に再接続すると新しいホスト鍵が登録されます。

手動で削除する方法

直接編集することも可能です。

$ vi ~/.ssh/known_hosts

該当行を削除して保存します。

ただし管理ミスを防ぐため、ssh-keygen -Rの利用が推奨されます。

フィンガープリントとは

ホスト鍵にはフィンガープリントと呼ばれる識別情報があります。

確認方法です。

$ ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

例です。
256 SHA256:xxxxxxxxxxxx

サーバ管理者同士で確認する際に利用されます。

StrictHostKeyCheckingとは

SSHにはホスト鍵確認の動作を制御する設定があります。

StrictHostKeyChecking yes

有効な場合は未登録サーバへの接続時に確認が行われます。

一方で以下の設定もあります。

StrictHostKeyChecking no

自動化環境で利用されることがありますが、セキュリティリスクがあるため注意が必要です。

known_hostsのハッシュ化

最近のOpenSSHではホスト名をハッシュ化できます。

設定例です。

HashKnownHosts yes

known_hostsを確認するとホスト名が見えなくなります。

情報漏洩対策として利用されます。

実務での運用例

企業環境では以下のような運用が一般的です。

  • 初回接続時にフィンガープリント確認
  • サーバ再構築時にknown_hosts更新
  • 自動化環境では事前登録
  • 監査時にホスト鍵管理確認

特に重要サーバでは慎重な運用が求められます。

学習環境でよくあるトラブル

VirtualBoxやクラウド演習環境では以下がよく発生します。

  • サーバ再インストール
  • スナップショット復元
  • IPアドレス再利用
  • 仮想マシン複製

その結果、ホスト鍵変更警告が表示されることがあります。

原因を確認してからknown_hostsを更新しましょう。

ユーザー認証との違い

SSHには2種類の認証があります。

認証対象利用ファイル
サーバ認証known_hosts
ユーザー認証authorized_keys

この違いは非常に重要です。

known_hostsはサーバを確認し、authorized_keysは利用者を確認します。

まとめ

known_hostsはSSH接続先サーバのホスト鍵を保存し、接続先が本物であることを確認するための重要なファイルです。

SSHのセキュリティを支える仕組みの一つであり、中間者攻撃やなりすまし攻撃の検知に役立っています。

サーバ再構築時にはホスト鍵変更警告が表示されることがありますが、必ず原因を確認してから更新することが重要です。

authorized_keysと並んでSSH運用では頻繁に登場するファイルですので、その役割をしっかり理解しておきましょう。