Usuń klucz ze znanych hostów

129

W ciągu ostatnich kilku tygodni zbudowałem kilka maszyn wirtualnych. Problem w tym, że .ssh/known_hostsdaje mi Człowieka w środku ostrzeżenia. Dzieje się tak, ponieważ z adresem IP maszyny wirtualnej powiązany jest inny odcisk palca.

W .ssh/known_hostspliku nie znajduję jednak rekordu związanego z adresem IP, tylko dwa dziwne, podobne do klucza ciągi i „ssh-rsa”.

Czy ktoś ma jakieś pomysły na temat usuwania starego klucza known_hosts?

Adam Matan
źródło
7
„Dziwne, podobne do klucza ciągi”, o których mówisz, to zaszyfrowane adresy hostów / adresów IP. Jest to funkcja bezpieczeństwa, która pomaga intruzowi nie wiedzieć, do których systemów masz dostęp. Jeśli to zobaczysz, oznacza to, że HashKnownHosts yesustawiony jest twój ssh_config .
Deebster,
1
Jeśli uważasz, że zawartość pliku jest zbyt myląca, prawdopodobnie włączono zawijanie wierszy. Dezaktywuj to. Wszystkie linie zaczynają się od nazwy hosta lub adresu IP.
Daniel B

Odpowiedzi:

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

Zmodyfikuje plik ~ / .ssh / known_hosts: 6, usuwając szósty wiersz.

Moim zdaniem używanie ssh-keygen -Rjest lepszym rozwiązaniem dla zaawansowanego użytkownika openssh, podczas gdy zwykły administrator Linuksa lepiej by utrzymał swoje umiejętności w świeżości, używając powyższej metody.

mikewaters
źródło
18
Nie sądzę, że dobrym pomysłem jest ręczna edycja pliku konfiguracyjnego, jeśli masz do tego oficjalną aplikację. Podejmowanie ryzyka nie czyni cię profesjonalistą, znalezienie najszybszej i najbezpieczniejszej opcji. To tak, jakby mówić ludziom, żeby /etc/sudoersbez problemu edytowali visudo. Jeśli chcesz wyostrzyć swoje sedumiejętności, zrób to bez zepsucia systemu.
kraxor
2
„jeśli masz na to oficjalny wniosek” => oba ssh-keygen -Ri sed -i {line}dsą dość „oficjalne”, i oba będą działać w dającej się przewidzieć przyszłości. Util ssh-keygen pozwala na usuwanie według numeru linii, oba są całkowicie akceptowalne (ponieważ numery linii są często łatwiejsze w obsłudze i mniej podatne na błędy niż w przypadku nazw hostów nowoczesnych centrów danych).
michael
2
A) Usunięcie konkretnie szóstej linii jest bardzo „nie patrz na ręce”. Nie ma żadnego wyjaśnienia, co jest znaczące w szóstej linii pliku ?! B) man ssh-keygenWspomina także ssh-keygen -R hostname , że właśnie powiedziałeś, ssh-keygen -Rnie podając nazwy hosta, i nie wyjaśniłeś, co masz na myśli.
barlop
123

Najprostszym rozwiązaniem jest:

rm -f .ssh/known_hosts

ssh ponownie utworzy plik, ale stracisz sprawdzanie klucza dla innych hostów!

Lub możesz użyć:

ssh-keygen -R "hostname"

Lub komunikat ssh „man-in-the-middle” powinien wskazywać, która linia pliku znanego_hosta ma szkodliwy odcisk palca. Edytuj plik, przeskocz do tego wiersza i usuń go.

