Jak edytować znane hosty, gdy kilka hostów ma ten sam adres IP i nazwę DNS?

29

Regularnie ssh do komputera, który jest komputerem z podwójnym bootowaniem OS X / Linux. Dwa wystąpienia systemu operacyjnego nie współużytkują tego samego klucza hosta, dlatego można je postrzegać jako dwa hosty współdzielące ten sam adres IP i DNS. Powiedzmy, że adres IP to 192.168.0.9, a nazwy to hostnameihostname.domainname

O ile rozumiem, rozwiązaniem umożliwiającym połączenie z dwoma hostami jest dodanie ich obu do ~/.ssh/know_hostspliku. Jednakże, jest łatwiej powiedzieć niż zrobić, ponieważ plik jest mieszany, a prawdopodobnie kilka wpisów na hosta ( 192.168.0.9, hostname, hostname.domainname). W rezultacie otrzymałem następujące ostrzeżenie

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

Czy istnieje prosty sposób edycji known_hostspliku przy jednoczesnym zachowaniu skrótów? Na przykład, jak mogę znaleźć linie odpowiadające danemu hostowi? Jak wygenerować skróty dla niektórych znanych hostów?

Idealne rozwiązanie pozwoliłoby mi bezproblemowo połączyć się z tym komputerem za pomocą ssh, bez względu na to, czy go nazywam 192.168.0.9, hostnameczy hostname.domainnameteż używa on klucza hosta Linux lub OSX. Jednak nadal chcę otrzymywać ostrzeżenie, jeśli istnieje prawdziwy atak typu man-in-the-middle, tj. Jeśli użyty zostanie inny klucz niż te dwa.

Frédéric Grosshans
źródło
Co chcesz zrobić? Edytuj to po co?
Rhyuk
@Rhyuk: Edytuj, aby móc rozpoznać jako poprawny zarówno OSX, jak i klucz hosta Linux dla adresu IP, nazwy hosta i nazwy hosta.dnazwa domeny.
Frédéric Grosshans
@Rhyuk: Zredagowałem to pytanie. Czy teraz jest bardziej jasne?
Frédéric Grosshans
2
Czy po prostu zastanowiłeś się, czy obie instalacje mają ten sam klucz?
Zoredache,
3
Jest kilka przypadków, w których uzasadnione jest użycie jednego adresu IP w celu uzyskania dostępu do wielu podmiotów (każdy z indywidualnymi kluczami hosta SSH) i nadal zachowują ścisłą kontrolę, że TYLKO te klucze hosta są tymi, które widzi klient SSH. Np. Niektóre konfiguracje wysokiej dostępności, w których dostęp do klastra jednostek odbywa się za pomocą jednego współużytkowanego adresu IP, ale gdzie (z jakiegoś powodu) klucz hosta SSH widziany przez klientów zmienia się w zależności od tego, która jednostka klastra jest aktualnie aktywna. Innym przypadkiem jest sytuacja, w której wiele hostów SSH znajduje się za zaporą NATed i uzyskuje do nich dostęp z zewnątrz, wszystkie wydają się mieć ten sam adres IP.
IllvilJa

Odpowiedzi:

12

Najprostszym rozwiązaniem jest użycie tych samych kluczy hosta w systemie Linux i OS X. Oznacza to, że wybierz jeden zestaw /etc/ssh/ssh_host_*_key*plików i skopiuj je do drugiego systemu operacyjnego. Następnie ten sam klucz hosta zostanie przedstawiony klientowi SSH bez względu na system operacyjny, z którego się uruchomiłeś, a klient SSH nie będzie mądrzejszy.

jjlin
źródło
Wolałbym wersję kliencką, ale wypróbuję tę, jeśli jej nie znajdę. Nawiasem mówiąc, lokalizacja plików OSX (niestandardowa) /private/etc/ssh_host*nie jest /etc/ssh/ssh_host*.
Frédéric Grosshans
Kopiowanie plików z jednego komputera na drugi (dwa komputery z systemem Linux) nie działało dla mnie. Chociaż zawartość pliku była identyczna, skrót nie był, więc ciągle pojawiał się problem (może czas modyfikacji?). Poniższe rozwiązanie jest znacznie lepsze.
Stav,
sshdładuje klucze hosta raz podczas uruchamiania, więc najprawdopodobniej konieczne będzie ponowne uruchomienie sshd. Dodam to do odpowiedzi. Jeśli chodzi o lepsze rozwiązania, zależy to od twojej sytuacji. Twierdziłbym, że głównymi zaletami tej metody jest to, że wymaga ona tylko jednorazowej konfiguracji i jest bardziej prawdopodobne, że będzie współpracować z wieloma implementacjami klienta SSH.
jjlin,
Co ciekawe, mój stosunkowo nowy OpenSSH 7.4p1 sshdładuje klucze hosta przy każdym nowym połączeniu. Może tak było już dawno i po prostu założyłem, że klucze hosta były traktowane jak inna sshdkonfiguracja. Tak czy inaczej, może to być twój problem.
jjlin,
Czy nie byłoby dobrym pomysłem zrobić to dwóm hostom w klastrze, które mają ten sam adres VRRP? Po przełączeniu awaryjnym host, który odpowie, będzie inny. Chciałbym nie otrzymać ostrzeżenia.
Colin 't Hart
26

