Rimuovi la chiave da known_hosts


129

Ho costruito diverse macchine virtuali nelle ultime settimane. Il problema è che .ssh/known_hostsmi dà l' Uomo nell'avvertimento intermedio . Ciò accade perché un'altra impronta digitale è associata all'IP della macchina virtuale.

Nel .ssh/known_hostsfile, tuttavia, non trovo il record relativo all'IP, solo due strane stringhe simili a chiavi e "ssh-rsa".

Qualcuno ha qualche idea su come rimuovere la vecchia chiave da known_hosts?


7
Le "strane stringhe simili a chiavi" a cui fai riferimento sono gli host / indirizzi ip con hash. Questa è una funzione di sicurezza che aiuta a impedire a un intruso di sapere a quali sistemi hai accesso. Se vedi questo, il tuo ssh_config è HashKnownHosts yesimpostato.
Deebster,

1
Se ritieni che il contenuto del file sia troppo confuso, probabilmente hai attivato il ritorno a capo. Disattivalo. Tutte le righe iniziano con un nome host o un indirizzo IP.
Daniel B,

Risposte:


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

Modificherà il file ~ / .ssh / known_hosts: 6, rimuovendo la sesta riga.

Secondo me, usare ssh-keygen -Rè una soluzione migliore per un utente power di openssh, mentre il tuo normale amministratore Linux farebbe meglio a mantenere nuove le sue abilità sed usando il metodo sopra.


18
Non credo sia un buon consiglio modificare manualmente un file di configurazione se si dispone di un'applicazione ufficiale per questo. Assumere rischi non ti rende un professionista, trovando l'opzione più rapida e sicura. È come dire alle persone di andare avanti e modificare /etc/sudoerssenza visudo. Se vuoi affinare le tue sedabilità, vai avanti e fallo senza rovinare il tuo sistema.
kraxor,

2
"se hai un'applicazione ufficiale per questo" => entrambi ssh-keygen -Re sed -i {line}dsei piuttosto "ufficiale", ed entrambi funzioneranno per il prossimo futuro. Util ssh-keygen consente la rimozione per numero di riga, entrambi sono perfettamente accettabili (perché, i numeri di riga sono spesso più facili da gestire e meno soggetti ad errori, rispetto ai moderni nomi host dei data center).
michael,

2
A) La cancellazione della sesta riga, in particolare, è molto "non guardare mani". Nessuna spiegazione su ciò che è significativo sulla sesta riga del file ?! B) man ssh-keygenMenziona anche ssh-keygen -R hostname che hai appena detto ssh-keygen -Rsenza specificare un nome host e non hai spiegato cosa intendi con questo.
barlop

124

La soluzione più semplice è:

rm -f .ssh/known_hosts

ssh ricrea nuovamente il file, ma perdi il controllo delle chiavi per altri host!

Oppure puoi usare:

ssh-keygen -R "hostname"

Oppure il messaggio ssh "man-in-the-middle" dovrebbe indicare quale riga del file known_hosts ha l'impronta digitale offensiva. Modifica il file, passa a quella riga ed eliminalo.


55
ssh-keygen -R hostnamefunzionerà anche.
Grawity,

6
Se rimuoviamo quel file, verranno rimosse anche altre chiavi.
shgnInc,

16
Rimuovere il file è un cattivo consiglio, è come dire a qualcuno di acquistare un nuovo PC perché quello vecchio ha un mouse rotto. Anche la modifica manuale di un file che può essere modificato da un'applicazione ufficiale è una cattiva idea. L' ssh-keygenopzione è stata aggiunta a causa di un commento, ma senza spiegazioni. Non credo che questa risposta meriti così tanti voti.
kraxor,

12
-1 a causa dell'intera prima riga "elimina l'intero file known_hosts". Questa è una cosa terribile, terribile, terribile da proporre e dovrebbe essere modificata.
Olivier Dulac il

4
Questa soluzione è eccessiva. Basta rimuovere la linea offensiva. Questo è tutto.
Blake Frederick,

81

C'è un interruttore ssh-keygen ( -R) per questo.

man ssh-keygen si legge:

-R Nome host

