Konfigurowanie odcisków palców ssh na serwerach DNS w celu zastąpienia znanych hostów kończy się niepowodzeniem

13

Rekordy SSHFP zostały wygenerowane na serwerze ssh w następujący sposób, a następnie dodane do strefy w powiązaniu:

$ ssh-keygen -r www.test.us.
www.test.us. IN SSHFP 1 1 ad04dfaf343a93beeb939eed1612168f7eadbed7
www.test.us. IN SSHFP 2 1 432209c72c4f0e99546d601dd96c04ce804191f9

Wymagane rekordy można pobrać z klienta ssh przez DNS, jak pokazano:

$ dig www.test.us any
;; QUESTION SECTION:
;www.test.us.           IN  ANY

;; ANSWER SECTION:
www.test.us.        120 IN  SSHFP   1 1 AD04DFAF343A93BEEB939EED1612168F7EADBED7
www.test.us.        120 IN  SSHFP   2 1 432209C72C4F0E99546D601DD96C04CE804191F9
www.test.us.        120 IN  A   192.168.1.50

Jednak ssh na kliencie nie może ich znaleźć podczas łączenia:

$ rm .ssh/known_hosts
$ ssh -vo VerifyHostKeyDNS=yes www
OpenSSH_5.9p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /Users/test/.ssh/config
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 53: Applying options for *
debug1: Connecting to www [192.168.1.50] port 22.
debug1: Connection established.
debug1: identity file /Users/test/.ssh/id_rsa type 1
debug1: identity file /Users/test/.ssh/id_rsa-cert type -1
debug1: identity file /Users/test/.ssh/id_dsa type -1
debug1: identity file /Users/test/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.8p2_hpn13v11
debug1: match: OpenSSH_5.8p2_hpn13v11 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c
DNS lookup error: name does not exist
The authenticity of host 'www (192.168.1.50)' can't be established.
RSA key fingerprint is 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)?

Wszelkie pomysły, dlaczego to się nie udaje? Wiem, że DNSSEC jest wymagany, aby był bezpieczny i że powinienem otrzymać ostrzeżenie, ponieważ DNSSEC nie jest obecnie włączony. Mam nadzieję, że zacznę działać bez DNSSEC, zanim zacznę rozwiązywać ten problem jako dodatkowy problem.

Serwer ssh to FreeBSD 9.1 z OpenSSH_5.8p2_hpn13v11 i hostuje również DNS przy użyciu BIND 9.8.3-P4. Próbowałem połączyć się z OS X 10.8.2 z OpenSSH_5.9p1, a także Arch Linux 3.6.10-1-ARCH z OpenSSH_6.1p1.

Aktualizacja

W kolejnej próbie rozwiązania tego problemu stworzyłem nową maszynę wirtualną OpenBSD 5.2 z wbudowanym OpenSSH_6.1 jako serwer ssh. Ponieważ wszystkie inne implementacje serwera OpenSSH są tylko portami OpenBSD, na pewno powinno to działać. Na serwerze generuję rekordy SSHFP:

# ssh-keygen -r vm1.test.us.  
vm1.test.us. IN SSHFP 1 1 419c5338920e11183380d81f002fc998389b944f
vm1.test.us. IN SSHFP 1 2 cb5bbbf5aef231f57a1a4dcf1e790f1be032b124d0d591023f33cfd5f91ec556
vm1.test.us. IN SSHFP 2 1 0fdf92ce946b5cfee5f96a3e1ef710edc50280ff
vm1.test.us. IN SSHFP 2 2 f2ee7334ee9f9a426f51f20af8f4bc7155d567c9d38a6bffaa6c643af405711e
vm1.test.us. IN SSHFP 3 1 b5e94320f0bc0b46cc6627ca7221679a65c79962
vm1.test.us. IN SSHFP 3 2 60704213a0bbd8dae813d113bfe4ae190a780b89836e6e1c567b7cfde89805f8

Dodaję je do serwera powiązań FreeBSD i ładuję ponownie o nazwie. Następnie sprawdź, czy mogę uzyskać dostęp do rekordów:

