Dlaczego powinienem używać uwierzytelniania klucza publicznego dla SSH?

26

Korzystam z serwera SSH i nadal używam prostego uwierzytelniania hasłem. Wszędzie, gdzie czytam o bezpieczeństwie, zaleca się korzystanie z uwierzytelniania klucza publicznego. Ale nie mam zalet. Używanie ich jest, moim zdaniem, niepewne lub wymaga dużo pracy.

Oczywiście, jeśli ktoś spróbuje brutalnie wymusić logowanie do mojego serwera SSH, klucz publiczny jest znacznie silniejszy niż jakiekolwiek hasło. Ale poza tym jest całkowicie niepewny.

Doradcy najczęściej twierdzą, że nie musisz pamiętać hasła. Jak niebezpieczne to jest? Więc jeśli ktoś włamie się na mój komputer, nie tylko dostanie mój komputer, ale także mój serwer? Jeśli używam SSH od różnych klientów, muszę przechowywać klucze publiczne po jednym dla każdego z nich, co zwielokrotnia prawdopodobieństwo, że wpadną w fałszywe ręce. Mógłbym zapisać je na pendrivie, który noszę ze sobą, ale można go zgubić, a wyszukiwarka ma dostęp do mojego serwera.

Być może lepiej służy mi uwierzytelnianie dwuskładnikowe.

Czy brakuje mi argumentu? Jaki jest dla mnie najlepszy sposób?

Aravor
źródło
10
Prawidłowo wykonane uwierzytelnianie za pomocą klucza publicznego jest formą 2FA z czymś, co znasz (hasło do klucza prywatnego) i czymś, co masz (klucz prywatny).
Sven
1
@EEAA Dlaczego to tak ważne, dopóki Twój klucz prywatny ma taki klucz?
user253751
6
Za pomocą klucza prywatnego, jeśli przez pomyłkę nakłonię cię do połączenia się z niewłaściwym serwerem, nie wpisujesz hasła na moim serwerze.
user253751
1
Wiele organizacji musi (z jakiegokolwiek powodu) wymagać użycia uwierzytelniania dwuskładnikowego. Jest to niemożliwe, polegając na zaszyfrowanych kluczach prywatnych.
EEAA
6
Jeśli chodzi o to, co jest warte, głęboko nie zgadzam się ze Svenem co do klasyfikacji klucza prywatnego jako czegoś, co masz . Nie spełnia podstawowego testu czegoś, co masz , ponieważ jest arbitralnie odtwarzalny, będąc po prostu danymi cyfrowymi. Samo uwierzytelnianie za pomocą klucza publicznego nie jest 2FA; jeśli powiesz sobie, że tak, oszukujesz się w kwestii swojego bezpieczeństwa.
MadHatter obsługuje Monikę

Odpowiedzi:

32

jeśli ktoś włamie się na mój komputer, nie tylko dostanie mój komputer, ale także mój serwer?

Jest to potencjalnie prawda w przypadku keyloggerów: gdy tylko zalogujesz się do swojego serwera z zainfekowanego komputera, otrzymają hasło.

Ale klucze mają 3 zalety:

1) Uwierzytelnianie w pamięci podręcznej. Wprowadź hasło raz, wykonaj wiele poleceń ssh. Jest to bardzo przydatne, jeśli używasz czegoś, co używa ssh jako transportu, takiego jak scp, rsync lub git.

2) Uwierzytelnianie skalowalne. Wpisz swoje hasło raz, zaloguj się na wiele komputerów . Im więcej posiadasz maszyn, tym bardziej jest to przydatne. Jeśli masz 100 maszyn, co robisz? Nie możesz użyć tego samego hasła (chyba że jest to farma klonów) i nie pamiętasz tylu. Musisz więc użyć menedżera haseł i wrócić do jednego kompromisu. Skutecznie kluczem hasło jest Twój menedżer haseł.

2b) Skaluje się w drugą stronę, jeśli masz wielu administratorów korzystających z tych samych systemów, ponieważ możesz odwołać klucze od użytkownika A bez konieczności informowania B, C, D, E, F ... o zmianie hasła.

