Hapus kunci dari known_hosts

129

Saya membangun beberapa mesin virtual selama beberapa minggu terakhir. Masalahnya adalah, .ssh/known_hostsmemberi saya Pria di tengah peringatan. Ini terjadi karena sidik jari lain dikaitkan dengan IP mesin virtual.

.ssh/known_hostsNamun, dalam file tersebut, saya tidak menemukan catatan yang terkait dengan IP, hanya dua string yang mirip kunci dan "ssh-rsa".

Adakah yang punya ide tentang cara menghapus kunci lama known_hosts?

Adam Matan
sumber
7
"String aneh, seperti kunci" yang Anda rujuk adalah alamat host / ip yang di-hash. Ini fitur keamanan yang membantu menghentikan penyusup mengetahui sistem mana yang Anda akses. Jika Anda melihat ini maka ssh_config Anda telah HashKnownHosts yesditetapkan.
Deebster
1
Jika Anda merasa konten file terlalu membingungkan, Anda mungkin telah mengaktifkan pembungkus baris. Nonaktifkan itu. Semua baris dimulai dengan nama host atau alamat IP.
Daniel B

Jawaban:

90
sed -i '6d' ~/.ssh/known_hosts

Akan memodifikasi file ~ / .ssh / known_hosts: 6, menghapus baris ke-6.

Menurut pendapat saya, menggunakan ssh-keygen -Radalah solusi yang lebih baik untuk pengguna daya openssh, sementara admin Linux reguler Anda akan melakukan yang lebih baik untuk menjaga keterampilannya tetap segar dengan menggunakan metode di atas.

mikewaters
sumber
18
Saya tidak berpikir itu saran yang baik untuk mengedit file konfigurasi secara manual jika Anda memiliki aplikasi resmi untuk itu. Mengambil risiko tidak membuat Anda menjadi pro, menemukan pilihan tercepat dan teramanlah. Ini seperti memberi tahu orang untuk terus maju dan mengedit /etc/sudoerstanpa visudo. Jika Anda ingin mempertajam sedketerampilan Anda , silakan dan lakukan itu tanpa mengacaukan sistem Anda.
kraxor
2
"Jika Anda memiliki aplikasi resmi untuk itu" => keduanya ssh-keygen -Rdan sed -i {line}dcukup "resmi", dan keduanya akan berfungsi untuk masa mendatang. Util ssh-keygen memungkinkan penghapusan berdasarkan nomor baris, keduanya sangat dapat diterima (karena, nomor baris sering lebih mudah untuk ditangani, dan lebih sedikit rawan kesalahan, daripada berurusan dengan nama host pusat data modern).
michael
2
A) Penghapusan secara khusus baris ke-6, semuanya sangat "tidak terlihat tangan". Tidak ada penjelasan sama sekali tentang apa yang signifikan tentang baris ke-6 file tersebut ?! B) Juga man ssh-keygenmenyebutkan ssh-keygen -R hostname Anda baru saja mengatakan ssh-keygen -Rtanpa nama host yang ditentukan, dan Anda belum menjelaskan apa yang Anda maksud dengan itu.
barlop
124

Solusi paling sederhana adalah:

rm -f .ssh/known_hosts

ssh akan membuat ulang file lagi, tetapi Anda kehilangan kunci untuk memeriksa host lain!

Atau, Anda dapat menggunakan:

ssh-keygen -R "hostname"

Atau pesan ssh "man-in-the-middle" harus menunjukkan baris mana dari file known_hosts yang memiliki sidik jari yang menyinggung. Edit file, lompat ke baris itu dan hapus.

Sean Staats
sumber
55
ssh-keygen -R hostnameakan bekerja juga.
grawity
6
Jika kami menghapus file itu, kunci lain juga akan dihapus.
shgnInc
16
Menghapus file adalah saran yang buruk, seperti memberi tahu seseorang untuk membeli PC baru karena yang lama memiliki mouse yang rusak. Mengedit file secara manual yang dapat diedit oleh aplikasi resmi juga merupakan ide yang buruk. The ssh-keygenpilihan yang ditambahkan karena komentar, tapi tanpa penjelasan. Saya pikir jawaban ini tidak pantas mendapatkan banyak pujian.
kraxor
12
-1 karena seluruh baris "hapus seluruh file known_hosts". Ini adalah hal yang mengerikan, mengerikan, mengerikan untuk diusulkan, dan harus diedit.
Olivier Dulac
4
Solusi ini berlebihan. Hapus saja garis yang menyinggung. Itu dia.
Blake Frederick
81

