Bagaimana cara mengedit hosting yang dikenal saat beberapa host berbagi IP dan nama DNS yang sama?

29

Saya secara teratur ssh ke komputer yang merupakan komputer dual-boot OS X / Linux. Contoh dua OS tidak berbagi kunci host yang sama, sehingga mereka dapat dilihat sebagai dua host berbagi IP dan DNS yang sama. Katakanlah IP adalah 192.168.0.9, dan namanya adalah hostnamedanhostname.domainname

Sejauh yang saya mengerti, solusi untuk dapat terhubung ke dua host adalah menambahkan keduanya ke ~/.ssh/know_hostsfile. Namun, lebih mudah diucapkan daripada dilakukan, karena file tersebut hash, dan mungkin memiliki beberapa entri per host ( 192.168.0.9, hostname, hostname.domainname). Sebagai konsekuensinya, saya memiliki peringatan berikut

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

Apakah ada cara mudah untuk mengedit known_hostsfile, sambil menjaga hash. Sebagai contoh, bagaimana saya bisa menemukan garis yang sesuai dengan nama host yang diberikan? Bagaimana saya bisa menghasilkan hash untuk beberapa host yang dikenal?

Solusi yang ideal akan memungkinkan saya untuk terhubung ke komputer ini dengan ssh, tidak peduli apakah saya menyebutnya 192.168.0.9, hostnameatau hostname.domainname, apakah itu menggunakan Linux hostkey atau OSX hostkey-nya. Namun, saya masih ingin menerima peringatan jika ada orang yang benar-benar menyerang tengah, yaitu jika kunci lain dari keduanya digunakan.

Frédéric Grosshans
sumber
Apa yang ingin kamu lakukan? Edit untuk apa?
Rhyuk
@Rhyuk: Edit untuk dapat mengenali sebagai valid OSX dan kunci host linux untuk alamat IP, nama host dan nama host.domain nama.
Frédéric Grosshans
@Rhyuk: Saya sudah mengedit pertanyaan th. Apakah sekarang lebih jelas?
Frédéric Grosshans
2
Apakah Anda hanya mempertimbangkan untuk membuat kedua instalasi memiliki kunci yang sama?
Zoredache
3
Ada beberapa kasus ketika masuk akal untuk menggunakan satu alamat IP untuk mengakses beberapa entitas (masing-masing dengan kunci host SSH individu) dan masih mempertahankan kontrol ketat bahwa HANYA kunci host itu yang terlihat oleh klien SSH. Misalnya beberapa pengaturan ketersediaan tinggi di mana sekelompok unit diakses menggunakan satu alamat IP bersama tetapi di mana (untuk beberapa alasan) kunci host SSH dilihat oleh klien berubah tergantung pada unit cluster mana yang saat ini aktif. Kasus lain adalah ketika beberapa host SSH berada di belakang firewall NATed dan diakses dari luar, mereka semua tampaknya memiliki IP yang sama.
IllvilJa

Jawaban:

12

Solusi paling mudah di sini adalah hanya menggunakan kunci host yang sama untuk Linux dan OS X. Yaitu, pilih satu set /etc/ssh/ssh_host_*_key*file dan salin ke OS lain. Kemudian kunci host yang sama akan disajikan kepada klien SSH terlepas dari OS mana Anda telah boot, dan klien SSH tidak akan menjadi lebih bijaksana.

jjlin
sumber
Saya lebih suka versi klien, tetapi saya akan mencoba yang ini jika saya tidak menemukannya. Omong-omong, lokalisasi file OSX (non-standar) /private/etc/ssh_host*tidak /etc/ssh/ssh_host*.
Frédéric Grosshans
Menyalin file dari satu komputer ke komputer lain (dua mesin linux) tidak berhasil untuk saya. Meskipun isi file identik hash tidak jadi saya masih mendapatkan masalah (mungkin waktu modifikasi?). Solusi di bawah ini jauh lebih baik.
Stav
sshdmemuat kunci host sekali saat startup, jadi Anda kemungkinan besar perlu memulai ulang sshd. Saya akan menambahkan itu ke jawabannya. Adapun solusi lain yang lebih baik, itu tergantung pada situasi Anda. Saya berpendapat bahwa kelebihan utama dari metode ini adalah bahwa ia hanya membutuhkan pengaturan satu kali dan lebih mungkin untuk bekerja dengan beberapa implementasi klien SSH.
jjlin
Anehnya, OpenSSH 7.4p1 saya yang relatif baru sshdmemuat kunci host pada setiap koneksi baru. Mungkin sudah seperti ini sejak lama dan saya hanya mengasumsikan kunci host diperlakukan seperti sshdkonfigurasi lainnya . Jadi, itu mungkin masalah Anda.
jjlin
Apakah ini ide yang buruk untuk melakukan ini pada dua host di sebuah cluster yang berbagi alamat VRRP yang sama? Pada failover, host yang merespons akan berbeda. Saya ingin tidak mendapat peringatan.
Colin 't Hart
26

