Losowo wybrane artykuły

ddns

Dynamic DNS - domena na serwerze ze zmiennym IP

Użytkownicy łącz typu Neostrada (adsl), dial-up i innych mogą uruchomić serwer www lub dowolną inną usługę sieciową na swoim komputerze, nawet jeśli ich adres IP ulega zmianie (np. przy każdym połączeniu z siecią lub cyklicznie co pewien czas). Używając odpowiedniej aplikacji, za każdym razem kiedy otrzymasz nowy IP, zostanie on zaktualizowany w ustawieniach DNS Twojej domeny. Twoja domena będzie podążała tam gdzie Twój adres IP. Z pomocą przychodzi nam usługa Dynamic Domain Name System. Funkcjonalność Dynamic DNS pozwala na uaktualnianie adresu IP w ustawieniach DNS dla danej domeny za każdym razem kiedy Twój komputer otrzymuje nowy IP. Usługa DDNS świadczona jest przez wiele serwisów. W podstawowej wersji, wystarczającej do konfiguracji opisanej powyżej, jest ona zwykle darmowa. Najczęściej używane to: www.dyndns.com czy www.no-ip.com. Ja skupie sie na dyndns.com. Pierwszym krokiem jest rejestarcja na stronie dyndns.com. Pobieramy program, który będzie aktualizował nasze IP w bazie - ddclient. Następnie wybieramy usługę na dyndns.com w naszym przypadku:
My Services --> Host Services --> Hostname - nazwa naszego hosta zaznaczamy Wildcard i na koniec wpisujemy nasze bieżące IP. Na końcu uruchamiamy program ddclient. Przy pierwszym uruchomieniu może wyświetlić sie nam konfigurator, który spyta sie o login i hasło podane podczas rejestracji na dyndns.com. Jeżeli nie możemy skorzystać z konfiguratora online. Po instalacji należy sprawdzić czy ddclient-a mamy w skryptach startowych, jeżeli nie musimy go sami dodać do rc.local.

mysqldump

MySQL Backup - kopia zapasowa bazy danych

Jak ważną sprawą jest regularne wykonywanie kopii zapasowych ważnych danych nawet nie wypada pisać. Wystarczy odwiedzić fora internetowe, gdzie pełno jest postów dotyczące utraty ultra ważnych danych. Początkującym użytkownikom, backup kojarzy się ze zgrywaniem plików/katalogów z jednego miejsca w drugie, często zapominając o kopii bazy danych. Jako że najpopularniejszą obecnie bazą danych jest MySQL, postaram się przybliżyć podstawy robienia kopii zapasowych.
Jest kilka sposobów na wykonanie kopii bezpieczeństwa bazy danych MySQL, dobór metody zależny jest od zastosowanego silnika. Korzystając z silnika MyISAM mamy do wyboru kilka metod. Pierwsza to kopiowane plików, druga to wykorzystanie narzędzia mysqldump. Natomiast jeśli używamy silnika InnoDB, który jest domyślny od wersji MySQL 5.5 lepiej nie ryzykować z kopiowaniem plików. Możemy również wykorzystać mysqldump lub bardzo dobrą aplikację Percona XtraBackup. Najprostszą i uniwersalną metodą niezależną od używanego przez bazę silnika jest mysqldump. Sprawa komplikuje się nieco, kiedy do zarchiwizowania jest duża porcja danych. Zrzut dnaych do formatu SQL bazy (MyISAM) o rozmiarze 3.3 GB trwało ~14 min na mało obciążonej maszynie (CPU: ATOM N2800 2 rdzenie/2 wątki, dysk 2 X 500 GB RAID 0/1) ale już jej przyrócenie trwało ~70 min. Ja skupię się na metodzie binarnej (kopiowanie plików) i na narzędziu mysqldump.
Jak już wcześniej pisałem podstawowym kryterium doboru metody wykonania kopii jest silnik bazy danych. Sprawdzić możemy na kilka sposobów np:

# mysqlshow -u userName --status nazwa_bazy_danych -p
Enter password:
Database: mysql
+---------------------------+--------+---------+------------+------+----------------+-------------+--------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------------------------------------------------+
| Name                      | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length    | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time          | Collation         | Checksum | Create_options | Comment                                           |
+---------------------------+--------+---------+------------+------+----------------+-------------+--------------------+--------------+-----------+----------------+---------------------+---------------------+---------------------+-------------------+----------+----------------+---------------------------------------------------+
| columns_priv              | MyISAM | 10      | Fixed      | 0    | 0              | 0           | 227994731135631359 | 4096         | 0         |                | 2013-04-23 00:34:12 | 2013-04-23 00:34:12 |   

Znając już silnik bazy danych możemy przystąpić do działania.

Metoda binarna ( TYLKO MyISAM !!! )

  • maszyna_1
  • Lokalizujemy miejsce, gdzie znajdują się pliki baz danych poleceniem: grep datadir /etc/mysql/my.cnf (Debian) lub grep datadir /etc/my.cnf (Red Hat/Fedora/Centos), zakładam standardową lokalizację Debiana /var/lib/mysql
  • Blokujemy możliwość zapisywania danych do tabel na dwa sposoby:
    1. Wydając polecenie w konsoli MySQL: FLUSH TABLES WITH READ LOCK;
    2. Wyłączając serwer MySQL: /etc/init.d/mysql stop
  • Kopiujemy interesującą nas bazę: cp -R /var/lib/mysql/baza_danych /home/backup
  • Jeśli użyliśmy polecenia FLUSH TABLES..., to teraz należy zdjąć blokadę logując się do konsoli MySQL wydając polecenie UNLOCK TABLES;
  • Pozostaje skopiować katalog z bazą na drugą maszynę: scp -r /home/backup/baza_danych user@maszyna_2:/home/user
  • maszyna_2
  • Kopiujemy katalog bazy do katalogu gdzie są przechowywane katalogi z bazami: cp -R /home/user/dodana_baza /var/lib/mysql
  • Teraz można sprawdzić, że MySQL już widzi dodaną bazę:
  • # mysql -u user -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 36
    Server version: 5.xxx
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | dodana_baza        |
    +--------------------+
    3 rows in set (0.00 sec)
    mysql> use dodana_baza
    Database changed
    mysql> show tables;
    ERROR 1018 (HY000): Can't read dir of './dodana_baza/' (errno: 13)
    
  • Jak widać na powyższym przykładzie, baza jest ale serwer MySQL nie ma do niej dostępu. Standardowo serwer MySQL działa z prawami użytkownika...mysql, więc zmieniamy prawa: chown -R mysql:mysql /var/lib/mysql/dodana_baza
  • Dla pewności sprawdźmy nową bazę poleceniem: mysqlcheck -u user dodana_baza -p

Narzędzie mysqldump

Bez wątpienia jest to chyba najpopulrniejsza metoda backupu bazy MySQL. Mysqldump wykonuje zrzut danych do formatu SQL lub XML. Na początek kilka opcji:

Opis Znaczenie
-u username nazwa użytkownika
-p hasło hasło użytkownika
-h adres IP/nazwa domenowa adres zdalnego serwera
--port=numer portu port nasłuchu zdalnego serwera,jeśli jest inny niż 3306
--databases baza1 baza2... zrzut kilku baz jednocześnie
--all-databases zrzut wszystkich baz
--no-data zrzut sktruktury bazy pomijając dane
--no-create-info zrzut tylko samych danych bez struktury (tabele,pola,indeksy...)
--ignore-table=nazwa_tabeli pomija przy zrzucie tabelę o podanej nazwie
--add-drop-database przywracanie bazy danych przy jednoczesnym usunięciu istniejącej
--add-drop-table przywracanie tabeli przy jednoczesnym usunięciu istniejącej
--default-character-set=utf8 domyslne kodowanie znaków
--xml zrzut bazy danych do formatu xml