Ada saklar ssh-keygen ( -R) untuk ini.

man ssh-keygen berbunyi:

-R Nama host

Menghapus semua kunci milik hostnamedari suatu known_hostsfile. Opsi ini berguna untuk menghapus host hash (lihat -Hopsi di atas).

pengguna201564
sumber
8
Ini adalah metode termudah dan teraman.
ayam
Catatan: Ini akan mengubah izin file diketahui_hosts menjadi 0600. Jika Anda memiliki file shared_hosts diketahui untuk alasan apa pun, ini bisa menonaktifkan berbagi itu.
Jiri Klouda
dan yang benar. Juga, saya harus melakukannya [localhost]:port, menggunakan kurung karena saya menggunakan port khusus kurasa = /. Seperti yang dikatakan orang lain, saya juga akan menggunakan pendekatan pengecekan kunci SSH untuk pengembangan sistem sementara / pengujian saya.
Pysis
Ini menghapus semua kejadian jadi cara terbaik. Anda dapat menambahkan kunci baru dengan:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux
18

Peringatan akan memberi tahu Anda baris persis di file host yang dikenal.

Ini sebuah contoh:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The RSA host key for foo-bar.net has changed,
and the key for the corresponding IP address 127.0.0.1
is unchanged. This could either mean that
DNS SPOOFING is happening or the IP address for the host
and its host key have changed at the same time.
Offending key for IP in /home/user/.ssh/known_hosts:6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Lihat /home/user/.ssh/known_hosts:6bagian itu? Ini menentukan file dan nomor baris.

innaM
sumber
10

Anda perlu menjalankan perintah berikut untuk menyingkirkan masalah ini. Buka terminal dan ketik perintah berikut:

Untuk semua contoh di bawah ini, ganti saja nilai setelah -R

ssh-keygen -R server-name
ssh-keygen -R server.ip.addre.ss
ssh-keygen -R 202.54.1.5
ssh-keygen -R server1.example.com
Tarun Gupta
sumber
Metode ini sudah disarankan di jawaban sebelumnya. Bisakah Anda memperluas apa yang berbeda dalam jawaban Anda?
Burgi
@ Burgi - jawaban ini memberikan detail lebih banyak tentang sintaksis ssh-keygen -Rdaripada jawaban lain sejauh ini. Ini menunjukkan dengan tepat apa yang dapat Anda tulis setelah -R. Jadi jawaban ini bermanfaat, meskipun itu bukan jawaban yang sama sekali baru.
Yitz
@ Yitz Komentar saya dibuat sebagai bagian dari ulasan. Pada saat itu (18 bulan lalu) saya pikir pertanyaan itu memerlukan sedikit bantuan untuk membuatnya lebih baik.
Burgi
8

Anda juga dapat menginstruksikan ssh untuk tidak memeriksa file known_hosts menggunakan flag UserKnownHostsFile dan StrictHostKeyChecking.

Misalnya:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no [email protected]

Untuk kemudahan penggunaan Anda dapat alias ini:

alias boldssh='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

Sekarang Anda bisa boldsh kapan saja Anda yakin mempercayai sertifikat server.

rubel
sumber
8
Gagasan yang mengerikan. Nonaktifkan lapisan keamanan secara permanen hanya karena Anda terlalu malas menjaga informasi ~/.ssh/known_hoststerkini? Mengapa tidak langsung saja menggunakannya telnet? "kapan pun Anda yakin" - jika Anda pernah yakin, maka Anda tidak tahu apa itu serangan MITM dan Anda mungkin harus meluangkan waktu membaca beberapa literatur yang bagus.
kraxor
2
Berdasarkan pertanyaan OP, saya pikir ini adalah jawaban yang valid. Kadang-kadang Anda memiliki sistem pengujian yang membuat / menghancurkan banyak VM. (Saya melakukan ini sekarang saat saya mempersiapkan ujian RHCE.) Mungkin tidak ada implikasi keamanan. Meskipun memperhatikan implikasi keamanannya bagus, saya tidak berpikir ini harus dilabeli sebagai "ide yang mengerikan".
Rick Chatham
3