$ host -t any vm1
vm1.test.us has SSHFP record 1 1 419C5338920E11183380D81F002FC998389B944F
vm1.test.us has SSHFP record 1 2 CB5BBBF5AEF231F57A1A4DCF1E790F1BE032B124D0D591023F33CFD5 F91EC556
vm1.test.us has SSHFP record 2 1 0FDF92CE946B5CFEE5F96A3E1EF710EDC50280FF
vm1.test.us has SSHFP record 2 2 F2EE7334EE9F9A426F51F20AF8F4BC7155D567C9D38A6BFFAA6C643A F405711E
vm1.test.us has SSHFP record 3 1 B5E94320F0BC0B46CC6627CA7221679A65C79962
vm1.test.us has SSHFP record 3 2 60704213A0BBD8DAE813D113BFE4AE190A780B89836E6E1C567B7CFD E89805F8
vm1.test.us has address 192.168.1.60


$ dig -t any vm1.test.us
;; QUESTION SECTION:
;vm1.test.us.           IN  ANY

;; ANSWER SECTION:
vm1.test.us.        120 IN  SSHFP   1 2 CB5BBBF5AEF231F57A1A4DCF1E790F1BE032B124D0D591023F33CFD5 F91EC556
vm1.test.us.        120 IN  SSHFP   2 1 0FDF92CE946B5CFEE5F96A3E1EF710EDC50280FF
vm1.test.us.        120 IN  SSHFP   2 2 F2EE7334EE9F9A426F51F20AF8F4BC7155D567C9D38A6BFFAA6C643A F405711E
vm1.test.us.        120 IN  SSHFP   3 1 B5E94320F0BC0B46CC6627CA7221679A65C79962
vm1.test.us.        120 IN  SSHFP   3 2 60704213A0BBD8DAE813D113BFE4AE190A780B89836E6E1C567B7CFD E89805F8
vm1.test.us.        120 IN  SSHFP   1 1 419C5338920E11183380D81F002FC998389B944F
vm1.test.us.        120 IN  A   192.168.1.60

Rekordy są wyraźnie obsługiwane przez DNS, więc próbuję użyć ssh:

$ rm .ssh/known_hosts
$ ssh -vo VerifyHostKeyDNS=yes root@vm1
OpenSSH_5.9p1, OpenSSL 0.9.8r 8 Feb 2011
debug1: Reading configuration data /etc/ssh_config
debug1: Connecting to vm1 [192.168.1.60] port 22.
debug1: Connection established.
debug1: identity file /Users/test/.ssh/id_rsa type 1
debug1: identity file /Users/test/.ssh/id_rsa-cert type -1
debug1: identity file /Users/test/.ssh/id_dsa type -1
debug1: identity file /Users/test/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.1
debug1: match: OpenSSH_6.1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA d8:01:b5:b2:3e:c7:55:ce:19:c1:6d:77:39:92:7d:0f
DNS lookup error: name does not exist
The authenticity of host 'vm1 (192.168.1.60)' can't be established.
RSA key fingerprint is d8:01:b5:b2:3e:c7:55:ce:19:c1:6d:77:39:92:7d:0f.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? 

W tym momencie myślę, że można bezpiecznie wyeliminować klientów i serwery ssh jako punkt awarii. Zamiast tego skupię się na serwerze DNS. Chyba, że ​​ktoś ma sugestię, gdzie szukać, chyba utknąłem przy przechwytywaniu pakietów i kopaniu ich w poszukiwaniu wskazówek.

Aktualizacja 2

Okej, oto wyniki moich przechwyceń pakietów. ssh www; zawodzi ze standardem

No matching host key fingerprint found in DNS.

a przechwytywanie pakietów pokazuje, że DNS nie zwraca rekordu dla wyszukiwania.

mbp13.test.us   www.test.us DNS Standard query 0x1c5e  SSHFP www
www.test.us   mbp13.test.us DNS Standard query response 0x1c5e No such name

