“Tambahkan kunci host yang benar di known_hosts” / beberapa kunci host ssh per nama host?

147

Mencoba ssh ke komputer yang saya kendalikan, saya menerima pesan yang biasa:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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.

Saya memang mengubah kunci. Dan saya membaca beberapa lusin posting yang mengatakan bahwa cara untuk menyelesaikan masalah ini adalah dengan menghapus kunci lama dari known_hostsfile tersebut.

Tapi yang saya inginkan adalah ssh menerima kunci lama dan kunci baru. Bahasa dalam pesan kesalahan (" Add correct host key") menunjukkan bahwa harus ada beberapa cara untuk menambahkan kunci host yang benar tanpa menghapus yang lama.

Saya belum dapat menemukan cara menambahkan kunci host baru tanpa menghapus yang lama.

Apakah ini mungkin, atau apakah pesan kesalahannya hanya menyesatkan?

Samuel Edwin Ward
sumber
9
Ini adalah kunci host yang menghasilkan kesalahan. Host harus memiliki satu dan hanya satu kunci. Ini tidak ada hubungannya dengan kunci klien atau pengguna. Apakah Anda memiliki satu alamat IP yang mengapung di antara host yang berbeda atau sesuatu?
David Schwartz
4
Dalam kasus saya, saya tahu saya akan sering beralih di antara dua tombol dalam waktu dekat sambil mengutak-atik beberapa hal. Tampaknya ini juga akan berguna dalam satu IP dengan situasi beberapa host yang Anda sarankan. Terutama saya hanya ingin tahu apakah ini mungkin untuk pendidikan saya sendiri selain dari aplikasi praktis tertentu.
Samuel Edwin Ward

Jawaban:

148
  1. dapatkan kunci rsa dari server Anda, di mana server_ipalamat IP server Anda, seperti 192.168.2.1:

    $ ssh-keyscan -t rsa server_ip
    

    Tanggapan sampel:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. dan pada klien, salin seluruh baris respons server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG..., dan tambahkan kunci ini ke bagian bawah ~/.ssh/known_hostsfile Anda :

    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)
    
kuanta
sumber
12
Ini berhasil! Namun, saya menggunakan "HashKnownHosts", jadi entri itu tampak sedikit tidak pada tempatnya. Untungnya ssh_config (5) menunjuk saya ke ssh-keygen (1) yang menjelaskan bahwa saya dapat menggunakan "ssh-keygen -H" untuk hash entri yang belum di-shash. Terima kasih!
Samuel Edwin Ward
2
Ini "berfungsi" tetapi Anda tidak memverifikasi kuncinya, sehingga Anda rentan terhadap serangan mitm ...
JasperWallace
3
@JasperWallace, selama langkah pertama yang dilakukan melalui sambungan aman (misalnya menggunakan localhost) harus cukup aman, saya pikir
ony
3
Apakah ada cara untuk mengumpulkan semua jenis kunci dari server? Terkadang Anda tidak tahu apakah mereka RSA, DSA, ECDSA, RSA1 ... dll.
Sopalajo de Arrierez
3
@SopalajodeArrierez halaman yang sama juga mengatakan Anda dapat memisahkan jenis dengan koma, demikian juga ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip- tetapi satu-satunya alasan untuk menemukan rsa1dan dsakunci adalah untuk mengidentifikasi server yang perlu ditingkatkan / dikonfigurasi ulang
kbolino
94

Hapus entri itu dari known_hosts menggunakan:

ssh-keygen -R *ip_address_or_hostname*

Ini akan menghapus IP atau nama host yang bermasalah dari file known_hosts dan mencoba untuk menyambung kembali.

Dari halaman manual:

-R hostname
Menghapus semua kunci milik nama host dari file diketahui_hosts. Opsi ini berguna untuk menghapus host hash (lihat opsi -H di atas).

Luis Abarca
sumber
11
"cara menambahkan kunci host baru tanpa menghapus yang lama."
Samuel Edwin Ward
4
Ini solusi terbaik!
Thomas Decaux
8
Bagaimana ini memiliki 19 suara? Itu tidak mendekati menjawab pertanyaan yang diajukan ..
Molomby
2
Pertanyaan Anda muncul kedua ketika saya mencari "kunci host pembaruan git ssh secara otomatis". Jawaban inilah yang saya cari. Membuka pertanyaan baru dengan tepat apa yang saya inginkan mungkin bisa ditutup sebagai duplikat.
Jason Goemaat
Hostname juga berfungsi
damluar
18

Cara yang sangat sederhana adalah:

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

Kemudian edit host dikenal untuk menghapus kunci asli, lalu ssh ke host menggunakan:

ssh name@computer

Ini akan menambahkan kunci baru secara otomatis; lalu bandingkan kedua file tersebut. Program seperti berbaur adalah cara yang bagus untuk membandingkan dua file. Kemudian gabungkan file-file untuk membuat diketahui_hosts berisi kedua kunci

