Poradniki > Jak poprawić bezpieczeństwo SSH na Ubuntu 18.04

Jak poprawić bezpieczeństwo SSH na Ubuntu 18.04

Opublikowany: 16 stycznia 2020

Security SSH Ubuntu

Usługa SSH jest głównym punktem dostępu do Twojego Serwera Cloud, przez co jest najbardziej narażona na ataki. Niniejszy poradnik pomoże Ci w podniesieniu bezpieczeństwa usługi dzięki różnym opcjom i technikom.

Zmiana nasłuchiwanych portów

Standardowym portem do nasłuchiwania połączeń SSH jest 22: zmiana tego ustawienia pozwoli na ukrycie usługi i podniesienie bezpieczeństwa połączenia.

W celu uniknięcia zakłócenia pracy innych usług na maszynie, dobrze jest sprawdzić które porty są obecnie wykorzystywane za pomocą komendy netstat:

 $ netstat -n -l
    
Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address State
tcp        0 0 127.0.0.1:3306          0.0.0.0:* LISTEN
tcp        0 0 127.0.0.53:53           0.0.0.0:* LISTEN
tcp        0 0 0.0.0.0:22              0.0.0.0:* LISTEN
tcp6       0 0 :::80                   :::* LISTEN
tcp6       0 0 :::22                   :::* LISTEN
udp        0 0 127.0.0.53:53           0.0.0.0:*

Parametr -l dodany do komendy wymusza wylistowanie wszystkich połączeń, które są w trakcie NASŁUCHIWANIA. W powyższym przypadku wykorzystywane są następujące porty:

  • 3306 usługa MySQL

  • 22 SSH

  • 80 Apache2 / HTTP

  • 53 DNS

Zmianę portów przeprowadza się poprzez edycję pliku konfiguracyjnego / etc / ssh / sshd_config, a dokładniej poprzez odkomentowanie dyrektyw Port:

#Port 22

Następnie wprowadź nową wartość, najlepiej jak najwyższą, aby uniknąć przejęcia jej przez oprogramowanie do automatycznego skanowania portów (na przykład 2200, 5574, 1022):

Port 5574

Zatwierdź zmiany poprzez przeładowanie usługi za pomocą komendy:

 $ sudo service sshd reload

Przeładowując usługę utrzymuj aktywne połączenie, dzięki czemu możesz poprawić ewentualne błędy i sprawdzić ustanowiony poziom dostępowy za pomocą innego klienta SSH.

Po wprowadzeniu zmian podłącz się do swojego serwera poprzez nowy port. Jeśli korzystasz z klienta SSH, możesz to zrobić za pomocą linii komend:

 $ ssh root@<SERVER.IP> -p 5574

Wykorzystanie kluczy do autentykacji

Dostęp poprzez klucze RSA jest alternatywą dla dostępu za pomocą podania hasła i jest szeroko wykorzystywany ze względu na wysoki poziom bezpieczeństwa. W przypadku tego typu autentykacji klient generuje klucz prywatny i powiązany klucz publiczny, który jest zainstalowany na maszynie w celu jednoznacznej autoryzacji klienta.

Aby zainstalować klucz publiczny, klient musi najpierw wygenerować parę kluczy za pomocą komendy ssh-keygen:

 $ ssh-keygen
Generating public/private rsa key pair.
Enter file where to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.

Przed rozpoczęciem generowania, ssh-keygen poprosi o wprowadzenie opcjonalnej frazy (passphrase), którą można wykorzystać w celu autentykacji. W naszym przykładzie, w celu ułatwienia dostępu, pole pozostało puste.

Po zakończeniu operacji oprogramowanie zapisze dwa pliki w wyznaczonej lokalizacji:

  • id_rsa: klucz prywatny klienta, który nie powinien być nikomu udostępniany.

  • id_rsa.pub: klucz publiczny do udostępnienia.

Aby przygotować środowisko serwera, stwórz plik o nazwie authorized_keys w podfolderze .ssh folderu użytkownika, którego chcesz wykorzystać do logowania:

 $ sudo mkdir ~/.ssh
 $ sudo touch ~/.ssh/authorized_keys
 $ sudo chmod 600 ~/.ssh/authorized_keys

Upewnij się, że plik ma uprawnienia jak powyżej.