Porównaj z ssh www.test.us; co również kończy się niepowodzeniem z komunikatem

No matching host key fingerprint found in DNS.

jednak przechwytywanie pakietów pokazuje, że DNS faktycznie zwraca rekord.

mbp13.test.us   www.test.us DNS Standard query 0x0ebd  SSHFP www.test.us
www.test.us   mbp13.test.us DNS Standard query response 0x0ebd  SSHFP SSHFP`

Po pierwsze, trochę niepokojące jest to, że komunikat o błędzie jest taki sam w obu przypadkach. Mogę dodać niektóre rekordy, aby naprawić przypadek 1, w którym nie są zwracane żadne rekordy, ale dużym problemem jest przypadek 2. DNS działa, a rekordy SSHFP są zwracane do klienta ssh. Żadne pakiety nie są wysyłane po odpowiedzi na zapytanie DNS, a klient ssh natychmiast wyświetla niepasujący komunikat o odcisku palca. Oznacza to, że albo wszyscy klienci ssh, z którymi testuję, są uszkodzeni lub odcisk palca przechowywany w DNS jest niepoprawny i nie pasuje. Wątpię, czy to klienci, więc dlaczego odcisk palca w DNS jest nieprawidłowy? Odciski palców zostały wygenerowane z wbudowanych narzędzi ssh-keygen ssh, jak opisano na samym początku tego postu. Problemowi nie pomaga również fakt, że odciski palców są wyświetlane w różnych formatach w zależności od kontekstu.

DNS record format:      ad04dfaf343a93beeb939eed1612168f7eadbed7
ssh client mesg format: 69:dc:47:97:e1:a5:c9:07:4a:2b:9e:3c:a2:2b:c8:8c

Czy ktoś ma jakieś sugestie, dlaczego odciski palców z ssh-keygen -r nie pasują do kluczy publicznych zwróconych przez ten sam serwer ssh?

Aktualizacja 3

Jestem na ostatniej opcji. O ile ktoś nie wskaże mi właściwego kierunku przed weekendem, spędzę sobotę na tworzeniu zduplikowanego środowiska przy użyciu maszyn wirtualnych całkowicie opartych na OpenBSD. Ponieważ OpenBSD jest właścicielem OpenSSH, muszą to być idealne warunki do działania SSHFP przez DNS. Jeśli serwer OpenBSD OpenSSH z powiązaniem obsługujący klienta OpenBSD OpenSSH nie działa, wówczas SSHFP jest uszkodzony jako zaimplementowany i przeniosę rzeczy na fora OpenBSD i ewentualnie zgłoś błąd. Nadal mam nadzieję, że brakuje mi czegoś oczywistego i że pomocna odpowiedź uratuje mi weekend.

Michael Yasumoto
źródło
Czy próbowałeś się połączyć, aby połączyć się jawnie www.test.us?
Ulrich Dangel
Tak. Przepraszam, powinienem wspomnieć, że wypróbowałem wszystkie odmiany: ssh www; ssh www.test.us; ssh www.test.us .; Wszystkie dają taką samą odpowiedź.
Michael Yasumoto,
Interesujące może być sprawdzenie z Wireshark / tcpdump, czego dotyczy zapytanie z serwera DNS i jaka odpowiedź jest wysyłana. Znajomość dokładnych zapytań i odpowiedzi powinna pomóc w znalezieniu problemu.
Gert van den Berg
Gert, odpowiedziałem w powyższej aktualizacji, ponieważ nie mogłem zmieścić odpowiedzi w tym polu komentarza.
Michael Yasumoto,
Spróbuj połączyć się bezpośrednio przez adres IP - wydaje mi się, że sshjest zdezorientowany przez rekordy DNS niepasujące do nazwy hosta, do której próbujesz się dostać.
peterph

Odpowiedzi:

5

Najwyraźniej moje problemy były spowodowane dwoma różnymi problemami.

Problem nr 1 SSHFP nie obsługuje korzystania ze ścieżek wyszukiwania. Więc jeśli dodasz „domain example.com” do /etc/resolv.conf, możesz oczekiwać, że ssh myhost będzie współpracował z SSHFP, ponieważ zwykłe ssh poprawnie rozwiąże nazwę na myhost.example.com. Najwyraźniej deweloperzy OpenBSD zdają sobie sprawę z tego problemu, ponieważ łatka została wydana 2 lata temu, ale nigdy nie została zastosowana. Zamiast tego zasugerowano włamanie ssh_config, ale to też nie działa. Rozwiązaniem pierwszego problemu jest to, że nazwa FQDN musi zawsze być używana z SSHFP.

Problem nr 2 Używając nazw FQDN do rozwiązania poprzedniego problemu, wszystko działa, jeśli użyję bieżącej wersji klienta OpenSSH, czyli OpenSSH_6.1. Klient OpenSSH_5.8p2 w moim systemie FreeBSD jest w stanie znaleźć rekordy SSHFP dla nowego serwera OpenSSH_6.1, ale nie jest w stanie dopasować odcisku palca otrzymanego z DNS z tym, który otrzymuje z serwera. Klient OpenSSH_5.9p1 na moim komputerze z systemem OS X 10.8.2 nie jest w stanie nawet pobrać rekordów SSHFP dla nowego serwera OpenSSH_6.1, mimo że nigdy nie jest wersją klienta niż maszyna FreeBSD. Oczywiście nie jest w stanie dopasować nieistniejących rekordów SSHFP do odcisku palca zwróconego przez serwer OpenSSH. Wreszcie, ssh-keygen na FreeBSD produkuje złe rekordy SSHFP według klientów OpenSSH_6.1, którzy narzekają na atak MITM, ponieważ nie „ t pasuje do odcisku palca zwróconego przez serwer. Wydaje się, że rozwiązaniem jest uruchomienie bieżącej wersji klienta i serwera OpenSSH, aby SSHFP działał. Korzystanie ze starszej wersji klienta lub serwera wymaga problemów.

Ostatnie przemyślenia Używanie SSHFP z DNS jest najwyraźniej zbyt nowatorskie, aby można je było stosować w mieszanym środowisku systemu operacyjnego i wszystko „po prostu działa”, ponieważ systemy operacyjne inne niż OpenBSD muszą przenosić przenośny OpenSSH, który jest nieaktualny do czasu jego przeniesienia. Być może za 3-5 lat SSHFP będzie wystarczająco stabilny, aby nawet starsze wersje, które są przeniesione do innych systemów operacyjnych, były również stabilne i kompatybilne z najnowszą wersją.

Michael Yasumoto
źródło
2
Pomimo faktu, że OS X (10.9) zawiera teraz wersję OpenSSH 6.X, SSHFP nadal nie działa z powodu zepsutej implementacji OS X, jak donosi GitHub. Zastąpienie innym klientem OpenSSH, takim jak MacPorts, jest obecnie jedynym rozwiązaniem.
Michael Yasumoto
0

Nazwa hosta serwera SSH, z którym się łączy, musi dokładnie odpowiadać nazwie hosta w rekordzie SSHFP. Oznacza to, że rozpoznawanie dwóch nazw hostów na tym samym adresie IP jest niewystarczające. Dlatego ssh wwwnie będzie działać dla SSHFP, które są dla www.test.us., chyba że www jest w konfiguracji SSH w następujący sposób:

Host www
    Hostname www.test.us

Spróbować ssh www.test.us.

htoip
źródło
1
Przepraszam, ale wygląda na to, że nie przeczytałeś mojego pełnego wpisu powyżej. Testowałem przy użyciu w pełni kwalifikowanych nazw domen (FQDN) i to nie był problem.
Michael Yasumoto
0

Musisz podać nazwę pliku klucza publicznego usługi, dla której tworzysz rekordy DNS. W przeciwnym razie użyje twoich osobistych plików kluczy publicznych z .ssh / *. Pub jako domyślnej rezerwowej.

ssh-keygen -r vm1.test.us -f /etc/ssh/ssh_host_rsa_key.pub
Wilk
źródło