(Można to również zrobić z indywidualnymi kontami i sudo, ale wtedy trzeba je jakoś uzupełnić)

3) Automatyzacja i częściowe przekazanie uprawnień. Możesz skonfigurować SSH, aby uruchamiał określone polecenie, gdy łączy się klucz . Umożliwia to zautomatyzowanemu procesowi w systemie A zrobienie czegoś w systemie B bez pełnego zaufania między nimi bez hasła.

(Jest to zamiennik rlogin / rsh, który był przezabawnie niepewny)

Edycja: kolejną zaletą kluczy publicznych zamiast haseł jest powszechny scenariusz, w którym serwer jest narażony na atak przez lukę. W takim przypadku zalogowanie się przy użyciu hasła powoduje natychmiastowe złamanie hasła. Logowanie za pomocą klucza nie! Powiedziałbym, że jest to częstsze niż narażanie się na atak administratora.

pjc50
źródło
2
2b jest bardzo ważny. autoryzowanymi kluczami można łatwo zarządzać centralnie, zmiana hasła i rozpowszechnianie go wśród wszystkich użytkowników wymaga więcej pracy.
Jonas Schäfer
Jakie są techniki centralnego zarządzania autoryzowanymi kluczami? (Jestem zaznajomiony z umieszczaniem plików autoryzowanych
kluczy
1
W momencie, gdy masz kilkadziesiąt lub setki serwerów, prawdopodobnie używasz Chef, Ansible, Puppet, Holo lub czegoś takiego, który nimi zarządza. Lub masz autoryzowane klucze w LDAP lub innej bazie danych.
Jonas Schäfer
1
Nie zapomnij o przekazywaniu agentów: możesz zalogować się za pomocą, ssh -Aa stamtąd, zalogować się na komputerach, które zezwalają publicznie hostowi, z którego pochodzi.
Halfgaar,
@Halfgaar ... bez zmiany czegokolwiek na hoście, z którego się łączysz. Właśnie nauczyłem się tej funkcji i uwielbiam ją!
Kanadyjczyk Luke REINSTATE MONICA
12

Jeśli używasz dobrych haseł, może to być wystarczająco bezpieczne. Zazwyczaj ograniczam liczbę publicznie dostępnych serwerów do minimum i zezwalam na SSH z określonych adresów IP, o ile to możliwe.

Możesz także chronić swoje klucze hasłem (hasłem). Hasło to należy wprowadzić zawsze, gdy konieczne jest zalogowanie się na serwerach. Nikt nie może wtedy użyć Twojego klucza, chyba że podasz odpowiednie hasło.

Istnieją podobne posty:

  1. Prześlij z błędu serwera .
  2. Prześlij z wymiany stosu zabezpieczeń .
  3. Post od administratora .
Khaled
źródło
2
Hasło jest koniecznością IMHO. Korzystając z ssh-agent, spójrz na opcję -t ssh-add, aby po pewnym czasie zwolnić klucze.
fuero
12

Jednym ze sposobów, w którym autoryzacja klucza publicznego jest bardziej bezpieczna, jest to, że osoba atakująca udaje się w stanie man-in-the-middle (MitM) między komputerem klienckim a serwerem i nie zauważasz zmieniającego się klucza hosta (prawdopodobnie dlatego, że nie zrobiłeś tego nie mają starego klucza, np. ponieważ po raz pierwszy używam tego konkretnego komputera klienckiego).

(To samo dotyczy sytuacji, gdy osoba atakująca zdoła przejąć kontrolę nad serwerem, a istnieją inne serwery, na których działają te same dane uwierzytelniające).

W przypadku standardowego uwierzytelniania opartego na haśle hasło jest przesyłane (wewnątrz szyfrowanego połączenia) zwykłym tekstem, prawdziwy serwer zwykle je haszuje i porównuje wynik z hashem przechowywanym w bazie danych haseł. Atakujący MitM może zamiast tego wziąć to hasło, otworzyć połączenie z prawdziwym serwerem i zalogować się tam ... i albo przekazać Ci zawartość (żebyś nic nie zauważył), albo po prostu zrobić swoje własne złe rzeczy na twoim serwerze .

W przypadku uwierzytelniania za pomocą klucza publicznego klient zasadniczo podpisuje niektóre dane znane zarówno serwerowi, jak i klientowi, aby udowodnić, że posiada klucz prywatny, i wysyła podpis na serwer. Te podpisane dane zawierają identyfikator sesji, który zależy od liczb losowych wybranych zarówno przez klienta, jak i serwer, a zatem jest różny dla każdej sesji. Jeśli MitM otworzy własne połączenie SSH z prawdziwym serwerem, będzie ono miało inny identyfikator sesji, a zatem podpis podany przez klienta nie będzie tam działał.

Oczywiście, jak już powiedziano w innych odpowiedziach, musisz zabezpieczyć swój klucz prywatny, np. Zaszyfrowany hasłem lub ewentualnie na oddzielnym urządzeniu, które tworzy podpisy dopiero po wprowadzeniu kodu PIN.

Paŭlo Ebermann
źródło
2

OpenSSH może zachować własny urząd certyfikacji do zarządzania kluczami hosta i klienta SSH i może używać na nich list odwołania. Może to zwiększyć bezpieczeństwo zapewniane przez uwierzytelnianie oparte na kluczach.

fuero
źródło
2

Masz rację co do roszczenia „nie potrzebujesz hasła”. To jest naprawdę niepewne po stronie klienta.

Tym, co pozwala na znacznie bezpieczniejsze logowanie tylko kluczy publicznych, jest fakt, że nie ma sposobu na brutalny dostęp do twojego serwera. Jedyne, co może osiągnąć atakujący, to obciążenie twojego serwera - możesz użyć fail2ban, aby utrzymać to pod kontrolą.

Dla bezpieczeństwa po stronie klienta należy chronić klucz prywatny za pomocą dobrego hasła. Oczywiście teraz łączenie się z serwerem jest bardziej kłopotliwe niż przy użyciu hasła. Aby temu zaradzić, możesz użyć agenta ssh do przechowywania klucza prywatnego w pamięci, jeśli zamierzasz połączyć się z serwerem kilka razy z rzędu. Dobrą praktyką jest ograniczenie czasu, przez jaki klucz powinien być przechowywany w pamięci.

guntbert
źródło
3
nie ma sposobu na brutalny dostęp ... nie powiedziałbym, że nie można ... możesz brutalnie wyłudzić klucz prywatny w taki sam sposób jak hasło, ale masz o wiele więcej entropii w kluczu prywatnym niż w ogólnym haśle, co czyni go całkiem bezużyteczne (jak dotąd bez komputerów kwantowych).
Jakuje
0

Być może lepiej służy mi uwierzytelnianie dwuskładnikowe.

Jedną z możliwości 2FA dla SSH (i taką, która wymaga stosunkowo niewielkiej konfiguracji / złożoności) jest użycie klucza publicznego i hasła.

Uważam, że AuthenticationMethods publickey,keyboard-interactivemożna dodać coś podobnego /etc/ssh/sshd_configdo tego, aby to zadziałało.

Mówiąc bardziej ogólnie, problemem jest to, że hasła (same) nie są świetną metodą uwierzytelniania, ponieważ często mają wątpliwą jakość. Bardzo prosty „argument” dla kluczy a haseł polega na tym, że klucz będzie miał co najmniej 2048 bitów, a często więcej (w przypadku kluczy EC byłaby to siła efektywna, a nie rzeczywisty rozmiar). Te bity są również generowane przez kryptologicznie bezpieczny (lub odpowiedni) mechanizm.

Hasło ma często mniej niż 2048 bitów i często nie pochodzi z kryptograficznie bezpiecznego źródła.

Możesz także zabezpieczyć klucze hasłem, aby uchronić się przed problemami związanymi z ich utratą (chociaż ktoś może spróbować brutalnie wymusić to hasło).

Zasadniczo różnice między kluczami i hasłami można uczynić dość przejrzystymi, a używanie kluczy zapewnia lepsze hasło niż człowiek. Nie oznacza to, że są panaceum, ale średnio zapewniają większe bezpieczeństwo niż hasła.

iwaseatenbyagrue
źródło