Seperti yang disarankan @Izzy dalam komentar di atas, ssh memberi tahu Anda garis yang menyinggung, dan dengan menghapus garis itu, (menyimpannya di tempat lain), menerima kunci baru, dan kemudian menyalin garis yang dihapus kembali, Anda berakhir dengan dua tombol untuk hal yang sama host, dan ssh akan menerima.

(Anda juga dapat menggunakan ssh-keygen -H -F <hostname>untuk menemukan baris dalam file known_hosts Anda yang cocok dengan nama host itu. Menjalankan ini setelah menyalin kembali baris yang dihapus akan mencantumkan dua entri.)

Jika ada yang tahu bagaimana membuat Putty melakukan hal yang sama, saya akan sangat tertarik mendengarnya.

DaCheetah
sumber
4
Sebenarnya, jika Anda memiliki klien linux, Anda bahkan tidak perlu menghapus baris yang menyinggung, Anda hanya perlu berkomentar dengan karakter hash ('#') di depan. Kemudian, setelah Anda menerima kunci baru, Anda bisa mengedit file known_hosts dan menghapus komentar baris dengan kunci lama. Tapi ya, ini juga akan berguna di Putty.
IllvilJa
1
Jika ada dua host dengan nama yang sama, tetapi alamat IP dan kunci host berbeda, solusi ini juga berfungsi: Mengomentari (atau menghapus sementara) maka kedua baris untuk host tersebut (yang berdasarkan alamat IP dan yang berdasarkan host name), sambungkan ke host yang belum dikenal, dan kemudian tambahkan kembali baris, yang dikomentari atau dihapus.
Kai Petzke
13

Saya menemukan ini yang dapat membantu Anda dengan apa yang ingin Anda capai.

Sumber: /programming/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

Buat file config di direktori .ssh Anda sebagai berikut:

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

Penjelasan Di Bawah Ini (dari man ssh_config)

CheckHostIP

Jika flag ini diset ke "yes", ssh (1) juga akan memeriksa alamat IP host di file known_hosts. Ini memungkinkan ssh untuk mendeteksi apakah kunci host diubah karena spoofing DNS. Jika opsi diatur ke "tidak", centang tidak akan dieksekusi. Standarnya adalah "ya".

HostKeyAlias

Menentukan alias yang harus digunakan alih-alih nama host asli saat mencari atau menyimpan kunci host di file database kunci host. Opsi ini berguna untuk tunneling koneksi SSH atau untuk beberapa server yang berjalan pada satu host.

Baris Username dan Port menghindari Anda harus memberikan opsi-opsi itu pada baris perintah juga, jadi Anda bisa menggunakan:

% ssh server1
% ssh server2
Rhyuk
sumber
Saya melihat artikel ini, tetapi tidak sesuai dengan kasus saya: kedua server dibedakan berdasarkan nomor port dalam artikel, bukan dalam kasus saya. Selanjutnya, saya ingin menjaga lapisan keamanan tambahan yang dibawa oleh hash asin known_hostsdan CheckHostIP.
Frédéric Grosshans
1
@ FrédéricGrosshans, saya periksa dicentang. Anda tidak harus memiliki porta terpisah, dan opsi HashKnownHosts berfungsi baik dengan HostKeyAlias.
Zoredache
Sisi buruknya, kecuali saya salah, ini dikonfigurasi pada basis per klien vs jawaban yang diterima dikonfigurasi hanya pada server ssh yang menerima.
FreeSoftwareServers
2

Cara termudah untuk menyelesaikan masalah Anda adalah memberi masing-masing host alamat IP sendiri / berbeda. Dengan 253 alamat yang tersedia di jaringan (pribadi) dan IPv4 Anda, itu bukan masalah besar. Beri mereka IP tetap (karena server DHCP akan mengidentifikasi mesin berdasarkan pada kartu jaringan alamat MAC, dan keduanya akan mendapatkan alamat yang sama). Saya tidak melihat solusi lain jika Anda ingin menjaga langkah-langkah keamanan (yang saya juga tidak akan turun untuk "kenyamanan" kecil itu).

