Visas sistēmas darbojas Tavs IP: 216.73.217.36 info@cloudhosting.lv +371 66 66 29 69 Klientu zona

← Visi jautājumi

Kā ar fail2ban aizsargāt SSH, WordPress un e-pastu

fail2ban seko līdzi žurnālfailiem un uz laiku bloķē IP adreses, kas atkārtoti neveiksmīgi mēģina autentificēties. Šī pamācība parāda praktisku iestatīšanu Linux serverī: saprātīgi SSH noklusējumi, pielāgots jail WordPress pieteikšanās plūdiem, jail Postfix un Dovecot, savu adrešu iekļaušana baltajā sarakstā un banu pārbaude. Tā domāta ikvienam, kas pats uztur savu VPS vai dedicēto serveri un žurnālus lasa laiku pa laikam, nevis visu dienu.

Kā darbojas jail: filtrs, darbība, žurnāls

Viss fail2ban griežas ap jail, un jail sastāv tikai no trim kopā savienotām daļām:

  • Žurnāls: fails vai systemd žurnāls, ko jail novēro, piemēram, /var/log/auth.log.
  • Filtrs: regulāro izteiksmju kopa (failregex), kas nosaka, kuras žurnāla rindas skaitās kā neveiksme un kura IP to izraisīja.
  • Darbība: kas notiek, kad viena IP findtime laikā sakrāj maxretry neveiksmes, parasti ugunsmūra kārtula, kas uz bantime laiku atmet tās trafiku.

Instalē no standarta repozitorijiem:

apt install fail2ban        # Debian, Ubuntu
dnf install fail2ban        # AlmaLinux, Rocky

Nekad nelabo /etc/fail2ban/jail.conf pa tiešo, pakotņu atjauninājumi to pārraksta. Savas izmaiņas liec /etc/fail2ban/jail.local vai atsevišķos failos zem /etc/fail2ban/jail.d/. Filtri dzīvo /etc/fail2ban/filter.d/, katrs savā failā.

Saprātīgi noklusējumi un sshd jail

/etc/fail2ban/jail.local, kas nosedz lielāko daļu viena servera scenāriju:

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
bantime.maxtime   = 1w
ignoreip = 127.0.0.1/8 ::1 203.0.113.10

[sshd]
enabled  = true
maxretry = 3
bantime  = 2h

bantime.increment banu dubulto katru reizi, kad tā pati IP atgriežas, līdz pat nedēļai, un tas klusi novāc neatlaidīgos botus. Debian 12 un citās distribūcijās bez rsyslog nav auth.log, tāpēc liec sshd jail lasīt systemd žurnālu: pievieno backend = systemd zem [sshd]. Pārlādē un pārliecinies, ka jail strādā:

systemctl reload fail2ban
fail2ban-client status sshd

WordPress jail pret wp-login.php plūdiem

Boti bombardē wp-login.php un xmlrpc.php ar POST pieprasījumiem. Tīmekļa servera piekļuves žurnāls nepasaka, vai parole bija pareiza, bet tas netraucē: cilvēks kļūdās divas reizes, bots sūta simtiem POST. Izveido /etc/fail2ban/filter.d/wordpress-login.conf:

[Definition]
failregex = ^<HOST> .* "POST /wp-login\.php
            ^<HOST> .* "POST /xmlrpc\.php
ignoreregex =

Tad pats jail, failā /etc/fail2ban/jail.d/wordpress.local:

[wordpress-login]
enabled  = true
port     = http,https
filter   = wordpress-login
logpath  = /var/log/nginx/access.log
maxretry = 5
findtime = 5m
bantime  = 4h

Divi brīdinājumi. Pirmkārt, pirms ieslēgšanas notestē filtru pret īsto žurnālu un pārliecinies, ka sakrīt tikai POST rindas:

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

Otrkārt, ja vietne stāv aiz reversā proksija vai CDN, pirmais lauks žurnālā ir proksija adrese, un šis jail nobanotu tavu paša proksiju. Vispirms iestati, lai tīmekļa serveris žurnālā raksta īsto klienta IP no X-Forwarded-For, un tikai tad ieslēdz jail.

Pasts: postfix un dovecot jail

Abiem fail2ban nāk ar gataviem filtriem, savs regex nav vajadzīgs:

[postfix]
enabled = true
mode    = aggressive
logpath = /var/log/mail.log

[dovecot]
enabled = true
logpath = /var/log/mail.log

postfix jail aggressive režīmā ķer SASL autentifikācijas kļūdas uz 25. porta un submission portiem, kā arī klientus, kas lauž SMTP protokolu. dovecot jail nosedz IMAP un POP3 pieteikšanos. Pasta brute force parasti ir lēns un izkliedēts, viens mēģinājums stundā no vienas IP ir ierasta lieta, tāpēc šiem diviem jail apsver findtime pacelšanu līdz 1h; mēģinājumu budžets paliek tas pats, bet noķerti tiek arī lēnie skeneri.

Baltais saraksts un banu pārbaude

Izslēgt sevi no sava servera ir klasiskā fail2ban avārija. Ievieto katru adresi, no kuras administrē, ignoreip rindā [DEFAULT] sekcijā, atdalot ar atstarpēm, CIDR pieraksts ir atļauts. Iekļauj biroja un mājas IP, kā arī jebkuru monitoringa sistēmu, kas regulāri pārbauda servisus.

Ikdienas pārbaude:

fail2ban-client status                     # jail saraksts
fail2ban-client status sshd                # skaitītāji un nobanotās IP
fail2ban-client set sshd unbanip 198.51.100.7
fail2ban-client set sshd banip 203.0.113.99
grep Ban /var/log/fail2ban.log             # banu vēsture

Pēc jebkuras konfigurācijas maiņas palaid fail2ban-client reload un vēlreiz apskati jail statusu; drukas kļūda filtrā klusām rada jail, kas nesakrīt ne ar vienu rindu.

Kāpēc fail2ban neaizstāj SSH tikai ar atslēgām

fail2ban ir reaktīvs. Katra uzbrūkošā IP joprojām dabū maxretry mīnus vienu bezmaksas minējumu katrā findtime logā, un īsti uzbrukumi ir izkliedēti: botu tīkls ar desmit tūkstošiem adrešu dienā dabū desmitiem tūkstošu paroles minējumu, nepārkāpjot nevienu limitu. Ja paroļu autentifikācija ir ieslēgta un parole ir vāja, fail2ban uzbrucēju tikai palēnina.

Tāpēc uztver šos slāņus kā papildinošus. SSH tikai ar atslēgām noņem pašu uzminamo noslēpumu; fail2ban tad novāc troksni, velti tērēto CPU uz TLS un SSH rokspiedieniem un nosedz servisus, kur atslēgas nav iespējamas, piemēram, pastu un WordPress pieteikšanos. /etc/ssh/sshd_config:

PasswordAuthentication no
KbdInteractiveAuthentication no

Viss augstāk aprakstītais uz svaiga servera prasa apmēram pusstundu un pēc tam neprasa uzturēšanu. Ja gribi vispirms patrenēties uz tīras mašīnas, pietiek ar nelielu VPS: viss šeit aprakstītais labi darbojas ar 1 GB RAM, un konfigurāciju vari lauzt un būvēt no jauna, neaiztiekot produkciju.

Gribi, lai to darām mēs?
Viena domēna sertifikāts. Viens hostvārds, viens uzticams sertifikāts.
Uzzināt vairāk

Gatavs sākt?

Palaid dažās minūtēs vai aprunājies ar inženieri par piemērotāko risinājumu.