Security for mailcow — ghid
Instalare
- Modulul vine în mailcow Toolkit 0.6.0 sau mai nou (un pachet, câte o licență pe produs). Pe serverul mailcow, ca root, rulezi installer-ul Toolkit ca de obicei:
sudo ./install.sh --mailcow-dir /opt/mailcow-dockerized --name <instanță>, sau actualizezi Toolkit-ul din Sistem → Actualizări (Toolkit). Installer-ul copiazădata/web/mlw-security/, creează tabelele modulului în baza mailcow, adaugă intrarea în meniu și timer-ul la minutmlw-mailcow-security-<instanță>.timerși reîncarcă php-fpm. - Deschide Sistem → Securitate din meniul de administrare mailcow.
Licență
Deschide Sistem → Actualizări (Toolkit) și găsește cardul Security for mailcow: lipești cheia și o activezi sau pornești perioada de probă de 30 de zile. Din consolă: php /web/mlw-toolkit/cli.php activate mailcow-security <CHEIE> în php-fpm-mailcow. Licența se verifică zilnic; fără internet modulul funcționează 7 zile de la ultima verificare reușită.
Fără licență validă nu se citește, nu se detectează, nu se blochează și nu se trimite nimic; blocările făcute înainte se ridică totuși la expirare, iar istoricul rămâne. Nu se șterge nimic.
Prima rulare
Prima rulare importă ce mai păstrează mailcow în loguri (de obicei ultimele ore) și nu blochează și nu alertează. De atunci jobul citește doar rândurile noi, la fiecare minut. Panou → Stare arată ultima rulare; dacă un rând spune că s-au pierdut linii, mailcow și-a tăiat logurile înainte să fie citite (un server foarte încărcat): mărește LOG_LINES în mailcow.conf.
Ce se citește
| Sursă | Ce devine eveniment |
|---|---|
dovecot (redis DOVECOT_MAILLOG) |
autentificări IMAP / POP3 / ManageSieve eșuate (cu numărul de încercări), conexiuni care nu se autentifică, autentificări reușite |
postfix (redis POSTFIX_MAILLOG) |
SMTP AUTH eșuat, trimiteri autentificate, respingeri rspamd, respingeri pe liste negre DNS, încercări de relay, sondări de protocol (conexiune pierdută după EHLO, pipelining, erori TLS, postscreen) |
SOGo (redis SOGO_LOG) |
autentificări în webmail eșuate și reușite |
fail2ban (redis NETFILTER_LOG) |
fiecare blocare făcută de fail2ban-ul mailcow |
| serverul web (log docker, prin agentul gazdei) | răspunsuri 4xx: căi de exploit cunoscute (/.env, /.git, wp-login.php, phpMyAdmin, …) și alte 404 |
| php-fpm (log docker, prin agentul gazdei) | autentificări eșuate în interfața și API-ul mailcow |
Evenimentele de la adrese private (containerele mailcow, un reverse proxy în fața mailcow) și din rețelele ignorate nu se păstrează. Evenimentele se numără pe minut, adresă, cutie și sursă; istoricul se păstrează implicit 90 de zile (Setări).
Panou
- Totalurile ultimelor 24 de ore pe tip; un clic deschide evenimentele respective.
- Ultimele 14 zile: autentificări eșuate, scanări și spam pe zi (valorile sunt sub Valori).
- Stare: modul (doar monitorizare sau protecție automată), blocările active, blocările fail2ban ale mailcow, incidentele deschise, ultima rulare.
- Cele mai active adrese cu butonul Blochează, cutiile țintite, incidentele active.
Reguli și incidente
O regulă numără evenimentele într-o fereastră glisantă. Când pragul e atins deschide un incident; cât timp atacul continuă, același incident se prelungește, nu se repetă.
| Regulă | Ce numără | Implicit |
|---|---|---|
| Forță brută pe login web | autentificări eșuate în SOGo / interfața / API-ul mailcow, per adresă | 5 în 15 min → blocare 24 h |
| Forță brută lentă | autentificări eșuate per adresă, pe o zi | 20 în 24 h → blocare 24 h |
| Password spraying | cutii diferite pe care a eșuat aceeași adresă | 5 în 60 min → blocare 7 zile |
| Atacator recidivist | blocările fail2ban mailcow ale aceleiași adrese | 3 în 7 zile → blocare 30 de zile |
| Scanare de exploit-uri web | cereri pentru căi de exploit / scurgeri | 3 în 30 min → blocare 7 zile |
| Scanare web (404) | răspunsuri 404 per adresă | 40 în 30 min → alertă |
| Testare de relay | „Relay access denied” per adresă | 3 în 60 min → blocare 7 zile |
| Scanare de protocol | conexiuni care nu se autentifică sau încalcă protocolul | 30 în 60 min → alertă |
| Val de spam | respingeri rspamd și pe liste negre, per adresă | 20 în 60 min → alertă |
| Cutie poștală țintită | eșecuri pe aceeași cutie, de la cel puțin 5 adrese | 30 în 60 min → alertă |
| Val de trimiteri | mesaje trimise de aceeași cutie | 300 în 60 min → alertă |
| Autentificări de la multe adrese | adrese diferite de pe care se autentifică aceeași cutie | 8 în 60 min → alertă |
| Autentificare după eșecuri | prima autentificare de pe o adresă care a eșuat pe cutie | 3 eșecuri în 24 h → alertă (critică) |
În Reguli poți opri fiecare regulă și îi poți schimba pragul, fereastra, acțiunea și durata blocării (0 = permanent). Regulile pe adresă pot alerta sau bloca; cele pe cutie pot alerta, limita trimiterea sau opri autentificarea. Valorile implicite le readuce pe toate.
Incidente le listează după stare (deschis, văzut, rezolvat, fals pozitiv), severitatea minimă și regulă. Fals pozitiv pune adresa pe lista de excepții și îi ridică blocările.
Acțiuni automate
Comutatorul din capul paginii Reguli e oprit la început: modulul doar urmărește, iar fiecare incident spune ce s-ar fi făcut („ar fi blocat-o”). Lasă-l așa câteva zile, uită-te la incidente, ajustează regulile, apoi pornește-l. Incidentele al căror atac continuă sunt tratate la rularea următoare.
Nu se blochează niciodată automat:
- adresele private și rezervate;
- lista de excepții a modulului (Setări) și lista de excepții fail2ban a mailcow (Configurare → Fail2ban);
- adresele publice ale serverului (din verificarea DNS-ului invers a Toolkit-ului);
- cu protejarea adreselor cunoscute pornită (implicit), adresele de pe care s-a intrat cu succes într-o cutie în ultimele 30 de zile — un coleg care greșește parola nu rămâne pe dinafară.
Blocări
O blocare pune adresa sau rețeaua în denylist-ul fail2ban al mailcow. netfilter-ul mailcow o aplică în firewall pe toate porturile mailcow în cel mult un minut, iar o vezi și în pagina Fail2ban a mailcow. Modulul o ridică la expirare; o blocare ștearsă din pagina Fail2ban a mailcow contează ca ridicată.
Blocări arată blocările modulului (motiv, de cine, până când, starea Cloudflare), blocările temporare fail2ban ale mailcow (Ridică sau Fă-o mai lungă), restul denylist-ului mailcow și istoricul. Formularul de sus blochează o adresă sau o rețea (CIDR) între 1 oră și 30 de zile, sau permanent; propria ta adresă curentă e refuzată.
Dacă Manage external e pornit în setările fail2ban ale mailcow, netfilter nu atinge firewall-ul: pagina te avertizează, iar propriul tău firewall trebuie să aplice lista mailcow.
Cloudflare
Când gazdele web ale mailcow (interfața, webmail-ul) stau în spatele proxy-ului Cloudflare, atacurile web ajung la mailcow de la adresele Cloudflare, iar netfilter nu le poate opri. În Setări → Cloudflare alegi blocările regulilor web și cele manuale bifate sau toate blocările: fiecare blocare devine atunci și o regulă IP Access Cloudflare la nivel de cont („block”), care acoperă toate zonele contului și se șterge odată cu blocarea. Se folosesc datele Cloudflare salvate în Sistem → DNS și Cloudflare; tokenul are nevoie de Account → Account Firewall Access Rules → Edit (Global API Key poate și el). Cloudflare blochează adrese individuale și intervalele /16 și /24 (IPv4), /32, /48 și /64 (IPv6).
O adresă, o cutie
Un clic pe orice adresă arată evenimentele ei, cutiile încercate, autentificările reușite, incidentele și blocările, DNS-ul invers și linkuri spre AbuseIPDB, ipinfo și Shodan; o poți bloca, îi poți ridica blocarea sau o poți pune pe lista de excepții (opțional și pe a mailcow).
Un clic pe orice cutie arată adresele care au încercat-o, cu eșecurile și autentificările reușite una lângă alta (un semn de avertizare marchează o adresă cu ambele), trimiterile, autentificările și incidentele. Acțiuni, toate prin funcțiile mailcow și jurnalizate și de mailcow:
- Oprește autentificarea: cutia primește în continuare e-mail, nimeni nu se mai poate autentifica („disallow login” din mailcow); Repornește autentificarea anulează.
- Închide sesiunile IMAP/POP3: dovecot deconectează sesiunile imediat (prin agentul gazdei).
- Cere schimbarea parolei la următoarea autentificare.
- Limitează trimiterea la N mesaje pe oră (Setări) sau scoate limita.
Alerte
În Setări → Alerte: adresa de e-mail (gol = adresa de notificare a Toolkit-ului), tokenul botului Telegram (criptat; „-” îl șterge) și id-ul chatului, severitatea minimă (implicit: ridicată), maximul de alerte pe oră (restul se numără în alerta următoare), limba (engleză sau română) și rezumatul zilnic (după 07:00). Trimite o alertă de test verifică ambele canale. Fiecare incident nou de la severitatea aleasă în sus înseamnă o alertă, cu link spre el.
Jurnal și consolă
Jurnal listează fiecare acțiune: blocări, ridicări, schimbări ale listei de excepții, stări de incident, acțiuni pe cutii, schimbări de reguli și setări — ale unui administrator sau ale unei reguli.
În php-fpm-mailcow (docker compose exec -u www-data php-fpm-mailcow …):
php /web/mlw-security/cli.php status
php /web/mlw-security/cli.php ban 203.0.113.7 48 "motiv"
php /web/mlw-security/cli.php unban 203.0.113.7
Dezinstalare
sudo ./uninstall.sh ridică întâi toate blocările modulului, apoi șterge fișierele și timer-ele. Tabelele mlw_sec_* rămân în baza mailcow (și în copiile ei de siguranță).