複数のホストが同じIPおよびDNS名を共有している場合、known_hostsを編集するにはどうすればよいですか?


27

デュアルブートOS X / Linuxコンピューターであるコンピューターに定期的にsshします。2つのOSインスタンスは同じホストキーを共有しないため、同じIPとDNSを共有する2つのホストと見なすことができます。IPが192.168.0.9であり、名前がでhostnameあり、hostname.domainname

私の知る限り、2つのホストに接続できるようにするための解決策は、両方を~/.ssh/know_hostsファイルに追加することです。(ファイルはハッシュ化されているのでしかし、それは簡単なことは、口で言うと、おそらくホストごとに複数のエントリを持っています192.168.0.9hostnamehostname.domainname)。結果として、私は次の警告があります

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

known_hostsハッシュを保持しながら、ファイルを編集する簡単な方法はありますか。たとえば、特定のホスト名に対応する行を見つけるにはどうすればよいですか?既知のホストのハッシュを生成するにはどうすればよいですか?

理想的なソリューションは、私はSSHでこのコンピュータにシームレスに接続できるようになり、私はそれを呼び出すかどうかに関係なく192.168.0.9hostnamehostname.domainname、またそれは、その、Linuxのホスト鍵またはそのOSXのホスト鍵を使用している場合。ただし、実際の中間者攻撃がある場合、つまり、これら2つ以外のキーが使用されている場合は、警告を受け取ります。


何をしたいですか?何のために編集しますか?
リューク

@Rhyuk:OSXと、IPアドレス、ホスト名、およびhostname.domainnameのLinuxホストキーの両方を有効として認識できるように編集します。
フレデリックグロシャン

@Rhyuk:質問を編集しました。今より明確ですか?
フレデリックグロシャン

2
両方のインストールで同じキーを使用することを単に検討したことがありますか?
ゾレダチェ

3
1つのIPアドレスを使用して(それぞれ個別のSSHホストキーを持つ)複数のエンティティにアクセスし、それらのホストキーのみがSSHクライアントから見えるものであるという厳密な制御を維持するのが妥当な場合がいくつかあります。たとえば、1つの共有IPアドレスを使用してユニットのクラスターにアクセスするが、(何らかの理由で)クライアントに表示されるSSHホストキーが現在アクティブなクラスターユニットに応じて変化する一部の高可用性セットアップ。別のケースとして、複数のSSHホストがNATファイアウォールの背後にあり、外部からアクセスされる場合、それらはすべて同じIPを持っているように見えます。
-IllvilJa

回答:


12

ここで最も簡単な解決策は、LinuxとOS Xに同じホストキーを使用することです。つまり、1つの/etc/ssh/ssh_host_*_key*ファイルセットを選択して、他のOSにコピーします。次に、起動したOSに関係なく、同じホストキーがSSHクライアントに提示され、SSHクライアントは賢明ではなくなります。


クライアントバージョンを好むが、見つからない場合はこれを試す。ところで、ファイルのOSX(非標準)ローカリゼーションは/private/etc/ssh_host*でなく、/etc/ssh/ssh_host*です。
フレデリックグロシャン

あるマシンから別のマシン(2台のLinuxマシン)にファイルをコピーすることはうまくいきませんでした。ファイルの内容は同じでしたが、ハッシュはそうではなかったので、まだ問題が発生していました(おそらく変更時間ですか?)。以下の解決策ははるかに優れています。
スタヴ

sshd起動時に一度ホストキーをロードするため、ほとんどの場合再起動する必要がありますsshd。それを答えに追加します。他のソリューションの方が優れているかどうかは、状況によって異なります。この方法の主な長所は、1回限りのセットアップが必要であり、複数のSSHクライアント実装で動作する可能性が高いことです。
jjlin

奇妙なことに、比較的最近のOpenSSH 7.4p1 sshdは、新しい接続ごとにホストキーをロードするようです。たぶんそれは長い間このようになっていて、ホストキーは他のsshd設定のように扱われていると思いました。とにかく、それはあなたの問題かもしれませんし、そうでないかもしれません。
jjlin

