「known_hostsに正しいホストキーを追加する」/ホスト名ごとに複数のsshホストキーを追加しますか?


147

私が制御するコンピューターに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")の言語は、古いホストキーを削除せずに正しいホストキーを追加する方法があることを示唆しています。

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

これは可能ですか、またはエラーメッセージは非常に誤解を招くだけですか?


9
これは、エラーを生成しているホストキーです。ホストには1つのキーのみが必要です。これは、クライアントキーまたはユーザーキーとは関係ありません。異なるホスト間で浮動するIPアドレスが1つありますか?
デビッドシュワルツ

4
私の場合、いくつかのことをいじりながら、近い将来に2つのキーを頻繁に切り替えることを知っています。これは、複数のホストを使用する1つのIP状況でも役立つと思われます。主に、特定の実用的なアプリケーションとは別に、これが自分の教育で可能かどうかを知りたいだけです。
サミュエルエドウィン区

回答:


148
  1. サーバーのrsaキーを取得しserver_ipます。サーバーのIPアドレスは192.168.2.1次のとおりです。

    $ 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)
    

12
これはうまくいきました!しかし、私は「HashKnownHosts」を使用しているため、エントリは少しずれているように見えました。幸いなことに、ssh_config(5)はssh-keygen(1)を指し示し、「ssh-keygen -H」を使用してハッシュされていないエントリをハッシュできることを説明しました。ありがとうございました!
サミュエルエドウィン区

2
これは「機能します」が、キーを検証していないため、mitm攻撃に対して脆弱です...
JasperWallace

3
@JasperWallaceは、最初のステップは、(例えば、使用するローカルホスト用)の安全な接続を介して行われている限り、それはかなり安全であるべきで、私は思う
ONY

3
サーバーからすべてのキータイプを収集する方法はありますか?RSA、DSA、ECDSA、RSA1などであるかどうか分からない場合があります。
Sopalajo de Arrierez

3
@SopalajodeArrierezは、同じマンページでもタイプをコンマで区切ることができると言っているので、そうしますssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip-しかし、キーrsa1dsaキーを見つける唯一の理由は、アップグレード/再構成が必要なサーバーを識別することです
-kbolino

94

以下を使用して、known_hostsからエントリを削除します。

ssh-keygen -R *ip_address_or_hostname*

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

manページから:

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


11
「古いホストキーを削除せずに新しいホストキーを追加する方法。」
サミュエルエドウィン区

4
これが最良の解決策です!
トーマスデコー

8
これはどのように19票を持っていますか?尋ねられた質問に答えることには近づきません
。– Molomby

2
「git ssh update host key自動的に」をグーグルで検索すると、あなたの質問が2番目に出てきます。この答えは私が探していたものです。正確に私が望むもので新しい質問を開くと、重複して閉じられる場合があります。
ジェイソンゴーマート

ホスト名も機能する
-damluar

18

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

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

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

ssh name@computer

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

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

編集 2015/06

さらに簡単に(エントリが識別可能である限り、通常はホスト名/ IPアドレスから特定の場所を参照するエラーメッセージとは別に)追加する必要があります。

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

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

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

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



それはメルドです:) apt-get / yumインストール名は単にメルドです
マーク

cp、mv、ssh、cat〜/ .ssh / known_hosts.bak〜/ .ssh / known_hosts> tmpの代わりに、うまく機能するあなたの提案の変形を行いました。mv tmp〜/ .ssh / known_hosts
ピーターNルイス

6

ラズベリーパイにも同じ問題があり、いくつかの異なるシステム(アームバイナリ、プロジェクト、xbmcなどをコンパイルするための開発システム)で起動し、同じ問題に遭遇しました。ローカルネットワークで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アドレスであっても、一意のホスト名ごとに異なるエントリが取得されます。

新しいシステムを使用するたびにホストファイルに名前を追加することにうんざりしたため、次のようなIPアドレスの先頭にゼロを使用することで、さらに怠lazな方法を思い付きました。

$ ssh pi@10.10.10.110
$ ssh pi@010.10.10.110
$ ssh pi@10.010.10.110

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


1
OpenSSHの人々は私に賢明でした。この抜け穴は、最近のバージョンでは機能しなくなりました。
マイク

CheckHostIP noin ~/.ssh/configを使用して、引き続き抜け穴を使用できます。ここでエイリアスを定義することもできるので、この3つのホスト名だけをいじって/etc/hosts定義する必要はありませんCheckHostIP no
GnP

