Jakie są możliwe problemy z bezpieczeństwem demona SSH?

14

Chciałbym mieć możliwość połączenia SSH z komputerem biurowym Ubuntu 10.04 z zewnątrz. Zastanawiam się więc nad uruchomieniem demona SSH na PC. Jakie są problemy z bezpieczeństwem, możliwe usterki, określone ustawienia konfiguracji itp. Powinienem być świadomy?

W przypadku, gdy ma to znaczenie: jest to wyłącznie na mój własny użytek, nie sądzę, że będą inni ludzie; jest to komputer Ubuntu 10.04 w środowisku głównie Windows 7 / Vista / XP.

ev-br
źródło
1
Możesz również rozważyć zainstalowanie OpenVPN i utworzyć tunel VPN na komputerze dla połączenia ssh. W ten sposób nie musisz otwierać portu ssh na świat.
Linker3000,
@ Linker3000 Thanks! Zastanowię się nad tym - mimo że jakiś czas temu miałem dość nieprzyjemne doświadczenia z VPN.
ev-br
@Zhenya Jeśli nie zwolnisz miejsca „@” i nazwy użytkownika, otrzymają powiadomienie o odpowiedzi. ;) Więc otrzymasz komentarz, gdy użyję @Zhenya, ale nie, gdy
użyję
@Zhenya A teraz robisz to ponownie XD
BloodPhilia
@Linker, czy możesz wyjaśnić, dlaczego OpenVPN jest bezpieczniejszy niż SSH?
Arjan

Odpowiedzi:

20

Największym problemem byłyby osoby logujące się jako administrator komputera przez SSH. Można to zrobić brutalną siłą, jeśli masz łatwe do odgadnięcia hasło.