Jak @Izzy zasugerował w powyższym komentarzu, ssh mówi ci linię obrażającą, a poprzez usunięcie tej linii (zapisanie jej w innym miejscu), zaakceptowanie nowego klucza, a następnie skopiowanie usuniętej linii z powrotem, otrzymujesz dwa klucze dla tego samego host, a ssh zaakceptuje oba.

(Możesz także użyć ssh-keygen -H -F <hostname>do znalezienia wierszy w pliku znane_hosty, które pasują do tej nazwy hosta. Uruchomienie tego po skopiowaniu usuniętej linii powinno zawierać dwie pozycje).

Jeśli ktoś wie, jak zmusić PuTTY do zrobienia tego samego, byłbym bardzo zainteresowany.

DaCheetah
źródło
4
W rzeczywistości, jeśli masz klienta linux, nie musisz nawet usuwać obrażającej linii, musisz jedynie skomentować ją za pomocą znaku krzyżyka („#”) z przodu. Następnie, po zaakceptowaniu nowego klucza, możesz po prostu edytować plik known_hosts i odkomentować wiersz ze starym kluczem. Ale tak, przydałoby się to również w Putty.
IllvilJa
1
Jeśli istnieją dwa hosty o tej samej nazwie, ale innym adresie IP i innym kluczu hosta, to obejście również działa: Skomentuj (lub tymczasowo usuń), a następnie obie linie dla tego hosta (ten oparty na adresie IP i ten oparty na hoście nazwa), połącz się z nieznanym jeszcze hostem, a następnie ponownie dodaj wiersze, które zostały skomentowane lub usunięte.
Kai Petzke,
13

Znalazłem to, co może ci pomóc w osiągnięciu tego, co chcesz osiągnąć.

Źródło: /programming/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

Utwórz plik konfiguracyjny w swoim katalogu .ssh w następujący sposób:

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

Objaśnienie poniżej (od man ssh_config)

CheckHostIP

Jeśli ta flaga jest ustawiona na „tak”, ssh (1) dodatkowo sprawdzi adres IP hosta w pliku znanego_hosta. Pozwala to ssh wykryć, czy klucz hosta zmienił się z powodu fałszowania DNS. Jeśli opcja jest ustawiona na „nie”, kontrola nie zostanie wykonana. Domyślna wartość to „tak”.

HostKeyAlias

Określa alias, który powinien być używany zamiast rzeczywistej nazwy hosta podczas wyszukiwania lub zapisywania klucza hosta w plikach bazy danych kluczy hosta. Ta opcja jest przydatna do tunelowania połączeń SSH lub do wielu serwerów działających na jednym hoście.

Linia Nazwa użytkownika i Port pozwala uniknąć podawania tych opcji w wierszu polecenia, dzięki czemu możesz po prostu użyć:

% ssh server1
% ssh server2
Rhyuk
źródło
Widziałem ten artykuł, ale nie odpowiada on mojej sprawie: dwa serwery są rozróżniane według numeru portu w artykule, a nie w moim przypadku. Ponadto chciałbym zachować dodatkowe warstwy bezpieczeństwa wniesione przez solone hasze w known_hostsi CheckHostIP.
Frédéric Grosshans
1
@ FrédéricGrosshans, sprawdzam zaznaczone. Nie musisz mieć oddzielnych portów, a opcja HashKnownHosts działa dobrze z HostKeyAlias.
Zoredache,
Wadą tego, o ile się nie mylę, jest to konfigurowane indywidualnie dla każdego klienta, a akceptowana odpowiedź jest konfigurowana tylko na akceptujących serwerach ssh.
FreeSoftwareServers
2

Najłatwiejszym sposobem rozwiązania problemu jest nadanie każdemu hostowi własnego / odrębnego adresu IP. Z 253 adresami dostępnymi w twojej (prywatnej) sieci i IPv4, to nie powinno być nic wielkiego. Daj im stałe adresy IP (ponieważ serwer DHCP zidentyfikuje maszynę na podstawie adresu MAC karty sieciowej i oba otrzymają ten sam adres). Nie widzę żadnego innego rozwiązania, jeśli chcecie zachować środki bezpieczeństwa (których nie oddałbym również za ten mały „komfort”).

Izzy
źródło
W rzeczywistości adres IP nie 192.168.0.xxjest i nie jest prywatny. Jest to „prawdziwy” adres IPv4 podany przez mój uniwersytet, którego nie mogę zmienić.
Frédéric Grosshans
Jeśli sprawdzisz za pomocą Wikipedii , zobaczysz 192.168.0.0 - 192.168.255.255 (twoje pytanie określono 192.168.0.9, które należy do tego zakresu) należy do „Prywatnych przestrzeni adresowych IPv4”. Więc przez „prywatny” nie odnosiłem się do ciebie „posiadającego” go, ale do specyfikacji IETF . W swoim pytaniu nie wskazałeś, że nie możesz zmienić adresu IP, przepraszam - ale przy podanych danych wejściowych moja odpowiedź była odpowiednia.
Izzy
Przepraszam za źle sformułowane pytanie. Nie przegłosowałem.
Frédéric Grosshans
Bez problemu i tnx za poinformowanie mnie - sprawia, że ​​głosowanie jest mniej zniechęcające. Ale inny pomysł: nie jestem pewien, skąd plik znane_hosty bierze nazwę hosta, odwrotny DNS lub oferowany przez klienta. Możesz spróbować zmienić nazwę jednego z „hostów”, aby wyświetlał inną nazwę hosta. Lub, aby dodać oba klucze hosta: ssh powie ci „linię obrażającą” w pliku znanego_hosta (gdy zawiera się # 1 i łączysz się z # 2). Więc możesz skopiować tę linię do innego pliku, usunąć ją ze znanych hostów, pozwolić # 2 połączyć się i dodać jej linię, a następnie dodać usuniętą linię z powrotem. Nie jestem pewien, czy to działa, ale możesz spróbować.
Izzy
2

Nie napotykam tego problemu podczas łączenia się z różnymi skrzynkami VPS współdzielącymi ten sam adres IP, ponieważ każdy z nich ma inny port SSH (20022,30022 itp.), Więc są one zarejestrowane jako znane hosty z różnymi kluczami.

Czy to może być obejście problemu?

Pyheme
źródło
Cześć @Pyheme, witamy w Super User! Zauważ, że to pytanie ma prawie 4 lata. Nie ma nic złego w udzieleniu odpowiedzi, ale pamiętaj, że możliwe, że nie otrzymasz odpowiedzi.
Hewbot,
Nie mam już żadnego komputera z systemem OS X, ale twoja odpowiedź może być przydatna dla kogoś innego. Właśnie o to chodzi w wymianie stosów
Frédéric Grosshans,
@Hewbot ... rzeczywiście, teraz to widzę. Nie wiem dlaczego, pojawił się na liście ostatnich pytań ...
Pyheme 10.04.16
1

Kolejny artykuł , w którym opisano kilka sposobów rozwiązania problemu:

Druga metoda wykorzystuje dwa parametry openSSH: StrictHostKeyCheckini UserKnownHostsFile. Ta metoda naśladuje SSH, konfigurując go tak, aby używał pustego pliku znane_hosty, a NIE prosić o potwierdzenie klucza tożsamości zdalnego hosta.

afk
źródło
Ten artykuł dotyczy niedozwolonego sprawdzania kluczy. Chcę zachować kluczową sprawdzanie, a nie chcę, żeby go zabronić każdym razem hostnamezostanie ponownie uruchomiony w Linut lub OSX
Frédéric Großhans
1
Witamy w Super User! Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik. Zawarłem krótką część, ale może nie być to, co zamierzałeś ...
Tamara Wijsman,
1

Ponieważ chcesz zachować ścisłe sprawdzanie klucza hosta, kazałbym im używać różnych known_hostsplików. Aby to zrobić, skonfiguruj ~/.ssh/configplik (lub /etc/ssh/ssh_configplik, jeśli potrzebujesz go do pracy na wielu lokalnych kontach użytkowników) w następujący sposób:

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

, $REALHOSTNAMEoczywiście zastępując rzeczywistą nazwę hosta lub adres IP. (Nie ma znaczenia, który wybierzesz, tak długo, jak wybierzesz coś po „Nazwie hosta”, które przejdzie do adresu IP, ale użyłbym nazwy hosta zamiast adresu IP, tylko na ogólnych zasadach).

Wtedy ssh myserver.linuxi ssh myserver.osxmogą mieć różne klucze hosta, ale nadal otrzymujesz sprawdzanie. Jeśli to Linux działa i wpiszesz OS X (lub odwrotnie), dostaniesz ostrzeżenie (które moim zdaniem jest pożądanym skutkiem).

Gdybym miał ten problem, upewniłbym się, że w głównym known_hostspliku jest coś zupełnie nie tak , który nie pasuje do żadnego z nich, więc jeśli napiszesz $REALHOSTNAMEzamiast tego myserver.osx, otrzymasz ostrzeżenie. :-) Zrobiłbym to, umieszczając coś takiego

<ip-address-of-github.com> $REALHOSTNAME

w moim /etc/hosts, a następnie zrobienie ssh $REALHOSTNAMEi zaakceptowanie nowego klucza, a następnie wyjęcie tego wpisu.

Jim
źródło