Jak zabezpieczyć serwer Ubuntu przed atakami SSH bruteforce?


21

Mam bezpieczne hasła, ale słyszałem, jak ludzie narzekają na wydajność serwera, który gwałtownie spada, gdy dochodzi do ataku siły. Jak mogę zabezpieczyć mój serwer Ubuntu 10.10 przed takimi atakami? Czy istnieje do tego profil Apparmor? Lub w inny sposób, aby rozwiązać ten problem?

Odpowiedzi:


19

Istnieją różne rozwiązania. Najlepszym z nich jest uwierzytelnianie RSA, które używa kluczy publicznych / prywatnych do uwierzytelniania użytkowników.

Sprawdź ten świetny podręcznik dla różnych podejść (w tym uwierzytelnianie RSA): http://www.la-samhna.de/library/brutessh.html

Korzystam z trzeciego rozwiązania na moim serwerze, ponieważ nie chcę komplikować moich nietechnicznych użytkowników: iptablesograniczenie liczby połączeń na minutę powoduje, że ataki bruteforce są nieefektywne i nieefektywne.

Oto rozwiązanie, którego używam:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

Jak wspomniano tutaj : pozwoli to na trzy połączenia portu 22 z dowolnego adresu IP w ciągu 60 sekund i nie będzie wymagać 60 sekund kolejnych prób połączenia, zanim wznowi zezwalanie na połączenia. Opcja --rttl bierze również pod uwagę TTL datagramu podczas dopasowywania pakietów, aby starać się złagodzić fałszywe adresy źródłowe.

Jak wspomniano we wspomnianym przewodniku, lepiej jest użyć białej listy, aby oddzielić zaufanych użytkowników od następujących zasad:

iptables -N SSH_WHITELIST

następnie dodaj zaufane hosty:

iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT

a następnie ustal zasady:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

Jeśli chodzi o wyłączenie uwierzytelniania hasła, jak zalogować się do serwera, jeśli stracę jego klucz publiczny? (Nie mam fizycznego dostępu do serwera, to jest VPS)
Dziamid

Klucz publiczny można opublikować w dowolnym miejscu, więc nie przejmuj się nim. Możesz go umieścić gdzieś, na pewno nie zapomnisz go nawet w miejscach publicznych.
Pedram


Czy istnieje sposób skonfigurowania serwera tak, aby ujawniał swój klucz publiczny, gdy zostanie o to poproszony?
Dziamid

1
Używając ssh, nie sądzę. Jeśli masz zainstalowany serwer WWW, taki jak apache, możesz udostępnić klucz za pomocą sieci.
Pedram

8

Dostaję ataki ssh typu brute-force na moje serwery z częstością 1 do 2 dziennie. Zainstalowałem denyhosts (pakiet ubuntu: denyhosts). Jest to bardzo proste, ale skuteczne narzędzie do tego celu: w zasadzie okresowo skanuje dzienniki w celu wykrycia ataków siłowych i umieszcza adresy IP, z których pochodzą te ataki, w pliku /etc/hosts.deny. Nie będziesz od nich więcej słyszeć, a twoje obciążenie powinno zostać znacznie zmniejszone. Jest bardzo konfigurowalny za pomocą pliku konfiguracyjnego /etc/denyhosts.conf w celu dostrojenia problemów, takich jak liczba błędnych prób stanowiących atak itp.

Ze względu na przejrzyste działanie możesz łatwo zobaczyć, co się dzieje (powiadomienie e-mail: „aha, kolejny złośliwy atak udaremniony!”) I cofnąć błędy, ponieważ użytkownicy wielokrotnie błędnie wpisują swoje hasła.

Oczywiście wszystko, co poprzednio mówiono o przejściu na inne metody uwierzytelniania, jest ważne, ale czasami twoje wymagania nie zgadzają się z wymaganiami użytkowników.

Również ograniczenie szybkości nowych połączeń w iptables może być lepszym wyborem niż odmowa dostępu przez hosts.deny. Więc spójrz również na fail2ban. Ale jeśli wiesz, że Twoim głównym zmartwieniem jest ssh brute-force (ręcznie przejrzyj /var/log/auth.log, aby to ustalić), skorzystaj z tego bardzo łatwego i niewielkiego narzędzia.


1
Mój /var/log/auth.log ostatnio znacznie rośnie. Czy taki wpis Mar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=rootwskazuje na atak?
Dziamid