Wynik pracy narzędzia mysqldump jest przekazywany na standardowe wyjście, czyli najczęściej ekran monitora, dlatego my przekierujemy cały potok do pliku (np. polecenie > plik.out). NALEŻY PAMIĘTAĆ O ODPOWIEDNICH UPRAWNIENIACH UŻYTKOWNIKA DO BAZY DANYCH ! Zarówno po opcji -u jak i -p nie musimy używać spacji. W przypadku tworzenia kopii zapasowej z konsoli nie musimy podawać hasła, aplikacja sama się o nie zapyta i w związku z tym nie zapisze się w historii. Hasło musimy podać jedynie kiedy używamy mysqldump w skrypcie.

...i na koniec kilka przykładów:

Polecenie Znaczenie
zrzut lokalnej bazy danych mysqldump -uuserName -p nazwa_bazy > nazwa_bazy.sql
zrzut lokalnych baz danych mysqldump -uuserName -p --databases baza_1 baza_2 baza_3 > bazy.sql
zrzut wszystkich lokalnych baz danych mysqldump -uuserName -p --all-databases > wszytskie_bazy.sql
zrzut wbranych tabel mysqldump -uuserName -p nazwa_bazy nazwa_tabeli_1 nazwa_tabeli_2 > nazwa_bazy.sql
zrzut bazy danych z pominięciem wyszczególnionych tabel ( nazwa tabeli poprzedzona nazawą bazy !) mysqldump -uuserName -p -ignore-table nazwa_bazy.nazwa_tabeli > nazwa_bazy.sql
kopia samej struktury bazy bez danych mysqldump -uuserName -p --no-data nazwa_bazy_danych > nazwa_bazy_danych.sql
zrzut bazy danych do formatu xml, kodowanie utf-8 mysqldump -uuserName -p --default-character-set=utf8 --xml nazwa_bazy_danych > nazwa_bazy.xml
zrzut i kompresja bazy danych (bardzo efektywne w przypadku dużych baz) mysqldump -uuserName -p nazwa_bazy | gzip > nazwa_bazy.gz
zrzut bazy danych z jendoczesną kopią pliku na zdalny serwer mysqldump -uuserName -p nazwa_bazy | ssh userName@zdalny_host 'cat > /scieżka/nazwa_bazy.sql'
zrzut bazy danych ze zdalnego hosta mysqldump -h ip/domena_zdalnej_maszyny -uuserName -p nazwa_bazy > nazwa_bazy.sql

Backup bazy danych na zdalną maszynę wraz z aktualizacją

Często dostęp z zewnątrz do serwera MySQL jest zablokowany. Wtedy ostatnia pozaycja z powyższych przykładów nie zadziała. Można to łatwo obejść za pomocą ssh. Na zdalnym serwerze musi istnieć choćby pusta baza.

mysqldump -uroot -p hasło nazwa_bazy | ssh userName@zdalny_host mysql -uuserName -p hasło nazwa_bazy

Przywracanie kopii zapasowej bazy danych MySQL

Przywracanie bazy danych nie jest skomplikowane: mysql -uuserName nazwa_bazy < nazwa_bazy.sql -p, gdzie baza już musi istnieć.

nginx

Nginx serwer www z obsługą php@FastCGI part I