Izzy
sumber
Sebenarnya, alamat IP tidak 192.168.0.xxdan tidak pribadi. Ini adalah alamat IPv4 'asli', yang diberikan oleh universitas saya yang tidak bisa saya ubah.
Frédéric Grosshans
Jika Anda memeriksa dengan Wikipedia , Anda akan melihat 192.168.0.0 - 192.168.255.255 (pertanyaan Anda ditentukan 192.168.0.9, yang termasuk dalam kisaran ini) termasuk ke dalam "ruang alamat Private IPv4". Jadi dengan "pribadi" saya tidak merujuk Anda "memiliki" itu, tetapi untuk spesifikasi IETF . Dalam pertanyaan Anda, Anda tidak menunjukkan bahwa Anda tidak dapat mengubah IP, maaf - tetapi dengan masukan yang diberikan, jawaban saya cocok.
Izzy
Maaf untuk pertanyaan yang diutarakan dengan buruk. Saya tidak downvote.
Frédéric Grosshans
Tidak ada masalah, dan tnx untuk memberi tahu saya - membuat downvote kurang mengecilkan hati. Tapi ide lain: Saya tidak yakin dari mana file known_hosts mengambil nama host, membalikkan DNS atau ditawarkan oleh klien. Anda dapat mencoba mengubah nama salah satu "host" Anda sehingga memberikan nama host yang berbeda. Atau agar kedua kunci host ditambahkan: ssh memberi tahu Anda "baris yang menyinggung" dalam file known_hosts Anda (ketika # 1 berisi dan Anda terhubung dengan # 2). Jadi Anda kemudian dapat menyalin baris itu ke file lain, menghapusnya dari known_hosts, biarkan # 2 terhubung dan tambahkan barisnya, dan tambahkan baris yang dihapus kembali. Tidak yakin apakah itu berhasil, tetapi Anda dapat mencoba.
Izzy
2

Saya tidak mengalami masalah ketika menghubungkan ke berbagai kotak VPS yang berbagi IP yang sama karena masing-masing memiliki port SSH yang berbeda (20022,30022, dll) sehingga mereka terdaftar sebagai host yang dikenal dengan kunci yang berbeda.

Mungkinkah itu solusi untuk Anda?

Pyheme
sumber
Hai @Pheme, selamat datang di Pengguna Super! Perhatikan bahwa pertanyaan ini hampir 4 tahun. Tidak ada yang salah dengan menjawabnya, tetapi perlu diingat bahwa mungkin Anda tidak mendapat jawaban.
Hewbot
Saya tidak punya mesin OS X lagi, tetapi jawaban Anda mungkin berguna untuk orang lain. Itulah inti dari pertukaran tumpukan
Frédéric Grosshans
@Hewbot ... memang, saya melihatnya sekarang. Tidak tahu mengapa, itu muncul dalam daftar pertanyaan terbaru ...
Pyheme
1

Artikel lain , yang menjelaskan beberapa cara untuk menangani masalah Anda:

Metode kedua menggunakan dua parameter openSSH:, StrictHostKeyCheckindan UserKnownHostsFile. Metode ini menipu SSH dengan mengonfigurasinya untuk menggunakan file empty_hosts kosong, dan TIDAK meminta Anda untuk mengkonfirmasi kunci identitas host jarak jauh.

afk
sumber
Makalah ini tentang pelarangan pemeriksaan kunci. Saya ingin terus memeriksa kunci, dan saya tidak ingin melarangnya setiap kali hostnamereboot ke Linut atau OSX
Frédéric Grosshans
1
Selamat Datang di Pengguna Super! Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi. Saya sudah memasukkan bagian pendek, tapi mungkin bukan yang Anda maksudkan ...
Tamara Wijsman
1

Karena Anda ingin tetap memeriksa kunci host ketat, saya ingin mereka menggunakan known_hostsfile yang berbeda . Untuk melakukan ini, atur ~/.ssh/configfile Anda (atau /etc/ssh/ssh_configfile jika Anda memerlukan ini untuk bekerja pada beberapa akun pengguna lokal) seperti ini:

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

, mengganti $REALHOSTNAMEdengan nama host atau alamat IP yang sebenarnya, tentu saja. (Tidak masalah yang Anda pilih, asalkan Anda memilih sesuatu setelah "Hostname" yang akan menyelesaikan ke alamat IP, tapi saya akan menggunakan nama host dalam preferensi ke alamat IP, hanya pada prinsip-prinsip umum.)

Kemudian ssh myserver.linuxdan ssh myserver.osxdengan demikian dapat memiliki kunci host yang berbeda, tetapi Anda masih mendapatkan pemeriksaan. Jika Linux terserah dan Anda mengetik OS X (atau sebaliknya), Anda akan mendapatkan peringatan (yang saya percaya adalah pengaruh yang diinginkan).

Jika saya memiliki masalah ini, saya akan memastikan ada sesuatu yang benar-benar salah pada known_hostsfile utama yang tidak cocok dengan salah satu dari keduanya, sehingga jika Anda mengetik $REALHOSTNAMEalih-alih myserver.osxAnda mendapatkan peringatan. :-) Saya akan melakukannya dengan meletakkan sesuatu seperti

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

di saya /etc/hosts, kemudian melakukan ssh $REALHOSTNAMEdan menerima kunci baru, lalu mengeluarkan entri itu.

Jim
sumber