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:
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):
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:
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:
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
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.