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?


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.


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.