'Alasan' saya untuk menyimpan dua kunci adalah bahwa sistem tujuan adalah multiboot, meskipun saya berani mengatakan ada cara untuk menyinkronkan kunci di seluruh instalasi, tampaknya lebih mudah untuk mengizinkan beberapa kunci.

EDIT 2015/06

Saya harus menambahkan, meninjau kembali sekarang, bahwa saya melihat cara yang lebih sederhana [selama entri dapat diidentifikasi, biasanya dari nama host / alamat IP selain dari pesan kesalahan yang merujuk lokasi spesifiknya];

  1. Edit diketahui_hosts untuk menambahkan # pada awal entri 'lama' di known_hosts sementara
  2. Hubungkan [ssh ke tuan rumah], setujui permintaan untuk menambahkan kunci baru 'secara otomatis'
  3. Kemudian edit kembali host yang dikenal untuk menghapus #

Bahkan ada opsi HostKeyAlias ​​seperti pada

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

kemudian selanjutnya, setelah ssh client menambahkan kunci baru di bawah alias, Anda dapat mengedit known_hosts untuk mengganti hostname / alamat IP 'asli' untuk alias atau terhubung ke inkarnasi host tersebut dengan opsi alias lebih dari sebelumnya

Menandai
sumber
'Berbaur' ini? meldmerge.org
Samuel Edwin Ward
itu meld :) nama instal apt-get / yum cukup berbaur
Mark
Saya melakukan varian saran Anda yang bekerja dengan baik - bukannya cp, mv, lalu ssh, lalu cat ~ / .ssh / known_hosts.bak ~ / .ssh / known_hosts> tmp; mv tmp ~ / .ssh / known_hosts
Peter N Lewis
6

Saya memiliki masalah yang sama dengan pi raspberry yang saya boot dengan beberapa sistem yang berbeda (sistem dev untuk mengkompilasi binari lengan, proyek, xbmc, dll.) Dan telah mengalami masalah yang sama. Mereka menggunakan DHCP di jaringan lokal dan router saya selalu menggunakan kembali IP yang sama karena alamat MACnya sama. Saya telah menyelesaikannya dengan menggunakan nama domain berbeda di file host saya:

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

File known_hosts menyimpan sidik jari dengan nama host sehingga meskipun alamat IP yang sama, setiap nama host yang unik mendapat entri yang berbeda.

Saya muak menambahkan nama ke file host setiap kali saya menggunakan sistem baru jadi saya datang dengan cara yang lebih malas dengan menggunakan nol terkemuka pada alamat ip seperti:

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

Setiap variasi dari alamat ip (tidak terkanonik) mendapatkan entri sendiri di known_hosts.

Mike
sumber
1
Orang-orang OpenSSH menjadi bijak bagi saya, celah ini tidak lagi berfungsi di versi yang lebih baru.
Mike
Anda dapat menggunakan CheckHostIP nodi ~/.ssh/configdapat masih menggunakan celah tersebut. Anda bahkan dapat mendefinisikan alias di sana sehingga Anda tidak perlu mengutak-atik /etc/hostsdan menentukan CheckHostIP nohanya untuk 3 nama host ini.
GnP
3

Jika klien dan server Anda memiliki OpenSSH 6.8 atau yang lebih baru, Anda dapat menggunakan UpdateHostKeys yesopsi di ssh_configatau ~/.ssh/config. Sebagai contoh:

Host *
    UpdateHostKeys yes

Hal ini membuat SSH menyimpan semua kunci host yang harus dimiliki server known_hosts, dan ketika server mengubah atau menghapus satu kunci host, kunci tersebut juga diubah atau dihapus di server Anda known_hosts.

Mikaela
sumber
Sejauh ini, inilah jawaban yang paling berguna! Meskipun tidak secara eksplisit menawarkan cara untuk menyelesaikan pertanyaan awal jika kunci host sudah berubah, semua jawaban lain tidak aman karena mereka tidak memverifikasi kunci host baru. Opsi ini memungkinkan Anda untuk melakukan rollover aman ke kunci host baru.
Jaap Eldering
1

Saya tidak mengerti mengapa Anda ingin bekerja dengan dua kunci, tetapi Anda tentu dapat menambahkan lebih dari satu kunci yang valid ke ~/.ssh/known_hostsfile, tetapi Anda harus melakukannya secara manual.

Solusi lain mungkin menggunakan StrictHostKeyChecking=noopsi untuk host spesifik ini:

ssh -o StrictHostKeyChecking=no user@host

yang bisa Anda masukkan ke alias ~/.profileatau sesuatu yang serupa.