Następnie wklej klucz publiczny wcześniej przygotowany na maszynie klienta:

 $ sudo nano ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCoTzd9RnqT0yioQG1klsLEK/VG9myo7CQ47aRXu7hnPit6Lgw5kAjC7vzNWYLTy2oIlsrVI7R/tvWmVNISGkWDp9U3fONbSLp+vgBKDzRUVAIqP/AIJ2THanyZxj2b8XU/4s2uzGoTLSR3ViX0JU6zTc+IkaBp1o3W3OolvO15E10/VYJCKN3TkxPsSSGE3QReXnCcnIZYAnrPf9f1DPP1Lo+VUCIzZ7IzcZajAWQ53hC71mTYNHkUgIlWxpRyEhnsRfmqEfUSFbTwpNEarv7vGlK686C4xVxlVfKbqlNa3/g2Vrae4ArVBM958JPZ6aa+7KDZfH5TDgPPtlFCIGkd root@testclient

Druga opcja to przegranie danych klucza z serwera na którym zostały one utworzone. Zaloguj się z serwera docelowego poprzez SSH do serwera klienckiego wpisując:

 $ ssh root@

Po podaniu hasła wpisz polecenie:

 $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@

Przy czym w powyższym poleceniu podajesz adres IP serwera z którego się łączysz.

System poprosi o podanie hasła. Wyloguj się z ssh serwera klienckiego i przejdź do pliku /.ssh/authorized_keys w którym to powinien znajdować się już prawidłowy klucz.

Zapisz plik i przeładuj usługę SSH:

 $ sudo service sshd reload

W tym momencie dostęp bez potrzeby podawania hasła powinien być możliwy:

 $ ssh root@<SERVER.IP>

Jeśli wszystko działa poprawnie, dezaktywuj dostęp do maszyny za pomocą hasła poprzez zmodyfikowanie pliku / etc / ssh / sshd_config za pomocą poniższych parametrów:

ChallengeResponseAuthentication no
    PasswordAuthentication no

Pamiętaj, że możesz dodać inne klucze publiczne, dodając je na końcu pliku ~ / .ssh / authorized_keys na serwerze.

Ograniczenie czasu dostępu do usługi

Sposobem na zredukowanie niepożądanych dostępów oraz ataków brute-force jest zmniejszenie czasu dostępu do usługi SSH. Jeśli jesteś pewny, że nie będziesz potrzebował łączyć się z serwerem w wybranym przedziale czasowym (na przykład od 23:00 do 8:00 następnego dnia), możesz ustawić automatyczny harmonogram blokujący port do połączenia.

W tym celu skorzystaj z podstawowego firewalla, czyli iptables. Przed rozpoczęciem wprowadzania zmian pamiętaj jednak, że iptables standardowo nie zapisuje wprowadzonej konfiguracji.

Aby szybciej zapisać i załadować konfigurację, użyj pakietu iptables-persistent, który przeładowuje zapisaną konfigurację podczas uruchamiania systemu.

Zainstaluj pakiet za pomocą komendy:

 $ sudo apt-get install iptables-persistent

Configuring Iptables

Po zakończeniu instalacji, wprowadź "chain" w celu zablokowania usługi SSH:

 $ sudo iptables -N chain-ssh
 $ sudo iptables -A INPUT -p tcp --dport 22 -j chain-ssh

W ten sposób wszystkie połączenia przez port 22 (jeśli Twoja usługa SSH wykorzystuje inny port, zmień tą wartość) będą przechodziły przez utworzony łańcuch "chain-ssh".

Zapisz obecną konfigurację (która zostanie załadowana przez iptables-persistent) za pomocą komendy:

 $ sudo iptables-save > /etc/iptables/rules.v4

Następnie stwórz harmonogram dla wprowadzania i usuwania reguł z łańcucha poprzez następujące modyfikacje crontab:

$ sudo crontab -e
    
# m h  dom mon dow   command
0 23   * * *   iptables -A chain-ssh -j DROP
0 8    * * *   iptables -F chain-ssh

Jeśli przy próbie zapisu wystąpi błąd EOF, trzeba po wpisaniu ostatniej linii zatwierdzić ją przyciskiem ENTER.

Pierwsza operacja DROP odrzuca wszelkie połączenia od godziny 23:00, a druga operacja opróżnia łańcuch o godzinie 8:00 i przywraca działanie usługi.

Zapisz plik w celu wprowadzenia zmian.