Płynniejszy przepływ pracy w celu obsługi błędów weryfikacji hosta SSH?

41

Jest to prosty problem, z którym wszyscy się spotykamy i prawdopodobnie rozwiązujemy go ręcznie bez zastanowienia.

Gdy serwery się zmieniają, są ponownie przydzielane lub adresy IP są ponownie przydzielane, otrzymujemy poniżej komunikat weryfikacyjny hosta SSH. Jestem zainteresowany usprawnieniem przepływu pracy w celu rozwiązania tych błędów identyfikacji ssh.

Biorąc pod uwagę następujący komunikat, zazwyczaj vi /root/.ssh/known_hosts +434usuwam ( dd) linię naruszającą.

Widziałem, że programiści / użytkownicy innych organizacji usuwają cały swój known_hostsplik z frustracji widząc tę ​​wiadomość. Chociaż nie posuwam się tak daleko, wiem, że istnieje bardziej elegancki sposób, aby sobie z tym poradzić.

Napiwki?

[root@xt ~]# ssh las-db1

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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 the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
ed:86:a2:c4:cd:9b:c5:7a:b1:2b:cc:42:15:76:8c:56.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:434
RSA host key for las-db1 has changed and you have requested strict checking.
Host key verification failed.
ewwhite
źródło
Mamy ten sam problem. Nie mam doświadczenia z NASA Mesh ti.arc.nasa.gov/opensource/projects/mesh, ale jest na mojej liście technologii do przejrzenia.
Andrew Gilmartin,
1
Dlaczego nie skopiować starego klucza podczas ponownej instalacji / realokacji serwera?
Random832,
@ Random832 Nie skaluje się w sytuacji, gdy masz dużo serwerów ... Lub jeśli masz środowisko laboratoryjne / testowe, w którym często recyklujesz adresy IP. Lub inna sprawa; nieplanowana wymiana serwera, gdy oryginalny serwer jest niedostępny ...
ewwhite
3
Wielkie pytanie, które mam, brzmi: jak się dostać do tej sytuacji? Jeśli ponownie używasz nazw hostów, możesz zechcieć ponownie rozważyć standard nazewnictwa hosta ( tools.ietf.org/html/rfc1178 ). Jeśli ponownie używasz adresów IP, powinieneś wycofać klucze SSH w ramach tej samej procedury, co wycofanie poprzedniego serwera z tego adresu IP. Jeśli pracujesz w środowisku „sieciowym”, w którym ponowne wykorzystywanie adresów IP odbywa się w sposób zautomatyzowany, a nazwy hostów pozbawione sensu są obowiązkowe, powinieneś mieć wystarczająco zautomatyzowany proces cyklu życia serwera, w którym naprawi się klucze ssh
Paul Gear

Odpowiedzi:

47

Możesz użyć ssh-keygenpolecenia, aby usunąć określone wpisy według hosta:

ssh-keygen -R las-db1

Jeśli nie masz tego polecenia, zawsze możesz użyć sed:

sed -i '/las-db1/d' /root/.ssh/known_hosts
Kyle Brandt
źródło
3
Użycie ssh-keygen -R do rozwiązania problemu z kluczami będącymi w konflikcie jest również tym, co klient ssh w Ubuntu sugeruje w komunikacie o błędzie, gdy ten problem występuje.
Kenny Rasschaert,
Nie wiedziałem o tym przełączeniu na ssh-keygenpolecenie. Dobry!
ewwhite
10
Pamiętaj, aby sprawdzić i upewnić się, że ktoś tak naprawdę nie jest „ROBIĄC COŚ NIESAMOWEGO!”
Michael Hampton
1
Upewnij się, że nie zrobisz tego na konferencji!
Paul Gear,
2
@ewwhite Wypełniasz /etc/ssh/known_hostsplik w sieci odpowiednimi kluczami hosta (zarządzanymi w / puppet itp.), lub wypełniasz swój osobisty plik ~ / .ssh / known_hosts (aby wykonać jeden z nich, możesz przejechać ssh-keyscanprzez znany dobry / bezpieczny połączenie). Blokowanie że (i zakładając, że w ogóle nie dbają o bezpieczeństwo) zbioru UserKnownHostsFile=/dev/nulloraz StrictHostKeyChecking=now twoim ~/.ssh/config file(lub przejść do opcji ssh z -o)
voretaq7
25

Jako użytkownik marionetki moją metodą rozwiązania tego problemu jest fakt, że mój serwer marionetek zbiera klucze hosta SSH i publikuje je we wszystkich moich systemach, które wykonują połączenia SSH.