Sean Staats
źródło
55
ssh-keygen -R hostnameteż będzie działać.
grawity
6
Jeśli usuniemy ten plik, inne klucze również zostaną usunięte.
shgnInc
16
Usunięcie pliku to zła rada, to jak kazanie komuś kupić nowy komputer, ponieważ stary ma zepsutą mysz. Ręczne edytowanie pliku, który może być edytowany przez oficjalną aplikację, jest również złym pomysłem. ssh-keygenOpcja została dodana, ponieważ z komentarzem, ale bez wyjaśnienia. Nie sądzę, że ta odpowiedź zasługuje na tak wiele pozytywnych opinii.
kraxor
12
-1 z powodu całego pierwszego wiersza „usuń cały plik znane_hosty”. Jest to okropna, okropna, okropna rzecz do zaproponowania i należy ją zredagować.
Olivier Dulac,
4
To rozwiązanie jest przesadą. Po prostu usuń linię obrażającą. Otóż ​​to.
Blake Frederick
78

Do tego celu służy przełącznik ssh-keygen ( -R).

man ssh-keygen czyta:

-R nazwa hosta

Usuwa wszystkie klucze należące do hostnamez known_hostspliku. Ta opcja jest przydatna do usuwania haszowanych hostów (patrz -Hopcja powyżej).

użytkownik201564
źródło
8
To najłatwiejsza i najbezpieczniejsza metoda.
kurczak
Uwaga: zmieni to uprawnienia pliku znane_hosty na 0600. Jeśli masz udostępniony plik znany_host z dowolnego powodu, może to uniemożliwić jego udostępnianie.
Jiri Klouda,
i poprawny. Musiałem też zrobić [localhost]:port, używając nawiasów, ponieważ użyłem niestandardowego portu. Jak powiedzieli inni, do rozwoju mojego systemu przejściowego / testowego użyłbym również metody sprawdzania klucza bez SSH.
Pysis
18

Ostrzeżenie wyświetli dokładną linię w znanym pliku hosts.

Oto przykład:

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

Widzisz /home/user/.ssh/known_hosts:6część? Określa numer pliku i linii.

innaM
źródło
10

Aby pozbyć się tego problemu, uruchom następujące polecenie. Otwórz terminal i wpisz następujące polecenie:

Dla wszystkich poniższych przykładów po prostu zamień wartość po -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
źródło
Ta metoda została już zasugerowana w poprzednich odpowiedziach. Czy mógłbyś rozwinąć to, co różni się w twojej odpowiedzi?
Burgi
@Burgi - ta odpowiedź zawiera więcej szczegółów na temat składni ssh-keygen -Rniż jakakolwiek inna jak dotąd odpowiedź. Pokazuje przykładowo dokładnie, po czym możesz napisać -R. Ta odpowiedź jest więc warta, mimo że nie jest to zupełnie nowa odpowiedź.
Yitz
@Yitz Mój komentarz został opublikowany w ramach recenzji. W tym czasie (18 miesięcy temu) myślałem, że pytanie potrzebuje trochę pomocy, aby było jeszcze lepiej.
Burgi,
8

Możesz także poinstruować ssh, aby nie sprawdzał pliku znane_hosty przy użyciu flag UserKnownHostsFile i StrictHostKeyChecking.

Na przykład:

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

W celu ułatwienia użytkowania możesz użyć aliasu:

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

Teraz możesz po prostu boldssh, gdy masz pewność, że ufasz certyfikatowi serwera.

rubel
źródło
8
Co za okropny pomysł. Trwale wyłącz warstwę bezpieczeństwa tylko dlatego, że jesteś zbyt leniwy, aby ~/.ssh/known_hostsbyć na bieżąco? Dlaczego nie skorzystać i skorzystać telnet? „ilekroć jesteś pewien” - jeśli jesteś pewien, to nie masz pojęcia, czym jest atak MITM i prawdopodobnie powinieneś poświęcić trochę czasu na przeczytanie dobrej literatury.
kraxor
2
Na podstawie pytania PO myślę, że jest to prawidłowa odpowiedź. Czasami masz system testowy, na którym tworzysz / niszczysz wiele maszyn wirtualnych. (Robię to teraz, przygotowując się do egzaminu RHCE.) Może to nie mieć wpływu na bezpieczeństwo. Chociaż zauważenie, że implikacje dla bezpieczeństwa są świetne, nie sądzę, że należy to nazwać „okropnym pomysłem”.
Rick Chatham
powiązane: superuser.com/a/1126243/73961
Michael
3

