fail2ban și wordpress

BanDe câteva zile tot mă anunță plugin-ul de sucuri de pe wordpress că am gramezi de încercări de bruteforce pe wp-login.php, toate cu IP-uri din Rusia. Și pentru că mi-a fost lene să stau să fac config în nginx prin care să permit doar ip-ul meu de acasă (și încă vreo 2-3) m-am gândit să încerc să rezolv problema mai elegant folosind fail2ban care este deja instalat pe server. Avantajul principal mai este și că mă lasă să mă loghez din altă parte dacă nu greșesc parola de prea multe ori față de metoda prin care aș bana tot mai puțin 1-2 ip-uri pe care le utilizez.

Folosesc fail2ban pe servere de aproape 1-2 ani, înainte eram “prieten” mult mai bun cu denyhosts. Dar ăla a cam fost abandonat și nici nu funcționa decât pe serviciile care aveau suport pentru tcp wrappers.  Trecând forțat la fail2ban am descoperit că începe să-mi placă încet, încet. Pe lângă faptul că există comenzi de “debanare” a unui IP fără să stai să dai sintaxa de iptables, mai pot să fac și chestiuțe de genul ăsta pe diverse loguri. Totul e să reușesc să regulez expresia aia cum trebuie.

(btw, sintaxa pentru debanare este “fail2ban-client set <jail-name> unbanip <ip-address>” )

Buun, primul pas este să ne uităm în logurile serverului de web să vedem cum arată liniile de încercare de login. Adică cam așa :

77.41.227.31 – – [21/Jun/2015:19:34:07 +0300] “POST /wp-login.php HTTP/1.1” 200 4024 “https://lazyadmin.ro/wp-login.php” “Mozilla/5.0 (Windows NT 6.0; rv:34.0) Gecko/20100101 Firefox/34.0”

Fail2ban are conceptul de filtre și jails. Definim niște filtre care trebuie să faca match pe linii din log iar apoi creăm un jail în care unim un filtru cu o acțiune. Exemple de filtre găsiți în /etc/fail2ban/filter.d/. De acolo m-am inspirat și eu pentru crearea filtrului pentru wp-login. Am creat un filtru nou denumit wp-login.conf în filter.d cu următoarele linii :


#
[Definition]
failregex = ^<HOST> .* “POST /wp-login.php.*$
ignoreregex =

Mai precis, ca să disecăm expresia regulată de mai sus, avem așa :

  • “^” – ancora de început de linie (marchează începutul liniei din log)
  • “<HOST>” – e sintaxa IP-ului pe care îl vom marca pentru banare
  • “.*” – “.” este orice 1 caracter, “*” înseamnă de 0 (zero) sau mai multe ori (până la infinit) ceea ce este înainte. Adică avem orice mai multe caractere, până la întâlnirea cuvântului “POST”.
  • “POST /wp-login.php” – este bucata relevantă din linia de log, cea care ne indică faptul că se trimite o încercare de logare pe wp-login.php
  • Mai avem un “.*” însemnând orice altceva până la “$” care este ancora de final de linie (marchează capătul liniei din log).

 Următorul pas este să testăm expresia regulată pe fișierul de log al serverului web. În cazul meu, pe logul nginx-ului :

fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wp-login.conf

Dacă face match pe liniile din log veți vedea un rezultat similar cu acesta :

……………………………………………………………..
Failregex: 2240 total
|-  #) [# of hits] regular expression
|   1) [2240] ^<HOST> .* “POST /wp-login.php.*$

……………………………………………………………..

Următorul pas este să punem filtrul într-un jail și să îi spunem ce să facă cu match-urile respective. Declarațiile de jail-uri sunt în /etc/fail2ban/jail.conf și în /etc/fail2ban/jail.local. Nu faceți greșeala să editați jail.conf, există riscul să fie suprascris la update-ul pachetului fail2ban, mai bine adăugați declarațiile în jail.local undeva la final :

[wp-login]
enabled = true
filter = wp-login
action = iptables-multiport[name=NoAuthFailures, port=”http,https”]
logpath = /var/log/nginx/access.log
findtime = 7200
bantime = 86400
maxretry = 5

