web-dev-qa-db-ja.com

「known_hostsに正しいホストキーを追加」/ホスト名ごとに複数のSSHホストキー?

私が制御するコンピューターにsshしようとすると、おなじみのメッセージが表示されます。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE Host IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a Host key has just been changed.
The fingerprint for the RSA key sent by the remote Host is
[...].
Please contact your system administrator.
Add correct Host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA Host key for [...] has changed and you have requested strict checking.
Host key verification failed.

私は確かに鍵を変更しました。そして私はこの問題を解決する方法はknown_hostsファイルから古いキーを削除することであると言っている数十の投稿を読みました。

しかし、私が望むのは、sshに古いキーと新しいキーの両方を受け入れさせることです。エラーメッセージの言語( "Add correct Host key")は、古いキーを削除せずに正しいホストキーを追加する方法がいくつかあることを示しています。

古いキーを削除せずに新しいホストキーを追加する方法を理解できませんでした。

これは可能ですか、それともエラーメッセージは非常に誤解を招くものですか?

159
  1. サーバーのrsaキーを取得します。ここで、server_ipは、192.168.2.1などのサーバーのIPアドレスです。

    $ ssh-keyscan -t rsa server_ip
    

    応答の例:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. クライアントで、応答行server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...全体をコピーし、このキーを~/.ssh/known_hostsファイルの最後に追加します。

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key, and/or the very bottom of the `known_hosts` file)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... (line you're adding, copied and pasted from above)
    
153
quanta

次のコマンドを使用して、known_hostsからそのエントリを削除します。

ssh-keygen -R *ip_address_or_hostname*

これにより、問題のあるIPまたはホスト名がknown_hostsファイルから削除され、接続が再試行されます。

マニュアルページから:

-R hostname
known_hostsファイルからホスト名に属するすべてのキーを削除します。このオプションは、ハッシュされたホストを削除するのに役立ちます(上記の-Hオプションを参照)。

101
Luis Abarca

非常に簡単な方法は次のとおりです。

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak

次に、known_hostsを編集して元のキーをクリアし、次を使用してホストにSSHで接続します。

ssh name@computer

新しいキーが自動的に追加されます。次に、2つのファイルを比較します。 meldなどのプログラムは、2つのファイルを比較する良い方法です。次に、ファイルをマージして、known_hostsに両方のキーを含めます

2つのキーを保持するための私の「理由」は、宛先システムがマルチブートであることです。インストール間でキーを同期する方法はあえてあっても、複数のキーを許可する方が簡単なようです。

[〜#〜]編集[〜#〜] 2015/06

ここでもう一度見直すと、[エントリが識別可能である限り、通常はホスト名/ IPアドレスから特定の場所を参照するエラーメッセージを除いて]、さらに簡単な方法がわかります。

  1. 既知のホストを編集して、既知のホストの「古い」エントリの先頭に一時的に#を追加します
  2. [sshをホストに]接続し、プロンプトに同意して新しいキーを「自動的に」追加します
  3. 次に、known_hostsを再編集して#を削除します

次のようなオプションHostKeyAliasもあります

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

次に、sshクライアントがエイリアスの下に新しいキーを追加した後、known_hostsを編集して、エイリアスの「実際の」ホスト名/ IPアドレスを置き換えるか、エイリアスオプションを使用してそのホストのインカネーションに接続します。

19
Mark

いくつかの異なるシステム(armバイナリ、プロジェクト、xbmcなどをコンパイルするための開発システム)で起動するRaspberry Piで同じ問題が発生し、同じ問題が発生しました。ローカルネットワークでDHCPを使用し、MACアドレスが同じだったため、私のルーターは常に同じIPを再利用しました。私は私のhostsファイルで異なるドメイン名を使用することでそれを解決しました:

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc

Known_hostsファイルはホスト名別にフィンガープリントを保存するため、同じIPアドレスであっても、一意のホスト名ごとに異なるエントリを取得します。

新しいシステムを使用するたびにhostsファイルに名前を追加するのにうんざりしていたので、次のようなIPアドレスに先行ゼロを使用することでさらに面倒な方法を考え出しました。

$ ssh [email protected]
$ ssh [email protected]
$ ssh [email protected]

(非正規化)IPアドレスの各バリエーションは、known_hostsに独自のエントリを取得します。

6
Mike

クライアントとサーバーの両方にOpenSSH 6.8以降がインストールされている場合は、UpdateHostKeys yesまたはssh_config~/.ssh/configオプションを使用できます。例えば:

Host *
    UpdateHostKeys yes

これにより、SSHはサーバーが持つすべてのホストキーをknown_hostsに保存し、サーバーが1つのホストキーを変更または削除すると、known_hostsでもキーが変更または削除されます。

3
Mikaela

あなたがのみローカルネットワークにSSHで接続する場合...

簡単な解決策は、古いキーファイルをワイプして、空のファイルと置き換えることです。これにより、すべての接続を新しいキーで再認証できます。ローカルネットワーク外のサイト用にsshキーを保存している場合は、そのサーバーに初めて接続したときと同じように、最初の接続が安全であることを確認する必要があります。

例えば

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

次に、スペースを押し、cntl + xと 'y'を押して、新しいバッファ(ファイル)を保存します。その悪い習慣ですが、ローカルネットワーク(たとえば、ユニサーバーまたはワークサーバー)の外で定期的にsshを実行していなくても問題ありません。

安全なローカルネットワークでは、中間者攻撃を行うことができないため、これは安全です。

あなたが理解しているコードを使う方が常に良いです!

1
Aaron

2つのキーを使用する理由はわかりませんが、~/.ssh/known_hostsファイルに複数の有効なキーを追加することはできますが、手動で行う必要があります。

別の解決策は、この特定のホストにStrictHostKeyChecking=noオプションを使用することです。

ssh -o StrictHostKeyChecking=no user@Host

~/.profileまたは類似のエイリアスで使用できます。

alias hc=ssh -o StrictHostKeyChecking=no user@Host
1
Sven