Have You Tried IT ?

Information Technology from scratch

Mój pierwszy atak DDoS

Dodano przez Kategoria: Linux

Każdy, kto próbuje utrzymywać swoje strony, prędzej czy później natknie się na problem DDoS. Mnie osobiście dużo czasu zajęło, aż w końcu jedna ze stron stała się na tyle popularna, że ktoś(coś) postanowił ją DDoS’ować.

Zaczęło się dość niewinnie: ktoś gdzieś wrzucił linka na fejsie i tak się powoli rozniosło. Strona wisiała na hostingu szeringowym. Na tanich serwerowniach niestety mają chyba taka politykę, że „nie pomagamy w zatrzymaniu ataku, tylko od razu blokujemy domenę” i sprawa załatwiona. W sumie dwukrotnie zablokowano mi domenę, z tym, że raz w ogóle bez powiadomienia. Zorientowałem się dopiero po 2 dniach. Później tłumaczyli się, że admin miał tyle pracy, że zapomniał wysłać powiadomienia – normalna sprawa. Jako przyczynę blokady podali niespotykanie duży ruch i sugerowali, że pewnie mam jakiś błąd w aplikacji, bo następują połączenia z różnych dziwnych lokalizacji, …a ja im wierzyłem. Pozwolę sobie przemilczeć nazwę dostawcy, ale proszę się nie dziwić podobnym podejściem na hostingu do 50zł/rok.
Tak więc po drugim zablokowaniu od razu przetransferowałem domenę na inny własny serwer VPS. Przeniesienie serwisu i bazy MySLQ 250MB poszło gładko – 2h z przerwą na leżenie na wersalce i wszystko gra. Nowy adres IP dla domeny rozpropagował się w ciągu kilku godzin i ruch zaczął spływać na nowy serwer. I wtedy się zaczęło.

Atak polegał na tym, że najpierw były próby wejścia na losowo generowany link, co chwila z różnych adresów niepowtarzających się. Lokalizacja adresów to głownie jakieś Chiny, Tajwan czy inne egzotyczne Kolumbie.

mod_evasive

Pierwsza koncepcja to instalacja mod_evasive do Apacha.

apt-get install libapache2-mod-evasive

Tworzenie katalogu dla logów i ustawienie właściciela:

mkdir -p /var/log/apache2/evasive
chown -R www-data:root /var/log/apache2/evasive

Edycja pliku konfiguracyjnego

vi /etc/apache2/mods-available/mod-evasive.load
LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so

DOSHashTableSize 3097  # rozmiar tablicy z zapamiętanymi kluczami
DOSPageCount 5         # próg max il. żądań do pojedynczej strony w czase DOSPageInterval
DOSSiteCount 10        # próg max il. żądań do całego serwisu w czase DOSSiteInterval
DOSPageInterval 10     # przedział czasowy żądań do pojedynczej strony
DOSSiteInterval 20     # przedział czasowy żądań do całego serwisu
DOSBlockingPeriod 120  # czas blokady w sekundach
#DOSCloseSocket yes    # zamyka sockety po zablokowaniu wymuszając ponowne nawiązanie połączenia
DOSLogDir "/var/log/apache2/evasive"    #lokalizajca katalogu z logami

Powyższymi ustawieniami proszę się nie sugerować. Mają one charakter bardziej eksperymentalny i mogłyby blokować ruch w większości przypadków normalnego ruchu.

Działa to w ten sposób, że przy wywołaniach tego samego adresu przez klienta w częstotliwości większej niż 5req/10s zostanie mu zablokowany dostęp na 120s. Blokada niestety jest na poziomie Apache i polega na tym, że zostanie klientowi wyświetlona strona 403. Tak czy inaczej request jest obsługiwany przez proces Apache. Żeby poprawić skuteczność, należałoby również spowodować zablokowanie danego klienta na firewallu. Sam moduł pozwala na takie akcje, lecz ja użyłem innego narzędzia o czym poniżej.

fail2ban

Jest to narzędzie, które na podstawie logów Apache i stworzonych filtrów wycina określony ruch z serwera na poziomie firewalla

apt-get install fail2ban

W katalogu

/etc/fail2ban/filter.d

powinno znajdować się klika standardowych filtrów do różnych usług. Do tego katalogu wrzuciłem swój nowo stworzony plik:

vi /etc/fail2ban/filter.d/http-1st-ddos.conf
# Fail2Ban configuration file
#
#
[Definition]

# Option: failregex
# Note: This regex will match any GET entry in your logs, so basically all valid and not valid entries are a match.
# You should set up in the jail.conf file, the maxretry and findtime carefully in order to avoid false positives.

failregex = ^domena\.ma\:80 <HOST> -.*\"(GET|POST) \/dawac-tutaj\/.*

# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =

Główna konfiguracja sprowadza się tutaj do zdefiniowania dla parametru failregex wyrażenia regularnego opisującego podejrzane żądania. W moim przypadku sprawa było nieco uproszczona, gdyż jak zauważyłem większość DDoS’owego ruchu była kierowana na jedną określoną część mojego serwisu. Nawiązując do powyższego filtra podejrzane wywołania były takiej postaci: http://domena.ma/dawac-tutaj….. i dalej były doklejane losowe znaki.

Następnie należy zmodyfikować pliku jail.conf i dopisać do niego definicję dla stworzone filtra

vi /etc/fail2ban/jail.conf
....

[http-1st-ddos]
enabled = true
port = http,https
filter = http-1st-ddos
logpath = /var/log/apache2/domenama_vhosts_access.log
maxretry = 5
findtime = 1000
bantime = 60000
action = iptables[name=HTTP, port=http, protocol=tcp]
         iptables[name=HTTPS, port=https, protocol=tcp]

Należy tutaj zdefiniować przede wszystkim poprawną ścieżkę do accessloga z Apache.
Próg maksymalnej ilości wywołań (maxretry) w czase (findtime – w sekundach) oraz czas zablokowania dostępu (bantime – również w sekundach). Akcje to blokowanie dostępu na firewallu. Można również dodać dodatkowe akcje, typu wysłanie powiadomienia e-mailem o zaistniałej sytuacji. Definicje akcji znajdują się w katalogu /etc/fail2ban/action.d

Po wprowadzeniu zmian w konfiguracji dla pewności można zrestartować usługę fail2ban

/etc/init.d/fail2ban restart

Status aktualnie aktywnych zadań można sprawdzić w ten sposób:

# fail2ban-client status
Status
|- Number of jail:      2
`- Jail list:           sshd-ddos, courierpop3

Nowo utworzone zadanie można wówczas dodać:

# fail2ban-client add http-1st-ddos

oraz wystartować:

# fail2ban-client start http-1st-ddos

pojawi się ono na liście statusów jako kolejna pozycja, a rezultaty działania zadania można podejrzeć wywołując:

# fail2ban-client status http-1st-ddos

Status for the jail: http-1st-ddos
|- filter
|  |- File list:        /var/log/apache2/domenama_vhosts_access.log
|  |- Currently failed: 0
|  `- Total failed:     0
`- action
   |- Currently banned: 0
   |  `- IP list:
   `- Total banned:     0

a w miejsce zero powinny z czasem pojawiać się nowe wartości dotyczące wykrytych nadużyć zgodnie z naszym progiem zdefiniowanym dla filtra. Dodatkowo można sprawdzić jeszcze bezpośrednio na firewallu reguły wprowadzone przez fail2ban

iptables -L

 

Przydatne linki:

Dodaj komentarz

XHTML: Dozwolone znaczniki: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">