Bezpiecznie dodaj hosta (np. GitHub) do pliku znanego hosta SSH

20

Jak mogę bezpiecznie dodać klucz hosta do known_hostspliku SSH ?

Konfiguruję maszynę programistyczną i chcę (np.) Uniemożliwić gitmonitowanie podczas klonowania repozytorium github.comprzy użyciu protokołu SSH.

Wiem, że mogę użyć StrictHostKeyChecking=no(np. Tej odpowiedzi ), ale to nie jest bezpieczne.

Jak dotąd znalazłem ...

  1. GitHub publikuje swoje odciski palców kluczy SSH na https://help.github.com/articles/github-s-ssh-key-fingerprints/

  2. Mogę użyć, ssh-keyscanaby uzyskać klucz hosta github.com.

Jak połączyć te fakty? Biorąc pod uwagę wstępnie wypełnioną listę odcisków palców, jak sprawdzić, czy dane wyjściowe ssh-keyscanmożna dodać do known_hostspliku?


Chyba pytam o:

Jak uzyskać odcisk palca dla klucza zwróconego przez ssh-keyscan?

Załóżmy, że mam już edycję MITM dla SSH, ale mogę zaufać stronie GitHub HTTPS (ponieważ ma prawidłowy łańcuch certyfikatów).

Oznacza to, że mam pewne (podejrzane) klucze hosta SSH (od ssh-keyscan) i niektóre (zaufane) odciski palców. Jak zweryfikować jedno z drugim?


Powiązane: w jaki sposób mieszam część wyjściową hosta ssh-keyscan? Czy mogę mieszać hosty z hashami / hashami known_hosts?

Roger Lipscombe
źródło
Dlaczego nie byłoby bezpieczne dla twojego przypadku użycia?
quadruplebucky
StrictHostKeyChecking=nojest podatny na MITM. Czy jest ssh-keyscanzabezpieczony przed MITM?
Roger Lipscombe,
Nie rozumiem, dlaczego nadmiernie się martwię o to, że ktoś podszywa się pod nieznajomego, którego nigdy nie spotkałem, któremu ufam na tyle, by napisać kod, który zamierzam pobrać i uruchomić ...
quadruplebucky
1
Ponieważ jest to mój kod źródłowy w prywatnym repozytorium na githubie i nie chcę, aby MITM (np.) Wprowadzał złośliwe zmiany, kiedy wypycham zatwierdzenia. To tylko jeden przykład.
Roger Lipscombe,
Ja (na dobre lub złe) wybieram zaufanie do github. Nie wybieram zaufania do każdego losowego łącza sieciowego między mną a nimi.
Roger Lipscombe,

Odpowiedzi:

12

Najważniejszą częścią „bezpiecznego” dodania klucza do known_hostspliku jest pobranie odcisku klucza od administratora serwera. Kluczowy odcisk palca powinien wyglądać mniej więcej tak:

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

W przypadku GitHub zwykle nie możemy rozmawiać bezpośrednio z administratorem. Jednak umieszczają klucz na swoich stronach internetowych, abyśmy mogli odzyskać informacje z tego miejsca.

Ręczna instalacja klucza

1) Weź kopię klucza z serwera i pobierz jego odcisk palca. NB: Zrób to przed sprawdzeniem odcisku palca.

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2) Uzyskaj kopię klucza linii papilarnych od administratora serwera - w takim przypadku przejdź do strony z informacjami na github.com

  1. Wejdź na github.com
  2. Przejdź do strony pomocy (w menu po prawej stronie, jeśli jesteś zalogowany; na dole strony głównej inaczej).
  3. W sekcji Pierwsze kroki przejdź do Łączenie się z GitHub za pomocą SSH
  4. Przejdź do Testowanie połączenia SSH
  5. Skopiuj odcisk palca SHA256 z tej strony do edytora tekstu do późniejszego wykorzystania.

3) Porównaj klucze z dwóch źródeł