Wszystkie odpowiedzi są dobre, ale dla prawdziwego SSH pro brakuje nam informacji, jak usunąć podpis ssh z numerem portu.

  • Proste polecenie usuwania podpisu hosta SSH:

    ssh-keygen -R example.com
    
  • Złożone usuwanie klucza ssh, np. Łączysz się z ssh na niestandardowym porcie 222:

    ssh example.com -p 222
    

a pojawi się ostrzeżenie. Aby to usunąć, musisz użyć nawiasu kwadratowego, numer portu dwukropka:

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

Mam nadzieję, że pomoże to niestandardowym użytkownikom konfiguracji.

Arunas Bartisius
źródło
Dokładnie to, czego szukałem. Dziękuję Ci!
aexl
1

Oto metoda wykorzystująca edytor Ex:

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

gdzie 6. to numer twojej linii wymieniony w komunikacie ostrzegawczym. Tak jak ten:

Obrażający klucz do adresu IP w /home/user/.ssh/known_hosts:6 <== NUMER LINII


Ogólnie zaleca się, aby używaćex do edycji plików w sposób nieinteraktywny , zamiast tego sed, co jest raczej iteracją S tream ED i jego -iparametrem, który jest niestandardowym rozszerzeniem FreeBSD.

kenorb
źródło
0

Wpis nazwy hosta lub adresu ip powinien znajdować się w pierwszej kolumnie. Ostrzeżenie powinno także zawierać numer wiersza, w którym leży przestępca.

stymuluje
źródło
0

Możesz także usunąć pojedynczą linię ze znanych hostów za pomocą np. Rmknownhost 111 (111 to linia do usunięcia):

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

Zapisz to jak rmknownhostw folderze z twojego PATH.

grosser
źródło
Jaka jest korzyść z tego, że robi się to w dowolnym edytorze tekstu? Czy jest jakiś powód, aby tego nie robić, na przykład edytowanie sudoers za pomocą visudo?
Andy Lester
Jakie dystrybucje są z tym związane? Wydaje się, że Ubuntu go nie ma.
flickerfly
Zaletą jest to, że jest zautomatyzowany i szybki / jest to osobny plik binarny, który sam dodajesz
grosser
2
Mogłeś po prostu opublikować tutaj swój skrypt zamiast linkowania własnego wpisu na blogu, który utworzyłeś w dniu opublikowania tej odpowiedzi. To kwalifikuje się jako spam IMHO. Nie wspominając już o tym, że możesz stworzyć prosty alias, aby osiągnąć ten sam wynik, nie potrzebujesz 7-liniowego skryptu ruby.
kraxor
1
lub po prostu dodaj to do ~ / .bashrc: sshdel() { sed -i "${@}d" ~/.ssh/known_hosts; }i wywołaj za pomocą sshdel [line number]. bez rubinu, bez plików binarnych, bez zmartwień.
rubynorails
0

To jest plik tekstowy. Możesz łatwo edytować za pomocą vi (m) i po prostu usunąć dany wiersz (dd) i zapisać plik (wq). Ale jeśli istnieje specjalne polecenie usuwania hosta, jest to prawdopodobnie najbezpieczniejsza metoda.

Ryan Griggs
źródło
Nie widzę, jak edycja pliku bezpośrednio w VIM jest „niebezpieczna”. Opiera się na Twoim poziomie komfortu z VIM. Szczególnie w przypadku tego pliku największym ryzykiem jest usunięcie zbyt wielu kluczy, w takim przypadku ponownie pojawi się monit.
Rick Chatham
„Bezpieczeństwo”, o którym mówiłem, polega na 1) zapomnieniu / nieumiejętności usunięcia informacji zależnych z innych plików (jeśli takie istnieją) oraz 2) Przypadkowym usunięciu większej lub mniejszej liczby potrzeb, co powoduje uszkodzenie pliku.
Ryan Griggs