同じVRRPアドレスを共有するクラスター内の2つのホストに対してこれを行うのは悪い考えでしょうか?フェイルオーバーでは、応答するホストが異なります。警告が出ないようにしたいです。
コリン 'ハート

26

@Izzyが上記のコメントで示唆したように、sshは問題のある行を通知し、その行を削除(別の場所に保存)して新しいキーを受け入れ、削除された行をコピーして戻すと、同じ行に対して2つのキーが表示されますホスト、およびsshはいずれかを受け入れます。

(またssh-keygen -H -F <hostname>、そのホスト名に一致するknown_hostsファイルの行を見つけるために使用できます。削除された行をコピーしてからこれを実行すると、2つのエントリがリストされます。)

PuTTYに同じことをさせる方法を知っている人がいれば、それについて聞いてみたいと思います。


4
実際、Linuxクライアントを使用している場合は、問題のある行を削除する必要さえありません。先頭にハッシュ( '#')文字を付けてコメントアウトするだけです。次に、新しいキーを受け入れたら、known_hostsファイルを編集して、古いキーの行のコメントを解除するだけです。しかし、はい、これはPuttyでも同様に役立ちます。
IllvilJa

1
同じ名前で、IPアドレスとホストキーが異なる2つのホストがある場合、この回避策も機能します。コメントアウト(または一時的に削除)すると、そのホストの両方の行(IPアドレスに基づく行とホストに基づく行)名前)、まだ知られていないホストに接続し、コメントアウトまたは削除された行を再度追加します。
カイペツケ

10

私はあなたが達成したいことであなたを助けるかもしれないこれを見つけました。

ソース:https : //stackoverflow.com/questions/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

次のように、.sshディレクトリに構成ファイルを作成します。

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

以下の説明(man ssh_configから)

CheckHostIP

このフラグが「yes」に設定されている場合、ssh(1)は、known_hostsファイル内のホストIPアドレスをさらにチェックします。これにより、sshはDNSスプーフィングによりホストキーが変更されたかどうかを検出できます。オプションが「no」に設定されている場合、チェックは実行されません。デフォルトは「yes」です。

HostKeyAlias

ホストキーデータベースファイルでホストキーを検索または保存するときに、実際のホスト名の代わりに使用するエイリアスを指定します。このオプションは、SSH接続のトンネリングや、単一のホストで実行されている複数のサーバーに役立ちます。

ユーザー名とポートの行を使用すると、コマンドラインでこれらのオプションを指定する必要がなくなるため、次のように使用できます。

% ssh server1
% ssh server2

私はこの記事を見ましたが、それは私の場合には対応していません:2つのサーバーは、私の場合ではなく、記事のポート番号によって区別されます。さらに、私は中に塩漬けハッシュによってもたらされるセキュリティの余分なレイヤ維持したいknown_hostsとしCheckHostIP
フレデリックグロシャン

1
@FrédéricGrosshans、チェック済みです。別のポートを持つ必要はなく、HashKnownHostsオプションはHostKeyAliasで正常に機能します。
ゾレダチェ

これのマイナス面は、私が間違っていない限り、これはクライアントごとに構成されますが、受け入れられた答えは受け入れているsshサーバーでのみ構成されます。
FreeSoftwareServers

2

問題を解決する最も簡単な方法は、各ホストに独自の/異なるIPアドレスを与えることです。(プライベート)ネットとIPv4で253個のアドレスを使用できるため、大した問題にはなりません。固定IPを提供します(DHCPサーバーがネットワークカードのMACアドレスに基づいてマシンを識別し、両方が同じアドレスを取得するため)。セキュリティ対策を維持したい場合、他の解決策は見当たりません(その小さな「快適さ」のために私はそれを落とさないでしょう)。


実際、IPアドレスは192.168.0.xxプライベートではなく、プライベートでもありません。これは、私の大学から与えられた「実際の」IPv4アドレスであり、自由に変更することはできません。
フレデリックグロシャン