1
Oznacza to, że ktoś o adresie IP 218.15.136.38 próbował zalogować się jako root. Możliwe, że to Ty, ale prawdopodobnie nie dlatego, że korzystając z tools.whois.net/whoisbyip , widzę, że ten adres IP jest zarejestrowany w Chinach, co jest dość daleko od Mińska ;-) Tak, to wygląda na odgadnięcie hasła . Morał: wyłącz logowanie roota przez ssh (PermitRootLogin no w / etc / ssh / sshd_config), ponieważ nie ma dobrego powodu, aby pozostawić to włączone. A potem rozważ denyhosts lub fail2ban. Upewnij się także, że masz zaporę ogniową, która pozwala tylko niezbędny dostęp przez port 22 i wszystko, czego potrzebujesz (ale nie więcej)
DrSAR

6
  1. Zmień port sshd na coś niestandardowego
  2. Służy knockddo wdrażania systemu pukania portów
  3. Użyj iptables recenti hashlimitdopasowań, aby ograniczyć kolejne próby SSH
  4. Nie używaj haseł, ale zamiast tego używaj kluczy SSH

3
-1 dla pierwszej porady, komplikuje rzeczy, tak naprawdę nie powoduje rzeczywistego wzrostu bezpieczeństwa
steabert

Jeśli używasz kluczy ssh i wyłączasz uwierzytelnianie za pomocą ssh, czy naprawdę potrzebuję 1,2,3?
Dziamid

4
@steabert pomaga to dzieciom skryptowym, które próbują po prostu brutalnie przebić się przez port 22. to moje doświadczenie: ktoś ciągle brutalnie atakuje serwer internetowy, kiedy go konfigurowałem, dzięki czemu system wysyła mi ostrzeżenia po ostrzeżeniach. Przeniosłem port i ostrzeżenia ustąpiły.
pepoluan

@Dziamid klucze ssh zapobiegają włamaniu się do twojego systemu. ale to nie powstrzymuje ich przed próbą połączenia się z portem 22.
pepoluan