Istnieje kilka środków bezpieczeństwa, które możesz podjąć, poniżej niektóre z tych, które zawsze podejmuję podczas konfigurowania serwera SSH i niektóre dodatkowe.

  1. Użyj silnego hasła, składającego się z co najmniej (powiedzmy) 10 wielkich i małych liter, cyfr i innych znaków.

  2. Więzić użytkowników do ich katalogu domowego. Więzieni użytkownicy nie będą mogli uzyskać dostępu / edytować plików znajdujących się poza ich katalogiem domowym. Dlatego użytkownik nie będzie mógł uzyskać dostępu / edytować kluczowych plików systemowych. Wiele samouczków można znaleźć w Internecie, jak uwięzić użytkownika. Większość z nich korzysta z JailKit . Przykład takiego samouczka można znaleźć tutaj . Alternatywnie możesz również użyć natywnej ChrootDirectorydyrektywy serwera OpenSSH . Przykład samouczka na ten temat można znaleźć tutaj .

  3. Zainstaluj Fail2Ban . Fail2Ban to program, który sprawdza dzienniki uwierzytelniania pod kątem nieprawidłowych wpisów. Po osiągnięciu określonego limitu dodaje blok zapory dla tego określonego adresu IP na określony czas. Istnieje również kilka samouczków online dotyczących konfigurowania Fail2Ban z SSH, przykładem może być ten . Strona główna Fail2Ban zawiera również kilka fajnych i kompletnych HOWTO.

  4. Wyłącz logowanie roota przez SSH. Jest to użytkownik, który ma dostęp do prawie każdego pliku w systemie, dlatego zaleca się wyłączenie logowania do powłoki. W najnowszych wersjach Ubuntu użytkownik root jest automatycznie wyłączany, ale i tak nie przeszkadza mu dostęp do SSH. Odbywa się to poprzez edycję pliku /etc/ssh/sshd_config. Poszukaj następującej linii i upewnij się, że nie ma przed nią #.

    #PermitRootLogin no
    
  5. Użyj niestandardowego portu (np. Nie 22) Odbywa się to poprzez przekierowanie portów w routerze (np. 16121 -> 22 zamiast 22 -> 22) lub poprzez wymuszenie przez demona SSH nasłuchu na innym porcie. To sprawi, że twoja usługa SSH będzie trudniejsza do wykrycia dla złośliwych użytkowników. Odbywa się to poprzez edycję pliku /etc/ssh/sshd_config. Poszukaj następującej linii i zmień 22 na dowolny żądany port. Nie zapomnij później przekazać poprawnego portu w routerze.

    Port 22
    
  6. Nie używaj haseł do logowania. Oprócz haseł SSH umożliwia także logowanie przy użyciu kluczy prywatnych. Oznacza to, że klucz jest przechowywany na komputerze, na którym uzyskujesz dostęp do SSH maszyny SSH. Podczas próby połączenia klient SSH używa klucza do zalogowania się na serwerze zamiast uwierzytelniania za pomocą hasła. Klucze uwierzytelniające są znacznie silniejsze kryptograficznie niż hasła i dlatego nie są tak łatwe do złamania. Istnieje również kilka samouczków online dotyczących konfigurowania uwierzytelniania opartego na kluczach za pomocą SSH, przykładem może być ten . (Jeśli korzystasz z SSH w systemie Windows za pomocą PuTTY, sprawdź ten link, aby uzyskać instrukcje dotyczące PuTTY.) Po skonfigurowaniu uwierzytelniania opartego na kluczach możesz wyłączyć uwierzytelnianie za pomocą hasła, edytując plik /etc/ssh/sshd_config. Poszukaj następującego wiersza i upewnij się, że nie ma przed nim #.

    #PasswordAuthentication no
    
  7. Opcjonalnie, jak wspomniał @ Linker3000 w swoim komentarzu, możesz skonfigurować tunel VPN do komputera, do którego chcesz uzyskać dostęp przez SSH, a następnie uniemożliwić dostęp do sieci nielokalnej na serwerze SSH. W ten sposób żadne urządzenie zewnętrzne bez połączenia VPN nie będzie mogło uzyskać dostępu do serwera SSH. Można to zrobić, odmawiając WSZYSTKIM hostom, a następnie pozwalając na logowanie się tylko do adresów IP sieci lokalnej. Odbywa się to poprzez edycję /etc/hosts.denyi dodanie:

    sshd: ALL
    

    i /etc/hosts.allowdodać następujące:

    sshd: 192.168.1.*
    

    gdzie adres IP odpowiada adresowi Twojej sieci lokalnej. *jest symbolem wieloznacznym, więc wszystkie adresy IP zaczynające się od 192.168.1.będą akceptowane. Jeśli to nie zadziała, Twoja dystrybucja może użyć sshzamiast sshd. W takim przypadku powinieneś spróbować ssh: 192.168.1.*i ssh: ALLzamiast tego.

  8. Możesz zezwolić tylko na określone hosty, zrób to samo z /etc/hosts.allowi /etc/hosts.denyzgodnie z opisem w 6, ale /etc/hosts.allowdodaj następujący wiersz i każdy host, aby umożliwić rozdzielenie spacjami:

    sshd: {IP OF HOST TO ALLOW 1} {IP OF HOST TO ALLOW 2} {IP OF HOST TO ALLOW 3} {ETC.}
    
  9. Zezwalaj tylko określonym użytkownikom na dostęp do twojego serwera SSH. Odbywa się to poprzez edycję pliku /etc/ssh/sshd_config. Poszukaj następującej linii i upewnij się, że nie ma przed nią #. Jeśli nie istnieje, utwórz go. Na przykład, jeśli chcesz zezwolić tylko na Johna, Toma i Mary, dodaj / edytuj ten wiersz:

    AllowUsers john tom mary
    

    Możesz także odmówić określonym użytkownikom, na przykład, jeśli chcesz odmówić dostępu do Johna, Toma i Mary, dodaj / edytuj ten wiersz:

    DenyUsers john tom mary
    
  10. Zezwól tylko protokołowi SSH2 na połączenia przychodzące. Istnieją dwie wersje protokołu SSH. SSH1 podlega problemom z bezpieczeństwem, dlatego zaleca się korzystanie z SSH 2. Można to wymusić poprzez edycję pliku /etc/ssh/sshd_config. Poszukaj następującej linii i upewnij się, że nie ma przed nią #. Jeśli nie istnieje, utwórz go.

    Protocol 2,1
    

    usuń 1, więc linia będzie

    Protocol 2
    
  11. Nie zezwalaj użytkownikom na logowanie się bez ustawionego hasła. Można to wymusić poprzez edycję pliku /etc/ssh/sshd_config. Poszukaj następującej linii i upewnij się, że nie ma przed nią #. Jeśli nie istnieje, utwórz go.

    PermitEmptyPasswords no
    
  12. I chociaż jest to proste i być może nie trzeba dodawać, ale okazało się kluczowe w wielu przypadkach, aktualizuj oprogramowanie. Regularnie aktualizuj zainstalowane pakiety / oprogramowanie.


= po edycji pliku konfiguracyjnego SSH nie zapomnij zrestartować demona, aby zastosować zmiany. Uruchom ponownie demona, wykonując:

sudo /etc/init.d/ssh restart

lub

sudo /etc/init.d/sshd restart

w zależności od używanej dystrybucji Linuksa.

BloodPhilia
źródło
2
sudo service ssh restartna Ubuntu.
ulidtko
@ulidtko To pytanie zostało połączone z bardziej ogólnym pytaniem, dzięki czemu moja odpowiedź jest bardziej ogólna i odpowiednia dla różnych dystrybucji. Będzie to działać na prawie wszystkich dystrybucjach, ale masz rację.
BloodPhilia
@BloodPhilia Bardzo dziękuję za tak szczegółową i dostępną odpowiedź! Kilka dalszych pytań dotyczących twoich punktów: 1. Jaka jest zaleta więzienia użytkowników po prostu ograniczenie uprawnień? Powiedzmy, że logując się jako „użytkownik” mam dostęp tylko do odczytu do rzeczy poza moim / home, ale nie mam dostępu do zapisu ani wykonywania [jak domyślnie Ubuntu, jak sądzę]. Czy to jest lepsze / gorsze niż więzienie? 2. Gdzie zwykle znajdują się dzienniki uwierzytelnienia? Chciałbym móc raz na jakiś czas sprawdzać je ręcznie / przez grep.
ev-br
@BloodPhilia 4. Jeśli zmuszę sshd do nasłuchiwania niestandardowego portu na serwerze, np. 1234, to w jaki sposób można połączyć się z tym serwerem z linii poleceń linux na kliencie? Mam na myśli, czy standardowe polecenie ssh potrzebuje jakiegoś przełącznika?
ev-br
1
@ulidtko: Z Upstart, sudo restart ssh.
Hello71
7