Semua jawaban baik, tetapi untuk SSH pro nyata kami kehilangan informasi cara menghapus ssh signature dengan nomor port.

  • Perintah hapus tanda tangan host SSH sederhana:

    ssh-keygen -R example.com
    
  • Hapus kunci ssh kompleks, misalnya Anda terhubung ke ssh pada port non standar 222:

    ssh example.com -p 222
    

dan Anda mendapatkan peringatan, dan untuk menghapus ini, Anda harus menggunakan nomor porta tanda kurung siku:

    ssh-keygen -R [example.com]:222

Semoga ini bisa membantu bagi pengguna konfigurasi non-standar.

Arunas Bartisius
sumber
Persis apa yang saya cari. Terima kasih!
aexl
1

Berikut adalah metode menggunakan Ex editor:

ex +6d -scwq ~/.ssh/known_hosts

di mana 6 adalah nomor baris Anda yang disebutkan dalam pesan peringatan. Seperti ini:

Kunci menyinggung IP di /home/user/.ssh/known_hosts:6 <== LINE NUMBER


Secara umum, itu disarankan untuk menggunakanex untuk mengedit file non-interaktif , bukan sed, yang lebih merupakan S tream ED itor dan yang -iparameter yang merupakan ekstensi non-standar FreeBSD.

kenorb
sumber
0

Entri untuk nama host atau ip harus di kolom pertama. Peringatan juga harus mencantumkan nomor baris di mana kunci yang menyinggung berada.

rangsangan
sumber
0

Anda juga dapat menghapus satu baris dari host yang dikenal dengan mis. Rmknownhost 111 (111 adalah baris yang harus dihapus):

#! /usr/bin/env ruby
line = ARGV[0] || raise("gimme line to remove")
hosts = File.expand_path("~/.ssh/known_hosts")
content = File.readlines(hosts)
removed = content.delete_at line.to_i - 1
puts "Removed:\n#{removed}"
File.open(hosts, 'w'){|f| f.write content * ""}

Simpan ini seperti rmknownhostdalam folder dari folder Anda PATH.

lebih kotor
sumber
Apa manfaat dari ini daripada melakukannya dalam editor teks yang diberikan? Apakah ada alasan untuk tidak melakukannya seperti itu, seperti bagaimana sudoers harus diedit dengan visudo?
Andy Lester
Distro apa yang datang dengan ini? Ubuntu sepertinya tidak memilikinya.
flickerfly
Keuntungannya adalah otomatis dan cepat / ini biner terpisah yang Anda tambahkan sendiri
grosser
2
Anda bisa saja memposting skrip Anda di sini daripada menautkan entri blog Anda sendiri yang Anda buat pada hari Anda memposting jawaban ini. Ini memenuhi syarat sebagai Spam IMHO. Belum lagi Anda bisa membuat alias sederhana untuk mencapai hasil yang sama, tidak perlu skrip ruby ​​panjang 7 baris.
kraxor
1
atau cukup tambahkan ini ke ~ / .bashrc Anda: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }dan panggil dengan sshdel [line number]. tidak ada ruby, tidak ada biner, tidak ada kekhawatiran.
rubynorails
0

Ini adalah file teks. Anda dapat dengan mudah mengedit dengan vi (m) dan cukup menghapus baris yang dimaksud (dd), dan menyimpan file (wq). Tetapi jika ada perintah khusus untuk menghapus host, itu mungkin metode yang paling aman.

Ryan Griggs
sumber
Saya tidak melihat bagaimana mengedit file secara langsung di VIM adalah "tidak aman". Ini didasarkan pada tingkat kenyamanan Anda dengan VIM. Terutama dengan file ini, risiko terbesar yang Anda miliki adalah menghapus terlalu banyak kunci, dalam hal ini Anda hanya akan diminta kembali.
Rick Chatham
"Keamanan" yang saya maksudkan melibatkan 1) lupa / tidak tahu untuk menghapus info dependen dalam file lain (jika ada) dan 2) Secara tidak sengaja menghapus lebih atau kurang dari yang seharusnya, sehingga merusak file.
Ryan Griggs