Fail2ban - konfiguracija i uporaba, 3. dio

U prethodna dva nastavka smo vam pokazali način rada, te osnovnu konfiguraciju i uporabu programa fail2ban. U ovom nastavku zaokružit ćemo priču, i objasniti kako napraviti svoj, odnosno prilagoditi neki postojeći filter svojim potrebama.

Kako sam fail2ban donosi filtere za većinu servisa koji će vam ikada trebati, bio nam je problem osmisliti neki novi filter. No, ipak smo se dosjetili jedne svima poznate pojave u apache logovima: tragovi potrage za bugovitim skriptama na sustavu.

Obično se traže stare inačice PHP skripti, a najčešće je to phpmyadmin. PhpMyAdmin je PHP skripta za jednostavan rad s MySql bazama podataka na vašem sustavu, ali je poznat po mnogobrojnim sigurnosnim rupama.

U vašim logovim često možete vidjeti unose slične ovima:

XX.YY.128.146 - - [18/Sep/2009:15:04:52 +0200] "GET
    /phpmyadmin/main.php HTTP/1.0" 404 361 "-" "-"
XX.YY.128.146 - - [18/Sep/2009:15:04:17 +0200] "GET
    /setup/phpmyadmin/main.php HTTP/1.0" 404 367 "-" "-"
XX.YY.128.146 - - [18/Sep/2009:15:04:31 +0200] "GET
    /administrator/phpmyadmin/main.php HTTP/1.0" 404 375 "-" "-"
XX.YY.128.146 - - [18/Sep/2009:15:04:31 +0200] "GET
    /admin/phpMyAdmin-2.5.6-rc2/main.php HTTP/1.0" 404 375 "-" "-"

Napadači žele "ispipati" imate li PhpMyAdmin, i koje je inačice. Naravno, obično se radi o script-kiddies korisnicima, ali koji ipak uz pomoć određenih programa mogu upasti na vaš stroj. Iz tog razloga je najbolje preventivno onemogućiti napadačevu IP adresu. Pa, krenimo redom.

U direktoriju /etc/fail2ban/filter.d napravimo novu datoteku apache-php.conf (izostavili smo komentare radi kratkoće, vi ih slobodno ostavite):

[Definition]
failregex = [[]client <HOST>[]] .*phpmyadmin.*$
[[]client <HOST>[]] .*PhpMyAdmin.*$
ignoreregex = 161\.53\.XX\.\d
161\.53\.\d\.YY

Umjesto XX i YY upišite IP adrese i adrese mreže svog LAN-a, i adrese vaših suradnika koji trebaju pristu PhpMyAdminu. Slično možete i za bilo koji dio IP adrese, s napomenom da oznaka '\d' označava regex klasu '[0-9]', dakle obuhvaća sve brojeve od 0 do 9. Ovu sintaksu, među ostalim, rabi programski jezik Python u kojem je napisan fail2ban.

U datoteku jail.conf dodamo retke:

[apache-php]