Umieszczając je bezpośrednio jeden nad drugim w edytorze tekstu, łatwo sprawdzić, czy coś się zmieniło

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(Zauważ, że drugi klucz został zmanipulowany, ale wygląda dość podobnie do oryginału - jeśli coś takiego się zdarzy, jesteś poważnie atakowany i powinieneś skontaktować się z zaufanym ekspertem ds. Bezpieczeństwa.)

Jeśli klucze są różne, przerwij procedurę i skontaktuj się z ekspertem ds. Bezpieczeństwa

4) Jeśli klucze są poprawnie porównywane, zainstaluj klucz, który już pobrałeś

cat github-key-temp >> ~/.ssh/known_hosts

Lub zainstalować dla wszystkich użytkowników w systemie (jako root):

cat github-key-temp >> /etc/ssh/ssh_known_hosts

Zautomatyzowana instalacja klucza

Jeśli musisz dodać klucz podczas procesu kompilacji, wykonaj kroki 1-3 powyższej procedury ręcznej.

Po wykonaniu tej czynności sprawdź zawartość github-key-temppliku i utwórz skrypt, aby dodać tę zawartość do pliku znanego hosta.

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

Powinieneś teraz pozbyć się wszelkich sshpoleceń, które zostały StrictHostKeyCheckingwyłączone.

Michael
źródło
17

Możesz mieszać hash / unhashed wpisy w swoim pliku znane_hosty.

Więc jeśli chcesz dodać klucz github, możesz po prostu:

ssh-keyscan github.com >> ~/.ssh/known_hosts

Jeśli chcesz to mieszać, dodaj -H

ssh-keyscan -H github.com >> ~/.ssh/known_hosts

Maleńki
źródło
1
Jaka jest różnica między hashowaniem / unhasowaniem? Wiem, co to jest hashowanie, ale nie dlatego, dlaczego jest stosowane w tym kontekście.
Glen Thomas
3
Hashowanie wpisów pozwala ukryć informacje o hostach, z którymi się łączysz. Sprawdź zaakceptowaną odpowiedź na security.stackexchange.com/questions/56268/…
Wee
4
To nie odpowiada na pytanie. Użycie ssh-keyscan jest uzależnione od ataku człowieka w środku, co oznacza, że ​​przechowywany klucz może być kluczem atakującego próbującego włamać się do twojego systemu. Proszę zobaczyć moją odpowiedź na sposób sprawdzania rzeczy.
Michael
Att. Zwracanie uwagi na niepoprawne odpowiedzi - „dwie najlepsze odpowiedzi są niepewne”
Peter Mortensen
6

Najłatwiej jest ręcznie pobrać klucze za pomocą ssh-keyscan, zweryfikować je ręcznie:

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

I dodaj je do skryptu, który będzie nosił „autorytatywny” klucz publiczny.

Jakuje
źródło
Mam klucze, jak powiedziałeś, w jaki sposób „dodać je do mojego skryptu”?
Glen Thomas
Albo jako osobny plik, albo jako ciąg w skrypcie.
Jakuje
Ta odpowiedź jest niebezpieczna, ponieważ ukrywanie się w „zweryfikuj je ręcznie” to cały trudny proces. Dodałem odpowiedź poniżej, która próbuje wyjaśnić, jak to zrobić i bezpiecznie korzystać z wyników.
Michael
Att. Zwracanie uwagi na niepoprawne odpowiedzi - „dwie najlepsze odpowiedzi są niepewne”
Peter Mortensen
1
@RogerLipscombe Zgadzam się, że odpowiedź może być interpretowana bezpiecznie - „nie weryfikuj ich ręcznie” nie jest wyjaśnione, ale jeśli rozumiesz, że to znaczy „postępować zgodnie z instrukcjami na stronie podręcznika ssh”, to prawdopodobnie byłoby dobrze. Istnieje ryzyko, że ktoś może tego nie zrozumieć i może na przykład spróbować niepewnych rzeczy, takich jak sprawdzenie klucza po zalogowaniu się na serwerze. Dlatego nazwałem tę odpowiedź „niebezpieczną”, a drugą „niepewną” - ważny jest szczegół ręcznego sprawdzania. Dzięki za zaakceptowanie.
Michael