3
@Dziamid Nie, niepoprawnie. Inne metody uwierzytelniania (RSAAuthentication, PubkeyAuthentication, #KerberosAuthentication itp.) Wszystkie nadal nawiązują kontakt przez port 22.
DrSAR

3

Przede wszystkim należy rozważyć nieużywanie haseł i używanie kluczy. Nie ma potrzeby używania hasła. Jeśli to Ci odpowiada, możesz skonfigurować serwer OpenSSH, aby nie reagował na loginy hasła.

https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html

Opcją fail2ban może być również opcja.

https://help.ubuntu.com/community/Fail2ban


Jak połączyć się z serwerem, jeśli stracę jego klucz publiczny?
Dziamid

1
Tylko przez konsolę lub bezpośredni dostęp. Jestem pewien, że nie stracisz klucza, jeśli będziesz mógł administrować serwerem.
ddeimeke

0

Jak szeroko serwer jest eksponowany w sieci? Być może możesz porozmawiać z administratorem sieci i sprawdzić, czy możliwe jest monitorowanie i ograniczanie dostępu do sieci do serwera. Nawet jeśli logowanie do konta jest bezpieczne, wydaje się, że serwer może cierpieć z powodu prostego ataku DoS / DDoS.


0

Alternatywą dla fail2ban jest CSF: ConfigServer Security & Firewall .

Jest wyposażony w LFD: demon niepowodzenia logowania, który może wykryć wiele nieudanych prób logowania w różnych usługach i zablokuje naruszający adres IP (tymczasowo lub na stałe).

Ma kilka innych opcji, które mogą pomóc w walce z atakami powodziowymi i być może wykryć włamania.

Niedogodności:

  • Musisz użyć CSF jako zapory ogniowej, aby LFD mógł wykonać swoją pracę. Jeśli masz już zaporę ogniową, musisz zastąpić ją CSF i przenieść konfigurację.
  • Nie jest pakowany dla Ubuntu. Musisz zaufać automatycznym aktualizacjom ze strony configserver.com lub wyłączyć automatyczne aktualizacje.
  • Słyszałem, że jest dość popularny, więc inteligentni intruzi prawdopodobnie będą wiedzieć, jak wyłączyć wykrywanie włamań, zanim zostaną wykryte!

0

Czy zamierzasz zezwolić na obsługę SSH na świecie? A może tylko członkom zespołu w określonych miejscach? Moja odpowiedź zależy trochę od powagi twojego wyzwania.

W obu przypadkach należy upewnić się, że serwer SSH nie zezwala na logowanie się do haseł dla użytkownika root.

  1. W / etc / ssh / sshd_config upewnij się, że nigdy nie zezwalasz na logowanie roota, chyba że za pomocą klucza SSH.

W moich systemach mam to ustawienie

PermitRootLogin without-password

ale zauważam, że mają nowsze Ubuntu

PermitRootLogin prohibit-password

Jeśli czytasz „man sshd_config”, myślę, że oznacza to, że to nowsze hasło „zabrania hasła” oznacza to samo i jest z pewnością bardziej oczywiste w znaczeniu. To NIE jest domyślne w niektórych systemach Linux, ale prawdopodobnie tak powinno być.

Teraz o twoim problemie. Czy serwer systemowy ma tylko niektórych użytkowników w określonych miejscach? Zrób to!

  1. edytuj /etc/hosts.deny i wstaw

    WSZYSTKO WSZYSTKO

Następnie edytuj /etc/hosts.allow i wypisz numery IP lub zakresy, które chcą zezwolić na korzystanie z SSH. Notacja jest nieco myląca, ponieważ jeśli chcesz zezwolić wszystkim systemom o numerach IP, takich jak 111.222.65.101 do 111.222.65.255, umieść taki wpis w pliku hosts.allow

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

To brutalne, potężne rozwiązanie. Jeśli twoich użytkowników można wyliczyć według zakresu adresów IP, zrób to!

To rozwiązanie istniało przed utworzeniem tablic IP, jest (myślę) o wiele łatwiejsze w administrowaniu, ale nie jest tak dobre jak rozwiązanie tablic IP, ponieważ procedury tablic IP wykryją wrogów wcześniej niż programy sterowane przez hosts.allow i hosty .zaprzeczać. Ale to pewny ogień, prosty sposób na rozwiązanie wielu problemów, nie tylko z SSH.

Zwróć uwagę na problem, który sam stworzyłeś. Jeśli chcesz otworzyć serwer FTP, serwer WWW lub coś takiego, musisz zezwolić na wpisy na hostach.

Możesz osiągnąć ten sam podstawowy cel, bawiąc się iptables i firewallem. W pewnym sensie jest to preferowane rozwiązanie, ponieważ blokujesz wrogów na zewnętrznej granicy. Ubuntu ma „ufw” (nieskomplikowana zapora ogniowa), a „man ufw” ma wiele przykładów. Wolę mieć fajny GUI do przebrnięcia przez to, nie muszę tego robić cały czas. Może inni powiedzą nam, czy już istnieje.

  1. Inne posty sugerują używanie klucza publicznego SSH tylko dla użytkowników. To z pewnością pomoże, kosztem złożoności i frustracji dla użytkowników. W naszym laboratorium jest 15 komputerów. Użytkownicy chodzą między komputerami. Wymaganie uwierzytelnienia za pomocą klucza SSH spowodowałoby duży problem, ponieważ ludzie przechodzą z jednego komputera na drugi.

Kolejne źródło frustracji nastąpi, gdy niektórzy użytkownicy gromadzą różne klucze ssh dla różnych serwerów. Ponieważ mam klucze SSH dla około 12 różnych projektów, teraz ssh kończy się niepowodzeniem, ponieważ mam zbyt wiele kluczy publicznych (Wymaganie albo „ssh -o PubkeyAuthentication = false” lub utworzenie wpisu w pliku .ssh / config. Jest to PITA)

  1. Jeśli musisz pozostawić serwer otwarty dla SSH z dużego, szerokiego świata, zdecydowanie powinieneś użyć procedury odrzucania, aby zablokować lokalizacje, które często próbują się zalogować. Są na to 2 fajne programy, z których korzystamy, to denyhosts i fail2ban . Te programy mają ustawienia, które pozwalają banować przestępców na czas, który ci się podoba.

W naszych systemach Linux Centos zauważyłem, że porzucili pakiet denyhosts i oferują tylko fail2ban. Podobało mi się denyhosts, ponieważ utworzył listę kłopotliwych zakresów użytkowników / ip, a następnie w hosts.deny ta lista została odnotowana. Zamiast tego zainstalowaliśmy fail2ban i jest OK. Rozumiem, że wolisz blokować tych złych użytkowników na zewnętrznej krawędzi serwera, więc blokery oparte na tablicach ip, takie jak fail2ban, są w rzeczywistości lepsze. Denyhosts działa na poziomie drugorzędnym, po tym jak wrogowie miną iptables, są następnie odrzucani przez demona sshd.

W obu tych programach wyciąganie użytkowników z więzienia jest trochę uciążliwe, jeśli zapomną hasła i spróbują się zalogować kilka razy. Trudno jest odzyskać dostęp do konta, gdy popełniają błędy logowania. Można by się domyślić, że istnieje interfejs GUI typu „wskaż i kliknij”, w którym można po prostu wskazywać i wpuszczać ludzi z powrotem, ale nie jest tak. Muszę to robić tylko co kilka miesięcy i od czasu do czasu zapomnieć, więc napisałem dla siebie instrukcje na swojej stronie http://pj.freefaculty.org/blog/?p=301

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.