Kilka wskazówek:

  1. Używaj uwierzytelniania opartego na kluczach, które jest BEZPIECZNIEJSZE niż hasła
  2. Tylko SSH 2
  3. Wyłącz rootowanie logowania
  4. Dla paranoika zmień port ze standardowego portu 22
  5. Dla wygody użyj narzędzia do mapowania adresu IP na nazwę DNS, na przykład Dyndns lub podobną. Możesz spędzać dużo czasu z tym samym adresem IP, ale gdy pewnego razu podróżujesz i potrzebujesz go, przekonasz się, że dostałeś nowy.
  6. Oczywiście zezwalaj tylko na port potrzebny do SSH (port 22 lub niestandardowy, jeśli wybierzesz) przez zaporę.
Brian
źródło
1
Odp 5: Jeśli masz konto e-mail na maszynie poza domem, możesz skonfigurować zadanie CRON, aby okresowo wysyłać wiadomości z komputera domowego na ten adres. Twój domowy adres IP będzie w nagłówkach. Nie tak wygodny jak DNS, ale użyteczny.
garyjohn
Możesz również skontaktować się ze swoim dostawcą usług internetowych i poprosić o cenę za statyczny adres IP. Jest to zdecydowanie najprostsze rozwiązanie ze wszystkich, ale zwykle droższe niż dynamiczny DNS
Steen Schütt,
2

Głównym ryzykiem jest zapomnienie, że prowadzisz serwer ssh i wprowadzenie słabego hasła do konta. Istnieją osoby atakujące, które systematycznie próbują pospolitych nazw kont (takich jak webmasteri bob) i słabych haseł. Można wyeliminować to ryzyko poprzez zakazanie logowania hasło (umieścić PasswordAuthentication now sshd_config, i albo też umieścić UsePAM Nolub wyłączenie uwierzytelniania hasła w ustawieniach PAM dla ssh). Środkiem pośrednim jest ograniczenie logowania ssh do białej listy użytkowników z AllowUserslub AllowGroupsw sshd_config.

Pamiętaj, że zezwolenie na logowanie się hasłem samo w sobie nie stanowi problemu bezpieczeństwa. Problemem są słabe hasła i niepoprawne hasła, a umożliwienie uwierzytelnienia hasła na serwerze ssh jest możliwe. Aby zabezpieczyć się przed szpiegowaniem haseł, nigdy nie wpisuj swojego hasła na maszynie, której nie w pełni ufasz (ale jeśli ufasz maszynie, równie dobrze możesz zainstalować na niej klucz prywatny, a następnie nie potrzebujesz uwierzytelniania hasłem).

Minimalne wymaganie do używania klienta ssh na maszynie polega na tym, że ufasz, że nie nastąpi aktywne przejęcie komunikacji ssh (atak man-in-the-middle jest możliwy, jeśli jest uruchomiony na maszynie klienta - myślisz wpisujesz komendy w nieskazitelnym kliencie ssh, ale klient w rzeczywistości wiernie przesyła twoje dane uwierzytelniające, ale także wprowadza konia trojańskiego do komunikacji). Jest to słabszy wymóg niż ufanie, że nie będzie snooper hasła (zwykle wykonywany za pomocą keyloggera, ale są też inne mniej zautomatyzowane metody, takie jak surfowanie na ramionach). Jeśli masz minimalne zaufanie, ale nadal boisz się szpiegów, możesz użyć haseł jednorazowych (OpenSSH obsługuje je poprzez obsługę PAM).

Oczywiście, jak każdy inny program, który wchodzi w interakcję z maszynami poza twoją kontrolą (nie tylko serwery sieciowe, ale także klienci), musisz nadążać za aktualizacjami bezpieczeństwa.

Gilles „SO- przestań być zły”
źródło
2

Przyszło mi do głowy trzy rzeczy:

  1. Jeśli otworzysz domyślny port 22, to wkrótce zostanie on wykryty, a twój komputer zostanie wbity w ataki siłowe. Sugeruję skonfigurowanie sshd, aby nasłuchiwał innego portu lub przeprowadzał mapowanie portów na zaporze. Chociaż nie jest to magiczna kula, na pewno zaoszczędzi ci co najmniej tyle samo cykli procesora.

    Port 12345

  2. Jawnie wyłącz uwierzytelnianie za pomocą hasła i używaj tylko kluczy. Każdy klucz będzie lepszy niż najbardziej złożone hasło, które możesz zapamiętać.

    Hasło Numer uwierzytelnienia

  3. Chociaż Ubuntu ma domyślnie wyłączonego użytkownika root, jawnie wyłącz logowanie roota

    PermitRootLogin no

shpokas
źródło