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

目次
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 yesknown_hostsを確認するとホスト名が見えなくなります。
情報漏洩対策として利用されます。
実務での運用例
企業環境では以下のような運用が一般的です。
- 初回接続時にフィンガープリント確認
- サーバ再構築時にknown_hosts更新
- 自動化環境では事前登録
- 監査時にホスト鍵管理確認
特に重要サーバでは慎重な運用が求められます。
学習環境でよくあるトラブル
VirtualBoxやクラウド演習環境では以下がよく発生します。
- サーバ再インストール
- スナップショット復元
- IPアドレス再利用
- 仮想マシン複製
その結果、ホスト鍵変更警告が表示されることがあります。
原因を確認してからknown_hostsを更新しましょう。
ユーザー認証との違い
SSHには2種類の認証があります。
| 認証対象 | 利用ファイル |
|---|---|
| サーバ認証 | known_hosts |
| ユーザー認証 | authorized_keys |
この違いは非常に重要です。
known_hostsはサーバを確認し、authorized_keysは利用者を確認します。
まとめ
known_hostsはSSH接続先サーバのホスト鍵を保存し、接続先が本物であることを確認するための重要なファイルです。
SSHのセキュリティを支える仕組みの一つであり、中間者攻撃やなりすまし攻撃の検知に役立っています。
サーバ再構築時にはホスト鍵変更警告が表示されることがありますが、必ず原因を確認してから更新することが重要です。
authorized_keysと並んでSSH運用では頻繁に登場するファイルですので、その役割をしっかり理解しておきましょう。