enabled = true
port   = http,https
filter  = apache-php
action   = iptables[name=apache-php, protocol=tcp]
logpath = /var/log/apache*/*error.log
maxretry = 5

i napravimo

# fail2ban-client reload

Što smo ovime napravili? Rezultat će biti zabrana pristupa bilo kojem klijentu (koji nije u varijabli ignoreregex), a koji pokuša više od 5 puta pristupiti PhpMyAdmin programu. Ovo će odraditi iptables.conf, no vi možete birati i između nekoliko drugih načina zaštite (primjerice preko tcp_wrappera).

Sami regularni izrazi su case-sensitive, i morat ćete pripaziti na velika i mala slova, što uopće nije loše kako slučajno ne bi onemogućili previše stvari odjednom.

Umjesto zabrane, možete jednostavno poslati mail sebi ili drugim kolegama da se nešto događa. U iptables.conf upišite:

actionban = iptables -I fail2ban-<name> 1 -s <ip> -j DROP
printf %%b "Pozdrav,\n
Klijent <ip> je blokiran zbog <failures> pokusaja\n
pristupa po pravilu <name>.\n
\n
Vas Fail2Ban" | mail -s "[Fail2Ban] <name>: <ip> blokiran" pero@domena.hr

Uz zabranu, fail2ban će poslati mail s osnovnim informacijama na neku adresu. Oprezno s ovom funkcijom, kako pretjerani broj mailova ne bi napravio DDoS sam po sebi!

Na kraju, samo ćemo navesti konfigurabilne parametre koje možete rabiti u svojim "zatvorima". Iako su im imena samoobjašnjiva, radi potpunosti navest ćemo ih, zajedno s pretpostavljenim vrijednostima:

maxretry        3

Broj pokušaja, točnije, broj puta kada je neki redak u logovima odgovorao regexu koji smo postavili. Radi se o
individualnim brojevima za svaku IP adresu.

filter          Ime filtera (u našem slučaju apache-php). 

Filter se nalazi u direktoriju /etc/fail2ban/filters.d, u našem slučaju bi to bio apache-php.conf. Vrijedi napomenuti da svako pravilo unutar filtera povećava brojač (maxretry) za jedan, naravno ukoliko se redak u logu poklapa sa zadanim regularnim izrazima.

findtime        600 sec

Brojač će se vratiti na nulu, ukoliko unutar ovog vremena s iste adrese ne bude nikakve dodatne aktivnosti. Neki programi pokušavaju proći "ispod radara" i svoje pokušaje smanjuju na jedva primjetnu razinu. Neke pak treba što prije detektirati i onemogućiti, pa je namještanje ove vrijednosti individualna potreba svakog sistemca i stroja.

bantime         600 sec

Vremenski period koliko će određena IP adresa biti zabranjena.

logpath         /var/log/messages

Jednostavno, putanja do log datoteku koju ćemo nadzirati. Može biti /var/log/syslog, ili bilo što drugo, pa čak i izvan /var/log.

Obavezno istestirajte nova pravila prvo na neprodukcijskom stroju, a ukoliko zapnete konzultirajte Wiki dokumentaciju na http://www.fail2ban.com/wiki, a pomoć za Python regularne izraze možete naći na http://docs.python.org/dev/howto/regex.html.

Za općenite regularne izraze, jako dobar izvor informacija je web sjedište http://www.regular-expressions.info/.

Sretno u uporabi fail2ban sustava!

Kuharice: 
Kategorije: 
Vote: 
0
No votes yet

Komentari

Uz standardne filtere koji dolaze s fail2banom, ja sam, brem za sada, imao potrebu samo za jos jednim - Dovecot filterom. Imao sam zapise u logovima poput ovih:

 

Oct 14 19:11:08 teologija dovecot-auth: pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=amanda rhost=190.8.129.60

 

i znalo ih je biti po 100-tinjak u nekoliko minuta. Konzultirajući man i wiki, napravio sam dovecot-auth.conf filter sa sljedecim linijama:

 

[Definition]

failregex = dovecot.*(?:authentication failure).*rhost=(?:::f{4,6}:)?(?P<host>\S*)

ignoreregex =

 

a u jail.conf sam dodao:

 

[dovecot]

enabled =  true
action = iptables-multiport[name=Dovecot, port="110,995,143,993", protocol=tcp]
filter = dovecot-auth
logpath = /var/log/auth.log
maxretry = 6

Preporucio bih povecanje maxretry varijable, jer (legalni) korisnici vole vise puta isprobati username i zaporku ako ne prodje prvi put, pa cete blokirati svoje korisnike na 10 minuta ako probaju 6 puta.

Dodajte barem svoj LAN u ignoregex.

Kada sam unosio vrijednost, razmišljao sam da stavim maxretry = 10, no mislio sam da je sasvim dovoljno 6. Znam da ljudi nekoliko puta isprobavaju, no dojma sam da je ovako sasvim dovoljno. No, vidjet ću kako će ići pa ću promijeniti ako bude potrebe.

U svakom slučaju, hvala na prijedlogu! ;)

Nedavno sam imao slučaj velikog broja pokušaja spajanja FTP-om na server. Otprilike 4-6 neuspjelih pokušaja spajanja u minuti je dolazilo svaki put s različite IP adrese koja je očito krivotvorena. Ja sam odmah pribjegao sigurnom rješenju - zaključavanju accounta. Napad je trajao punih 10 sati. Kako je moguće da se ovako nešto dogodi u vremenu kad nisam za računalom, zanima me da li postoji nekakva mogućnost obrane od ovakvih napada.

Kako ne dolaze s iste adrese, najjednostavnije je port na kojem slusa sshd prebaciti na neki drugi (npr 54321 ili 22222). Naravno, morate legalne korisnike upozoriti da se spajaju na novi port. Ovo ce prakticki onemoguciti 'script-kiddies', ljude bez znanja koji samo pokrecu tudje skripte i programe. Prave hakere je, istina, tesko onemoguciti.

Drugo, mozete promijenite sebi i korisnicima zaporke s necim sto nije lako pogoditi, nije iz imenika ili slicno. Za to se mozete posluziti naredbom pwgen, ili nasim generatorom zaporki na http://sistemac.carnet.hr/passgen . Tako cete rizik od provale jako smanjiti, jer se ovdje ne radi o brute-force napadima, nego se rabe predefinirane zaporke (s drugih provaljenih sustava ili iz imenika).