Nginx to lekki serwer http i reverse proxy. Potrafi także działać jako load balancer, dlatego często określany jest jako router HTTP. Stanowi poważną alternatywę dla przeładowanego apache. W środowisku prodykcyjnym nginx zaskakuje wydajnością oraz małym zużyciem pamięci co jest zaletą dla dużych jak wordpress.com jak i małych jak słabiutki vps z 128MB.
Na niekorzyść nginx-a przemawia fakt, braku wsparcia plików .htaccess oraz składnia modułu rewrite jest nieco inna od składni mod_rewrite. Brak obsługi .htaccess determinuje konieczność wprowadzania czy to dyrektyw rewrite czy innych obsługiwanych w .htaccess do konfiguracji serwera przez jego administratora.
Przewagę jaką uzyskuje nginx nad popularnym apachem wynika z modelu obsługi przychodzących połączeń. W Apache każde nowe połączenie wymaga uruchomienia nowego procesu (mpm-prefork) lub wątku (mpm-worker), który obsłuży przychodzące żądanie.
W przypadku nginx-a mamy do czynienia z modelem zdarzeniowym polegającym na obsłudze wielu połączeń przez ten sam proces, który reaguje na takie zdarzenia, jak nowe żądanie od klienta, odpowiedź od serwera aplikacji itp. Jeżeli na jednym połączeniu nic się nie dzieje, proces nginxa może obsługiwać inne, aktywne połączenie. Proces (wątek) Apache'a czeka wtedy bezczynnie.
Nginx tworzy 1-n... procesów (w zależności od potrzeb i sprzetu) ,każdy z tych procesów, może obsłużyć kilkadziesiąt/set tysięcy połączeń. Pokrótce tyle teorii.

Na początku chcę zaznaczyć, iż nie będe się wdawał w sam proces instalowania nginx-a, wiadomo to już jest uzależnione od dystrybucji (paczki) lub indywidulanej konfiguracji (kompilacji ze źródeł).

  • Globalna konfiguracja serwera:
  • główny plik konfiguracyjny - nginx.conf
  • 
    user www-data;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        access_log  /var/log/nginx/access.log;
    
        sendfile        on;
        tcp_nopush     on;
    
        keepalive_timeout  0;
        keepalive_timeout  65;
        tcp_nodelay        on;
    
        gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }
    
    i krótki opis do tego pliku:
  • user www-data; - konfiguracja z jakimi prawami będzie uruchomiony serwer
  • worker_processes 1; - ilość uruchomionych procesów, tutaj kierować się należy zasadą: ilość rdzeni = ilość procesów (jeżeli jest taka potzreba)
  • worker_connections 1024; - maksymalna ilość połączeń w ramach 1 procesu
    Dzięki dwóm powyższym parametrom teoretycznie możemy oszacować maksmalną liczbę równocześnie obsłużonych klientów: max_clients = worker_processes * worker_connections , natomiast trzeba pamiętać, że w przypadku serwowania stron dynamicznych np. w php jeden klient otwiera dwa połączenia (FastCGI), i już wtedy: max_clients = worker_processes * worker_connections / 2
    a jescze bezpieczniej przez 4.
  • include - cała konfigurację można umieścić w pliku nginx.conf ale dla większej przejrzystości i porządku, szczególnie jesli jest ona rozbudowana (np. wiele domen) można umieszczać w osobnych plikach.
  • W Debianie i pokrewnych dystrybucjach model rozmieszczenia plików jest zapożyczony z Apache (katalogi: sites-available , sites-enabled).
    Trzymając się konwencji Debiana dodatkową konfigurację oddeleguję do osobnych plików.
  • Nginx serwujący kontent statyczny:
  • stworzmy w /etc/nginx/sites-available plik example a w nim:
  • 
    server {
    	# Dyrektywa okreslająca adres i/lub port, na których serwer nasłuchuje
    	listen       80;
    	
    	# Dyrektywa przypisująca nazwy wirtualnym serwerom
    	server_name  przyklad.pl www.przyklad.pl;
    	
    	# Logi domeny przyklad.pl
    	access_log  /var/log/nginx/przyklad.access.log; 
    	error_log /var/log/nginx/przyklad.pl.error.log;
            
    		location / {
    		root   ścieżka naszego katalogu ze stroną;
    		index  index.html index.htm;    
    		}  
    
    }
    
  • teraz tworzymy dowiązanie symboliczne: ln -s /etc/nginx/sites-available/przyklad /etc/nginx/sites-enabled/przyklad
  • następnie restart nginx-a: /etc/inid.d/nginx restart
  • Jeśli nie mamy domeny nie uzywamy wtedy dyrektywy server_name, jeżeli jednak chcemy mieć kilka stron na jednym IP możemy wystawić je na różnych portach:
    
    # strona_1:
    server {
    	listen       80;
    	
    	# ....
    
    		location / {
    		root   /var/www/strona_1;
    		index  index.html index.htm;    
    		}  
    
    }
    # strona_2:
    server {
    	listen       81;
    	
    	# ....
    
    		location / {
    		root   /var/www/strona_2;
    		index  index.html index.htm;    
    		}  
    
    }
    

    W czasie konfiguracji nginx-a natknąłem sie na dość kłopotkiwą sytuacje. Przedstawie ją na konkretnym przykładzie:
    Wyobraźmy sobie, że mamy domenę example.com, 4 subdomeny: main.example.com, poczta.example.com, users.example.com, qwerty.example.com . Trzy pierwsze są wirtualnymi hostami wykorzystywanymi przez nginx-a nastomiast ostania qwerty.example.com nie jest powiązana z żadną konfiguracją wirtualnego hosta. I tu pojawia się problem, gdyż kiedy wpiszemy w przeglądarkę http://qwerty.example.com/ - wtedy wyswietli nam się jedna z tych trzech stron (chyba zależy od kolejności jaką nginx robi include).
    W pliku nginx.conf wstawiamy blok server przed dyrektywami include:

    
    server {
        listen          80 default;
        server_name    _ ; # Catch all
        
        return 444;  # Kod 444 zamyka połączenie bez wysyłania nagłówków.
    }
    

    Oczywiście jest to ułamek możliwośći nginx-a, nic nie wspomniałem o konfiguracj reverse-proxy czy silnemu wsparciu wyrażeń regularnych...
  • Nginx z obsługa PHP poprzez FastCGI part II