Wikipediaで確認すると、192.168.0.0-192.168.255.255(この範囲に該当する192.168.0.9を指定した質問)が「プライベートIPv4アドレススペース」に属していることがわかります。したがって、「プライベート」とは、それを「所有」することではなく、IETFの仕様を指すものです。あなたの質問では、IPを変更できないことを示していませんでした、申し訳ありませんが、与えられた入力で、私の答えはぴったりでした。
イジー

言い回しの悪い質問で申し訳ありません。私は下票しませんでした。
フレデリックグロ

問題はなく、私に知らせてくれたtnx-ダウン票の落胆を減らします。しかし、別のアイデア:known_hostsファイルがどこからホスト名を取得するのか、DNSをリバースするのか、またはクライアントから提供されるのかはわかりません。「ホスト」のいずれかの名前を変更して、別のホスト名が表示されるようにすることができます。または、両方のホストキーを追加するには:sshは、known_hostsファイルの「問題のある行」を通知します(#1が含まれている場合、#2で接続します)。そのため、その行を別のファイルにコピーし、known_hostsから削除し、#2に接続してその行を追加し、削除した行を元に戻すことができます。動作するかどうかはわかりませんが、試してみてください。
イジー

2

同じIPを共有するさまざまなVPSボックスに接続するとき、それぞれに異なるSSHポート(20022,30022な​​ど)があり、異なるキーを持つ既知のホストとして登録されているため、この問題は発生しません。

それはあなたのための回避策でしょうか?


こんにちは@Pyheme、スーパーユーザーへようこそ!この質問はほぼ4年前のものです。それに答えても何も問題はありませんが、応答が得られない可能性があることに留意してください。
ヒューボット

私はもうOS Xマシンを持っていませんが、あなたの答えは他の誰かに役立つかもしれません。これは、スタック交換の全体のポイントだ
フレデリック・Grosshans

@Hewbot ...確かに、私は今それを見る。理由がわからない、最近の質問のリストに
載っていた...-Pyheme

1

問題を処理するいくつかの方法を説明する別の記事

2番目の方法は、2つのopenSSHパラメーターを使用します:StrictHostKeyCheckin、およびUserKnownHostsFile。このメソッドは、空のknown_hostsファイルを使用するように設定することでSSHをconfirmし、リモートホストIDキーの確認を求めないようにします。


このペーパーでは、キーチェックの禁止について説明します。私は鍵チェックを維持したい、と私はそれぞれの時間は、それを禁止する必要はありませんhostnameLinutまたはOSXに再起動される
フレデリック・Grosshans

1
スーパーユーザーへようこそ!これは理論的には質問に答える可能性がありますが、答えの重要な部分をここに含め、参照用のリンクを提供することが望ましいでしょう。私は短い部分を含めましたが、それはあなたが意図したものではないかもしれません...
タマラWijsman

1

厳密なホストキーチェックを維持したいので、異なるknown_hostsファイルを使用するようにします。これを行うには、次のように~/.ssh/configファイル(または、/etc/ssh/ssh_config複数のローカルユーザーアカウントで作業する必要がある場合はファイル)をセットアップします。

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

$REALHOSTNAMEもちろん、実際のホスト名またはIPアドレスに置き換えます。(IPアドレスに解決する「ホスト名」の後に何かを選択する限り、どちらを選択してもかまいませんが、一般的な原則に基づいて、IPアドレスよりもホスト名を優先して使用します。)

そうするとssh myserver.linuxssh myserver.osx異なるホストキーを持つことができますが、それでもチェックを取得できます。Linuxが起動していて、OS Xと入力した場合(またはその逆)、警告が表示されます(これは望ましい影響だと思います)。

この問題が発生した場合は、メインknown_hostsファイルにいずれかと一致しない何かが完全に間違っていることを確認するため、$REALHOSTNAME代わりに入力するとmyserver.osx警告が表示されます。:-)私はそれを

<ip-address-of-github.com> $REALHOSTNAME

私の中で/etc/hostsは、やってssh $REALHOSTNAME、新しいキーを受け入れ、そのエントリを取り出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.