Rimuove tutte le chiavi appartenenti a hostnameun known_hostsfile. Questa opzione è utile per eliminare gli host con hash (vedi l' -Hopzione sopra).


8
Questo è il metodo più semplice e sicuro.
pollo,

Nota: questo cambierà le autorizzazioni del file known_hosts su 0600. Se per qualsiasi motivo si dispone di un file known_hosts condiviso, ciò potrebbe disabilitarne la condivisione.
Jiri Klouda,

e quello corretto. Inoltre, ho dovuto farlo [localhost]:port, usando le parentesi perché ho usato una porta personalizzata immagino = /. Come altri hanno già detto, per lo sviluppo del mio sistema di transitori / test utilizzerei anche l'approccio di non controllo delle chiavi SSH.
Pysis,

Questo rimuove tutte le ocurenze quindi il modo migliore. È possibile aggiungere una nuova chiave con:ssh-keyscan -H my.ssh.server.example.com >> ~/.ssh/known_hosts;
Nux

18

L'avvertimento ti dirà la riga esatta nel file hosts noto.

Ecco un esempio:

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

Vedi la /home/user/.ssh/known_hosts:6parte? Specifica il file e il numero di riga.


10

È necessario eseguire il comando seguente per eliminare questo problema. Apri il terminale e digita il seguente comando:

Per tutti gli esempi seguenti, basta sostituire il valore dopo -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

Questo metodo è già stato suggerito nelle risposte precedenti. Potresti approfondire ciò che è diverso nella tua risposta?
Burgi,

@Burgi: questa risposta fornisce maggiori dettagli sulla sintassi di ssh-keygen -Rqualsiasi altra risposta finora. Mostra ad esempio esattamente cosa puoi scrivere dopo -R. Quindi questa risposta è utile, anche se non è una risposta totalmente nuova.
Yitz il

@Yitz Il mio commento è stato inserito come parte della recensione. All'epoca (18 mesi fa) pensavo che la domanda avesse bisogno di un piccolo aiuto per renderla ancora migliore.
Burgi,

8

Puoi anche indicare a ssh di non controllare il file known_hosts usando i flag UserKnownHostsFile e StrictHostKeyChecking.

Per esempio:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com

Per facilità d'uso puoi alias questo:

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

Ora puoi solo grassetto quando sei sicuro di fidarti del certificato del server.


8
Che idea orribile. Disabilitare permanentemente un livello di sicurezza solo perché sei troppo pigro per tenerti ~/.ssh/known_hostsaggiornato? Perché non andare avanti e usare telnet? "ogni volta che ne sei sicuro" - se mai ne sei sicuro, allora non hai idea di cosa sia un attacco MITM e probabilmente dovresti passare un po 'di tempo a leggere della buona letteratura.
kraxor,

2
Sulla base della domanda del PO, penso che questa sia una risposta valida. A volte hai un sistema di test su cui stai creando / distruggendo molte macchine virtuali. (Lo sto facendo proprio ora mentre preparo l'esame RHCE.) Potrebbero non esserci implicazioni sulla sicurezza. Mentre notare le implicazioni sulla sicurezza è grandioso, non penso che debba essere etichettato come "un'idea orribile".
Rick Chatham,


3

Tutte le risposte sono buone, ma per i veri SSH pro mancano informazioni su come rimuovere la firma ssh con il numero di porta.

  • Comando rimuovi firma host SSH semplice:

    ssh-keygen -R example.com
    
  • Rimozione della chiave ssh complessa, ad es. Connessione a ssh sulla porta non standard 222:

    ssh example.com -p 222
    

e ricevi un avviso e per rimuoverlo devi usare il numero di porta dei due punti tra parentesi quadre:

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

Spero che questo aiuti per gli utenti di configurazione non standard.


Esattamente quello che stavo cercando. Grazie!
aexl,

1

Ecco un metodo usando Ex editor:

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

dove 6 è il numero di riga indicato nel messaggio di avviso. Come questo:

Chiave offensiva per IP in /home/user/.ssh/known_hosts:6 <== NUMERO LINEA


In generale, è consigliato di utilizzareex per modificare i file in modo non interattivo , invece sed, che è più di un S tream ED itor e il suo -iparametro che è un'estensione non standard di FreeBSD.


0

La voce per il nome host o l'ip dovrebbe essere nella prima colonna. L'avvertimento dovrebbe anche elencare un numero di riga in cui si trova la chiave incriminata.


0

Puoi anche rimuovere una singola linea da host conosciuti con es. Rmknownhost 111 (111 è la linea da rimuovere):

#! /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 * ""}

Salvalo come rmknownhostin una cartella dal tuo PATH.


Qual è il vantaggio di questo rispetto a farlo in un determinato editor di testo? C'è qualche motivo per non farlo in questo modo, come come i sudoers devono essere modificati con visudo?
Andy Lester,

Che distro viene con questo? Ubuntu non sembra averlo.
flickerfly,

Il vantaggio è che è automatizzato e rapido / è un binario separato che ti aggiungi
più

2
Avresti potuto pubblicare qui il tuo script invece di collegare il tuo post di blog che hai creato il giorno in cui hai pubblicato questa risposta. Questo si qualifica come IMHO spam. Per non parlare del fatto che è possibile creare un semplice alias per ottenere lo stesso risultato, senza bisogno di uno script ruby ​​lungo 7 righe.
kraxor,

1
o aggiungi semplicemente questo al tuo ~ / .bashrc: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }e chiamalo con sshdel [line number]. niente rubino, niente binario, niente preoccupazioni.
rubynorails

0

È un file di testo. Puoi facilmente modificare con vi (m) ed eliminare semplicemente la riga in questione (dd) e salvare il file (wq). Ma se esiste un comando specifico per rimuovere un host, questo è probabilmente il metodo più sicuro.


Non vedo come la modifica del file direttamente in VIM sia "non sicura". Si basa sul tuo livello di comfort con VIM. Soprattutto con questo file, il rischio maggiore che hai è l'eliminazione di troppe chiavi, nel qual caso ti verrà nuovamente richiesto.
Rick Chatham,

La "sicurezza" a cui mi riferivo implica 1) dimenticare / non sapere di rimuovere le informazioni dipendenti in altri file (se presenti) e 2) Eliminare accidentalmente più o meno di quanto sia necessario, rompendo così il file.
Ryan Griggs,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.