Fail2Ban - blokowanie ataków brute force

Fail2Ban - blokowanie ataków brute force

Fail2Ban jest aplikacją, która powinna być zainstalowana w zasadzie na każdej maszynie działającej pod kontrolą Unix / Linux / BSD, wystawioną na świat (zewnętrzne IP). Głównym zadaniem Fail2Ban jest blokada podejrzanych, zakończonych niepowodzeniem prób logowania się do usług świadczonych przez nasz serwer. Podsumowując zabezpiecza przed atakami typu brute force.

Działanie programu Fail2Ban opiera sie na analizie logów i wychwytywaniu nieautoryzowanych prób logowania się do różnego rodzaju usług (np. ssh, smtp, pop3, imap...), po czym blokuje adres IP atakującego za pomocą reguł iptables lub dodając wpis do pliku /etc/hosts.deny. Opis konfiguracji będzie dotyczył blokowania za pomocą reguł iptables.

Fail2Ban dostępny jest na wielu dystrybucjach jako gotowy pakiet więc instalacja jest banalnie prosta.

Instalacja fail2ban

  • Debian/Ubuntu: aptitude install fail2ban
  • RedHat/CentOS/Fedora: yum install fail2ban

Struktura katalogu konfiguracyjnego

Po zainstalowaniu pakietu będziemy mieli podobną strukturę katalogu /etc/fail2ban/:

/etc/fail2ban/
|-- action.d
|   |-- complain.conf
|   |-- dshield.conf
|   |-- hostsdeny.conf
|   |-- ipfilter.conf
|   |-- ipfw.conf
|   |-- iptables-allports.conf
|   |-- iptables-multiport-log.conf
|   |-- iptables-multiport.conf
|   |-- iptables-new.conf
|   |-- iptables.conf
|   |-- mail-buffered.conf
|   |-- mail-whois-lines.conf
|   |-- mail-whois.conf
|   |-- mail.conf
|   |-- mynetwatchman.conf
|   |-- sendmail-buffered.conf
|   |-- sendmail-whois-lines.conf
|   |-- sendmail-whois.conf
|   |-- sendmail.conf
|   `-- shorewall.conf
|-- fail2ban.conf
|-- filter.d
|   |-- apache-auth.conf
|   |-- apache-badbots.conf
|   |-- apache-common.conf
|   |-- apache-nohome.conf
|   |-- apache-noscript.conf
|   |-- apache-overflows.conf
|   |-- common.conf
|   |-- courierlogin.conf
|   |-- couriersmtp.conf
|   |-- cyrus-imap.conf
|   |-- exim.conf
|   |-- gssftpd.conf
|   |-- lighttpd-fastcgi.conf
|   |-- named-refused.conf
|   |-- nginx-w00tw00t.conf
|   |-- pam-generic.conf
|   |-- php-url-fopen.conf
|   |-- postfix.conf
|   |-- proftpd.conf
|   |-- pure-ftpd.conf
|   |-- qmail.conf
|   |-- sasl.conf
|   |-- sieve.conf
|   |-- sshd-ddos.conf
|   |-- sshd.conf
|   |-- vsftpd.conf
|   |-- webmin-auth.conf
|   |-- wuftpd.conf
|   `-- xinetd-fail.conf
|-- jail.conf

Podstawowe ustawienia zawarte są w pliku /etc/fail2ban/fail2ban.conf: loglevel,logtarget,socket. Tu raczej wszystko jest jasne.

Drugim plikiem jest /etc/fail2ban/jail.conf i jest to tak naprawdę główny plik odpowiadający za ochronę naszych usług.
W oficjalnej dokumentacji jest informacja, że każdy plik *.conf może być zmieniony na *.local oczywiście zachowując przy tym oryginał (najpierw wczytywane są ustawienia z plików *.conf, później wczytywana/nadpisywana jest konfiguracja z plików .local). W przypadku fail2ban.conf nie ma to najmniejszego sensu, to już w przypadku jail.conf jest to mocno zalecane. W katalogu konfiguracyjnym znajdują się jeszcze katalogi: /etc/fail2ban/filter.d/ i /etc/fail2ban/action.d/. Pierwszy z nich zawiera wyrażenia regularne, dzięki którym fail2ban wyłapuje podejrzane zachowania. W drugim katalogu przechowywana jest konfiguracja określająca działanie wobec wykrytych ataków.

Konfiguracja Fail2Ban

Pierwszym krokiem będzie utworzenie pliku jail.local na podstawie jail.conf: cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Zawartość pliku podzielona jest na następujące sekcje :

  • DEFAULT - globalne ustawienia programu, które można nadpisać w pozostałych sekcjach
  • ACTIONS - globalne definicje akcji jakie będą podejmowane wobec "atakującego" adresu IP.
  • JAILS - indywidualna konfiguracja dla poszczególnych usług sieciowych

Opis kilku ważniejszych opcji :

  • ignoreip - lista adresów IP, które nigdy nie zostaną zablokowane
  • filter - odnosi się do pliku konfiguracyjnego zawierającego wyrażenie regularne na podstawie którego wykryje niepożądane działanie
  • bantime - czas blokady podany w sekundach
  • maxretry - dozwolona liczba zdarzeń (np. nieudanych logowań) po której następuje blokada
  • banaction - globalna konfiguracja akcji blokowania hosta po przekroczeniu maxretry, domyślna akcja iptables-multiport
  • logpath - ustawienie odpowiedniej ścieżki z logami usługi
  • port - port na którym nasłuchuje monitorowana aplikacja

Po instalacji (przynajmniej na Debianie) aktywowana jest już ochrona ssh. Chcąc uruchomić na przykład ochronę serwera smtp postfix wystarczy w sekcji JAILS znaleźć sekcję [postfix] i zmienić na true opcję enabled .