W ten sposób nie muszę się martwić o ich usunięcie. Dziewięćdziesiąt dziewięć procent czasu, w którym marionetka biegała i aktualizowała mi klucze, ponieważ mam agentów działających co trzydzieści minut. Wyjątki są dla mnie bardzo rzadkie, więc nie mam nic przeciwko szybkiej edycji znanych hostów w całym systemie, jeśli nie chcę czekać.

class ssh::hostkeys {

  @@sshkey { "${::clientcert}_rsa":
    type => rsa,
    key => $sshrsakey,
    tag => 'rsa_key',
  }

  if 'true' == $common::params::sshclient {
    Sshkey <<| tag == 'rsa_key' |>> {
      ensure => present
    }
  }

  file {'/etc/ssh/ssh_known_hosts':
    ensure => present,
    owner => 'root',
    group => 'root',
    mode => 0644,
  }

}
Zoredache
źródło
+1 Dobry ruch do włączenia narzędzi zarządzania konfiguracją.
ewwhite
4

Chciałbym dodać sugestię, która może pomóc w bardzo szczególnych przypadkach, w których bezpieczeństwo ma mniejsze znaczenie.

Mam środowisko laboratoryjne z często instalowanymi maszynami. Za każdym razem, gdy to się dzieje, generowane są nowe klucze hosta (prawdopodobnie mógłbym gdzieś zapisać klucz hosta i ustawić go w skrypcie poinstalacyjnym).

Ponieważ bezpieczeństwo nie stanowi dla mnie problemu w tym środowisku laboratoryjnym, a klucze zmieniają się tak często, w pliku .ssh / config mam następujące elementy:

Host lab-*
  User kenny
  IdentityFile ~/.ssh/lab_id_rsa
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null

Zapewnia to, że połączenie z moimi komputerami laboratoryjnymi nigdy więcej nie spowoduje tego błędu, a mój klient ssh po prostu połączy się bez sprawdzania klucza hosta.

Jest to coś, co powinieneś zrobić tylko wtedy, gdy bezpieczeństwo nie ma dla ciebie żadnego znaczenia, ponieważ stawia cię to w trudnej sytuacji do ataku typu man-in-the-middle.

Kenny Rasschaert
źródło
1
Wydaje się ryzykowne. Chciałbym zachować weryfikację hosta, ponieważ niektóre z nich są systemami publicznymi.
ewwhite
1
Właśnie dlatego wspomniał, że ta metoda jest przeznaczona tylko do „tam, gdzie bezpieczeństwo jest mniej ważne / nie ma znaczenia”. Sieci prywatne / środowiska laboratoryjne są idealne do tej konfiguracji. Systemy produkcyjne / systemy wielkoformatowe z automatycznym skalowaniem, nie tyle.
dannozaur
4

Zgodnie z informacją o wersji openssh 5.6 nie musisz już używać kluczy hostów:

Uwierzytelnianie oparte na hoście może teraz używać kluczy hosta certyfikatu. Klucze urzędu certyfikacji muszą zostać określone w pliku znanego_hosta przy użyciu znacznika @ cert-Authority zgodnie z opisem w sshd (8).

Ostrzeżenie : jak dotąd nie słyszałem o nikim, kto używałby tej funkcji w produkcji. Używaj na własne ryzyko (ale uważam, że programiści openssh są wystarczająco paranoiczni, aby nie wypuszczać takiej zabójczej funkcji bez wielu testów i audytu kodu).


źródło
2

SSHFP DNS ResourceRecord może pomóc w zależności od tego, ile twój klient ssh z niego korzysta. Przechowuj tam wszystkie odciski palców kluczy publicznych ssh wraz z nazwą hosta.

Wcześniej należy zaimplementować DNSSEC lub DNS przez SSL.
http://www.ietf.org/rfc/rfc4255.txt

FreeIPA.org obsługuje zarządzanie kluczami hosta i użytkownika, a także certyfikaty PKI. Automatycznie przesyła również rekordy DNS SSHFP po utworzeniu nowych kluczy.

Demon usług bezpieczeństwa systemu (SSSD) można skonfigurować do buforowania i pobierania kluczy SSH hosta, dzięki czemu aplikacje i usługi muszą szukać kluczy hosta tylko w jednym miejscu. Ponieważ SSSD może wykorzystywać FreeIPA jako jednego z dostawców informacji o tożsamości, FreeIPA zapewnia uniwersalne i scentralizowane repozytorium kluczy. Administratorzy nie muszą się martwić dystrybucją, aktualizacją lub weryfikacją kluczy SSH hosta.

http://docs.fedoraproject.org/en-US/Fedora/17/html/FreeIPA_Guide/host-keys.html

rjt
źródło