alias hc=ssh -o StrictHostKeyChecking=no user@host
Sven
sumber
StrictHostKeyChecking tampaknya tidak membantu dalam kasus ini; rupanya itu hanya menentukan perilaku ketika host tidak ada dalam file known_hosts. Disebutkan di sini: gossamer-threads.com/lists/openssh/dev/45349#45349
Samuel Edwin Ward
Ini berfungsi di sini. Anda akan mendapatkan peringatan, tetapi proses masuk berlanjut.
Sven
Itu aneh. Apakah Anda menggunakan otentikasi kata sandi? Apakah Anda menggunakan OpenSSH?
Samuel Edwin Ward
1

Jika Anda hanya ssh ke jaringan lokal maka ...

Solusi sederhana adalah menghapus file kunci lama dan menggantinya dengan yang kosong. Ini akan memungkinkan Anda untuk mengotorisasi ulang semua koneksi Anda dengan kunci baru. Jika Anda memiliki kunci ssh yang disimpan untuk situs di luar jaringan lokal Anda, maka Anda perlu memastikan bahwa koneksi awal Anda aman seperti yang Anda lakukan saat pertama kali terhubung ke server itu.

misalnya

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

Kemudian tekan spasi, backspace cntl + x dan 'y' untuk menyimpan buffer (file) baru. Praktiknya buruk tapi oke asalkan Anda tidak secara teratur melakukan ssh'ing di luar jaringan lokal Anda (mis. Uni atau server kerja)

Pada jaringan lokal yang aman ini aman karena Anda tidak bisa mendapatkan seorang pria dalam serangan tengah.

Selalu lebih baik menggunakan kode yang Anda mengerti!

Harun
sumber
4
Menyeka seluruh known_hostsfile setiap kali akan meniadakan sebagian besar keamanan jika tidak disediakan oleh ssh.
kasperd
Memang, saya berpendapat bahwa pada jaringan internal yang aman, lebih aman untuk memahami kode Anda dan menghindari keamanan daripada menyalin kode tanpa berpikir. Pada jaringan eksternal maka situasinya akan berbeda.
Aaron
-1

Begitu banyak jawaban, tetapi begitu banyak yang melepaskan perlindungan dengan mematikan pemeriksaan host ketat sepenuhnya, atau menghancurkan info host yang tidak terkait atau hanya memaksa pengguna untuk menerima kunci secara interaktif, mungkin pada titik kemudian, ketika itu tidak terduga.

Berikut adalah teknik sederhana untuk memungkinkan Anda membiarkan host ketat memeriksa, tetapi perbarui kunci dengan cara yang terkontrol, saat Anda mengharapkannya berubah:

  • Hapus kunci lama dan perbarui dalam satu perintah

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • Ulangi dengan alamat IP atau nama host lain jika Anda menggunakannya.

Keuntungan dari pendekatan ini adalah bahwa ia menerima server tepat sekali. Sebagian besar versi ssh-keygen tampaknya tidak mengembalikan kesalahan jika server yang Anda coba hapus tidak ada dalam file host yang dikenal, jika ini merupakan masalah bagi Anda, gunakan dua perintah secara berurutan.

Pendekatan ini juga memverifikasi konektivitas dan memancarkan pesan yang bagus untuk log dalam perintah ssh (yang masuk, memperbarui kunci host, dan mengeluarkan kunci host SSH yang diperbarui kemudian segera keluar.

Jika versi ssh-keygen Anda mengembalikan kode keluar yang tidak nol, dan Anda lebih suka menangani ini tanpa kesalahan, terlepas dari koneksi sebelumnya, cukup gunakan dua perintah secara berurutan, abaikan kesalahan apa pun pada perintah ssh-keygen.

Jika Anda menggunakan teknik ini, Anda tidak perlu memvariasikan perintah ssh Anda, atau mematikan pemeriksaan host kecuali selama satu perintah ssh. Anda dapat yakin bahwa sesi ssh di masa depan akan bekerja tanpa konflik atau perlu secara eksplisit menerima kunci baru, selama perintah ssh di atas berjalan tanpa kesalahan.

markgo2k
sumber
-3

Saya memiliki masalah yang sama.

Yang saya lakukan adalah sudo nano /home/user/.ssh/ host_allowdan menghapus kuncinya.

Ketika saya ssh kembali ke server itu menambahkan kunci baru.

David
sumber
2
Beberapa informasi lebih lanjut tentang mengapa ini terjadi akan sangat membantu untuk jawabannya.
Drew Khoury
-4

Gunakan perintah sed untuk menghapus garis yang menyinggung

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

Hapus baris 86 sebagaimana disebutkan dalam host yang dikenal.

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

Lain kali ketika mengakses menggunakan ssh, sistem akan secara otomatis menambahkan kunci baru.

ssh versi terbaru

menggunakan:

ssh-keygen -R <hostname|ip address>

Ini akan menghapus entri nama host dan mengambil cadangan dari yang lama .known_hostsebagaiknown_hosts.old

Viikram Simha
sumber
4
"Tapi yang aku inginkan adalah menerima ssh baik kunci lama maupun kunci baru." Jawaban Anda tidak melakukan ini.
Samuel Edwin Ward