3

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

Host *
    UpdateHostKeys yes

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


これは、最も有用な答えです。ホストキーが既に変更されている場合、元の質問を解決する方法は明示的に提供されませんが、他のすべての回答は新しいホストキーを検証しないため安全ではありません。このオプションを使用すると、新しいホストキーへの安全なロールオーバーを実行できます。
ヤープEldering

1

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

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

ssh -o StrictHostKeyChecking=no user@host

あなた~/.profileまたはあなたの類似物のエイリアスに入れることができます。

alias hc=ssh -o StrictHostKeyChecking=no user@host

この場合、StrictHostKeyCheckingは役に立たないようです。明らかに、ホストがknown_hostsファイルにない場合の動作のみを指定します。ここで言及:gossamer-threads.com/lists/openssh/dev/45349#45349
サミュエルエドウィン区

ここで動作します。警告が表示されますが、ログインは続行されます。
スヴェン

それは変だ。パスワード認証を使用していますか?OpenSSHを使用していますか?
サミュエルエドウィン区

1

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

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

例えば

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

次に、スペース、バックスペースcntl + xおよび 'y'を押して、新しいバッファー(ファイル)を保存します。その悪い習慣ですが、ローカルネットワークの外で定期的にsshしていなければ大丈夫です(例:uniまたは作業サーバー)

セキュリティで保護されたローカルネットワークでは、中間の攻撃を受けることができないため、これは安全です。

理解できるコードを使用する方が常に良いです!


4
known_hosts毎回ファイル全体を消去すると、sshによって提供されるセキュリティのほとんどが無効になります。
カスペルド14年

確かに、安全な内部ネットワークでは、コードを不注意にコピーするよりも、コードを理解してセキュリティを回避する方が安全だと思います。外部ネットワークでは、状況は異なります。
アーロン14年

-1

非常に多くの回答がありますが、厳密なホストチェックを完全にオフにするか、無関係なホスト情報を破棄するか、または予期しないときに後でユーザーが対話的にキーを受け入れるように強制することにより、保護を放棄します。

厳密なホストチェックをオンにしたまま、変更が予想されるときに制御された方法でキーを更新できるようにする簡単な方法を次に示します。

  • 古いキーを削除して、1つのコマンドで更新する

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • 使用する場合は、IPアドレスまたは他のホスト名で繰り返します。

このアプローチの利点は、サーバーのキーを1回だけ再生成することです。ssh-keygenのほとんどのバージョンは、削除しようとするサーバーが既知のhostsファイルに存在しない場合、エラーを返さないようです。これが問題の場合は、2つのコマンドを順番に使用してください。

また、このアプローチは接続を検証し、sshコマンドのログに素敵なメッセージを出力します(ログインして、ホストキーを更新し更新されたSSHホストキーを出力してすぐに終了します)。

ssh-keygenのバージョンがゼロ以外の終了コードを返し、接続に関係なく、または以前の接続でエラーなしでこれを処理する場合は、ssh-keygenコマンドのエラーを無視して、2つのコマンドを順番に使用します。

この手法を使用する場合、sshコマンドを変更したり、その1つのsshコマンド中を除き、ホストチェックをオフにする必要はありません。上記のsshコマンドがエラーなしで実行されている限り、競合または新しいキーを明示的に受け入れる必要なく、将来のsshセッションが動作することを確認できます。


-3

同じ問題がありました。

私がsudo nano /home/user/.ssh/ host_allowしたことは、キーを消去することだけでした。

sshでサーバーに戻ると、新しいキーが追加されました。


2
これがなぜ起こるかについてのいくつかの情報は、答えに役立ちます。
ドリューコーリー

-4

問題のある行を削除するには、sedコマンドを使用します

OUTPUT: as show in above example
Offending key in /home/user/.ssh/known_hosts:86

既知のホストで説明されているように、行86を削除します。

CODE: 
sed -i '86d' /home/user/.ssh/known_hosts

次回sshを使用してアクセスすると、システムは自動的に新しいキーを追加します。

sshの新しいバージョン

つかいます:

ssh-keygen -R <hostname|ip address>

ホスト名エントリを削除し、古い.known_hostもののバックアップを取得しますknown_hosts.old


4
「しかし、私が望むのは、sshに古いキーと新しいキーの両方を受け入れさせることです。」あなたの答えはこれを行いません。
サミュエルエドウィン区
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.