Wszsytskie opcje, które są skonfigurowane w sekcjach DEFAULT i ACTIONS można nadpisywać indywidualnie w ustawieniach poszczególnych usług sieciowych.
Przykład konfiguracji, która blokuje ataki na ssh (openssh-server), smtp(s),sasl (postix), imap(s) (dovecot), http(s) (nginx, skaner w00tw00t). Plik jail.local:

# Fail2Ban configuration file.
# The DEFAULT allows a global definition of the options. They can be override
# in each jail afterwards.
[DEFAULT]

ignoreip = 127.0.0.1 ip.ip.ip.ip
bantime  = 1800
maxretry = 3
backend = auto
destemail = user@ulos.pl

#
# ACTIONS
#
banaction = iptables-allports
mta = sendmail
# Default protocol
protocol = tcp

## blokada hosta
#action = %(action_)s
## blokada hosta + powiadomienie email
action = %(action_mw)s
## blokada hosta + powiadomienie email + załącznone logi w mailu
action = %(action_mwl)s
#
# JAILS
#
# Optionally you may override any other parameter (e.g. banaction,
# action, port, logpath, etc) in that section within jail.local


[ssh]

enabled = true
port    = ssh
filter  = sshd
logpath  = /var/log/auth.log
#action = sendmail-whois[name=ssh, dest=dominik.switkowski@gmail.com,sender=root@lsnet.pl]
bantime = 24400
maxretry = 2

#
# Http servers
#

[nginx-w00tw00t]
enabled  = true
port      = http,https
filter   = nginx-w00tw00t
action   = iptables-allports[nginx-w00tw00t]
logpath = /var/log/nginx/*.access.log
maxretry = 1
bantime  = 96400

#
# Mail servers
#

[postfix]
enabled  = true
port     = smtp,ssmtp,submission
filter   = postfix
logpath  = /var/log/mail.log
bantime  = 1880
maxretry = 2

[sasl]
enabled  = true
port     = smtp,ssmtp,imap2,imap3,imaps
filter   = sasl
logpath  = /var/log/mail.log
bantime  = 1880
maxretry = 1

[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-allports[name=dovecot-pop3imap]
port = imap2,imap3,imaps
logpath = /var/log/mail.log
maxretry = 3
bantime = 9200

Powyższego przykładu nie polecam kopiować jeden do jednego, niektóre opcje należy dostosować do swojej konfiguracji serwera. W sekcji ACTIONS opcja banaction ma wartość iptables-allports co oznacza blokadę wszystkich usług. Drugą możliwością jest iptables-multiport wtedy blokada nałożona na atakującego obejmuje tylko atakowaną usługę. Przedstawiając to obrazowo, jeśli ktoś nam atakuje http to fail2ban blokuje mu dostęp do naszego serwera www, ale już do ssh,smtp... jak najbardziej dostęp ma. W sekcji JAILS w konfiguracjach dla poszczególnych usług zwróćmy uwagę na zmienną port. W konfiguracji dla usługi ssh port jest ustawiony na... ssh. Wygląda to co najmniej śmiesznie natomiast wynika to ze sposobu jak fail2ban rozwiązuje odwzorowanie nazw usług sieciowych na numery portów, korzystając przy tym z pliku /etc/services. Równie dobrze można podawać port w postaci liczby.

Warto wspomnieć o możliwości otrzymywania email-a o blokadzie atakujących nas hostów. Dla mnie jest to zbyteczna funkcjonalność wobec tego nie opisuje jej szczegółowo. Jeżeli jednak zdecydujemy się na w/w powiadomienia musimy mieć zainstalowany serwer smtp.

Rozszerzenie fail2ban o obsługę dodatkowych usług sieciowych, aplikacji jest możliwe i zarazem dość proste. W sieci jest wiele gotowych rozwiązań, również sami możemy pokusić się o stworzenie własnych filtrów pod warunkiem znajomości wyrażeń regularnych. Dobrym przykładem może być blokowanie skanera w00tw00t.

I na koniec sposób na usunięcie blokady nałożonej przez fail2ban: odblokowanie adresu IP.