Adică dacă există mai mult de 5 încercări de logare în 7200 de secunde (2h) de la aceeași adresă IP, va fi adăugată acea adresă IP într-o regulă de iptables care filtrează porturile http si https pentru 86400 de secunde (24h). Vă jucați cum vreți cu valorile astea. Pentru mine sunt relativ ok.

Restartați serviciul de fail2ban și bucurați-vă de liniște :

2015-06-21 21:16:37,361 fail2ban.actions: WARNING [wp-login] Ban 37.122.69.229

15 Comments fail2ban și wordpress

  1. Mars

    @Sabotor, asa este; dar cum aici este vorba despre un admin, rezulta ca e mult mai placut sa-si bage singur capul in config decat sa dea 3 clickuri :).

    Reply
    1. Radu

      Mars, este vorba de un admin leneș. Dacă știam că există plugin nu îmi mai băteam capul…

    2. Sabotor

      In plus, mi se pare mai eleganta solutia cu plugin de wordpress – trimite totul in syslog, in auth (sau authpriv), nu in logurile de apache.

  2. jules

    Deci sa inteleg ca preferi chinuiala in loc de un plugin care face asta automat? :))
    iThemes Security folosesc de vreun an. Si m-am speriat cind am vazut cite incercari de login am zilnic.
    Si imi spune frumos IP si userul cu care s-a incercat login.
    De obicei userul e admin, dar asta nu mai exista de multa vreme.
    Aia mai destepti au baze de date misto si mai ghicesc userul. Daca vad vreun login cu userul actual, il schimb si il sterg pe cel vechi.

    Dar eu zic sa arunci o privire pe pluginul asta.
    L-am setat frumos pe trei incercari nereusite si 24 de ore ban. Basca aia insistenti primesc deny din server. Ma rog, asta fac manual.

    Reply
    1. jules

      Imi dau reply singur. Eu am wordpress default instalat si isi face singur update-uri si alte mizerii.
      Daca e vorba de o instalare customizata, atunci probabil chinuiala ta are sens.
      Dar tot zic sa arunci o privire pe pluginul ala.

  3. vineri

    Nu am lucrat nici cu failban iar cu wordpress prea putin dar regula creata de tine, cred, nu e limitata doar la incercarile de login esuate ci cuprinde toate login-urile, inclusiv cele cu succes. Banuiala mea, e ca daca le loghezi de 5 ori in 2h, ip-ul tau o sa fie blocat,

    Reply
    1. Sabotor

      Poate vrea sa blocheze pe oricine incearca sa se logheze, IP-ul lui fiind in lista de exceptii. Dar da, aia prinde tot ce acceseaza wp-login. Ia, hai sa vedem :D.

    2. Sabotor

      si-am luat ban :D. Ma rog, prinde orice ip incearca sa apese se logheze de 5 ori in 2 ore, ca trebuie sa faca POST.

    3. Radu

      Exact. Am cel puțin 1 IP în lista de excepții și în rest mi se rupe, trebuie să fiu mult prea beat sau mult prea fraier încât să greșesc parola de 5 ori. Sau să fiu nevoit să mă loghez de 5 ori în 2 ore de la același IP.
      În cel mai rău caz eu pot să intru și să scot regula de mână din fail2ban.

    4. Sabotor

      În cel mai rău caz eu pot să intru și să scot regula de mână din fail2ban.

      Pentru ca nu esti la fel de paranoic ca mine si blochezi numai http/https. Eu am pus pe toate porturile.

  4. Sabotor

    tot legat de fail2ban, am observat ca ultima versiune (0.9.1) are niste buguri suparatoare – da ceva eroare cand incearca sa porneasca unele jailuri, ceva de genu’ asta:

    ‘ipjailfailures’: <function at 0x22a8758>})’: Error binding parameter 0 – probably unsupported type.

    Asa ca am instalat o versiune precedenta – 0.8.14.

    Reply
  5. gupi

    Ce nu-mi place mie la solutiile de acest gen (insa e doar o opinie personala) e faptul ca la un atac distribuit peste multe adrese IP, serverul trebuie musai sa proceseze niste cereri, rezultand in incarcarea sa nejustificata.

    Asa ca am pus o directiva de autentificare suplimentara cu htpasswd pentru wp_login.php. Pentru mine nu e deranjant sa mai bag un user/password, insa botii sunt blocati inainte de a accesa fisierele, si asta cu resurse mult mai mici.

    PS: similar si pentru xmlrpc.php

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *