Īsi sakot: Fail2ban lasa žurnālu failus un ugunsmūrī bloķē adreses, kas laika logā izceļas pārāk bieži. Nginx un Apache tam ir gatavi jails, piemēram, nginx-botsearch vai apache-noscript; savus filtrus pārbaudiet ar fail2ban-regex. Iestatījumiem jābūt jail.local, jūsu pašu adresēm ignoreip, atkārtotos pārkāpējus pārtver recidive jail. Pret atsevišķiem mērķtiecīgiem uzbrukumiem Fail2ban nepalīdz, pret masveida skenēšanu gan.
Ja žurnāli ir pilni ar skeneriem
Kas šajās dienās aplūko savu tīmekļa serveru piekļuves protokolus, tos bieži atrod pilnus ar pieprasījumiem uz ceļiem, kuru nemaz nav: vecas administrēšanas saskarnes, testa faili, citu produktu zināmas ievainojamības. Tādā situācijā kā PHP2Shell pievienojas mērķtiecīga ievainojamu serveru meklēšana: Cloudflare un Patchstack ziņoja par uzbrukuma mēģinājumiem, Unit 42 saskaitīja vairāk nekā 22,6 miljonus eksponētu, potenciāli ievainojamu instanču.
Fail2ban ir pārbaudīts rīks pret šo masu. Tas lasa žurnālu failus, ar filtriem atpazīst uzkrītošus ierakstus un nosūtītāja adresi uz noteiktu laiku bloķē ugunsmūrī. Tas atslogo serveri, samazina žurnālu troksni un apgrūtina sistemātisku izmēģināšanu no viena avota.
Ko Fail2ban nevar, ir tikpat svarīgi: viens pieprasījums, kas izmanto ievainojamību, netiek novērsts. Pret PHP2Shell palīdz tikai PHP atjauninājums. Kā automatizēti uzbrukumi norit, apraksta Masveida skenēšanas pēc neielāpota PHP.
Fail2ban Nginx un Apache: komplektā iekļautie jails
Jail savieno filtru ar žurnāla failu un bloķēšanas darbību. Komplektā iekļautais jail.conf jau satur jails tīmekļa serveriem. Tie pēc noklusējuma ir izslēgti un tiek aktivizēti atsevišķi.
| Jail | Tīmekļa serveris | Atpazīst |
|---|---|---|
nginx-http-auth |
Nginx | neizdevušās HTTP Basic pieteikšanās |
nginx-limit-req |
Nginx | pieprasījumi, kas pārsniedz Nginx rate limit |
nginx-botsearch |
Nginx | tipisku, neesošu ceļu meklēšana |
nginx-bad-request |
Nginx | kļūdaini pieprasījumi |
apache-auth |
Apache | neizdevušās pieteikšanās |
apache-badbots |
Apache | zināmi kaitīgi bot identifikatori |
apache-noscript |
Apache | neesošu skriptu izsaukumi |
apache-overflows |
Apache | pārlieku gari pieprasījumi |
apache-botsearch |
Apache | tipisku, neesošu ceļu meklēšana |
php-url-fopen |
abi | noteikti URL iekļaušanas mēģinājumu paraugi |
recidive |
abi | adreses, ko Fail2ban atkārtoti bloķējis |
Komplektā iekļautās konfigurācijas noklusējuma vērtības ir drīzāk maigas: bloķējums uz 10 minūtēm pēc 5 trāpījumiem 10 minūtēs. Tīmekļa serveriem ar lielu skenēšanas datplūsmu ir vērts izmantot garāku bloķējumu un augošu faktoru atkārtojumiem.
Pamata konfigurācija failā jail.local
jail.conf pats saka, ka to nedrīkst mainīt, jo atjauninājumi to aizstāj. Savām vērtībām jābūt /etc/fail2ban/jail.local. Turpmākais piemērs Nginx iestata saprātīgus noklusējumus un aktivizē piemērotus jails:
# /etc/fail2ban/jail.local
[DEFAULT]
# Ierakstīt savas fiksētās adreses (aizstāt piemēra adresi)
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
[recidive]
enabled = true
bantime = 1w
findtime = 1d
Apache vietā aktivizējiet, piemēram, apache-auth, apache-noscript un apache-botsearch. Žurnālu ceļus Fail2ban piegādā pa distributīviem; ja jūsu ceļi atšķiras, iestatiet logpath attiecīgajā jail. Ja jūsu sistēma žurnālus lasa tikai caur journal, palīdz backend = systemd.
Savs filtrs masveida pieprasījumiem uz PHP failiem
Tipisks paraugs pašreizējā situācijā ir daudz pieprasījumu īsā laikā uz PHP failiem, kuru nav. Savs filtrs to atpazīst pēc statusa koda 404. Tas apraksta tikai to, kas ir jūsu pašu žurnālā:
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Papildinājums failā /etc/fail2ban/jail.local
[nginx-php-404]
enabled = true
port = http,https
filter = nginx-php-404
logpath = /var/log/nginx/access.log
maxretry = 20
findtime = 1m
bantime = 1h
Pirms filtru aktivizējat, pārbaudiet to pret īsto žurnālu. Tā redzat, cik rindu tas trāpa un vai starp tām ir leģitīmas piekļuves:
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-php-404.conf
sudo systemctl restart fail2ban
sudo fail2ban-client status
sudo fail2ban-client status nginx-php-404
# Atbrīvot nejauši bloķētu adresi
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
Slieksni izvēlieties devīgi. Tīmekļa pārmeklētājs, kas apstrādā novecojušas saites, vai uzraudzības pakalpojums nedrīkst nonākt bloķējumā.
Biežākās lamatas
Fail2ban ir ātri instalēts, bet viegli nepareizi lietots. Šie punkti jāpārbauda pirms produktīvas lietošanas:
- Pašbloķēšana: biroja, VPN un uzraudzības adresēm jābūt
ignoreip, pirms jails kļūst aktīvi. - Priekšā novietoti pakalpojumi: aiz CDN vai load balancer Fail2ban bez pielāgošanas redz tikai to adreses. Vairāk ceļvedī Administratoru pieteikšanās aizsardzība pret Brute Force.
- Žurnālu rotācija: pēc žurnāla faila maiņas Fail2ban jālasa jaunais fails. Pēc pirmās rotācijas pārbaudiet, vai jails turpina skaitīt trāpījumus.
- Sadarbība ar ugunsmūri: Fail2ban ieraksta bloķējumus ugunsmūrī. Kas savu ugunsmūri pārvalda ar pilnu noteikumu kopas pārlādi, tas šos ierakstus var dzēst. Kā pašu ugunsmūri veidot, rakstīts sadaļā Ugunsmūris tīmekļa serveriem: atvērt tikai nepieciešamos portus.
- IPv6: uzbrukumi nāk arī pa IPv6. Pārbaudiet, vai jūsu bloķēšanas darbība aptver abus protokolus.
Bloķēšanas sarakstus izvērtējiet regulāri. Ja bloķējumi uzkrājas no noteiktiem tīkliem vai uz noteiktiem ceļiem, tā ir norāde uz mērķtiecīgu meklēšanu un iemesls skartās lietojumprogrammas aplūkošanai tuvāk.
Secinājums: rīks pret masu, nevis pret visu
Fail2ban ir ātri ieviests un noņem tīmekļa serveriem daļu pastāvīgās apšaudes. Komplektā iekļautie jails sedz tipiskus paraugus, savus filtrus var droši testēt pret īstiem žurnāliem ar fail2ban-regex, un recidive jail nodrošina, ka neatlaidīgi avoti paliek ārā ilgāk.
Nevajadzētu to pārvērtēt. Fail2ban reaģē uz atkārtošanos, nevis uz pirmo trāpījumu, un tas redz tikai to, kas ir žurnālos. Pret tādu ievainojamību kā PHP2Shell palīdz tikai atjauninājums, pret izkliedētiem uzbrukumiem no daudzām adresēm Fail2ban palīdz tikko. Savu vērtību tas atklāj kā viens slānis starp vairākiem: līdzās vieglam ugunsmūrim, nostiprinātai tīmekļa servera konfigurācijai, divfaktoru pieteikšanās un uzraudzībai, kas uzkrītošo ne tikai bloķē, bet arī ziņo.
Kā PHP SOS palīdz konkrēti?
- Izvērtēt žurnālus: mēs aplūkojam, kādi paraugi parādās jūsu piekļuves protokolos, un izvēlamies piemērotus jails.
- Ieviest un testēt: mēs ieviešam Fail2ban ar saviem filtriem, testējam katru filtru pret īstiem žurnāliem un ierakstām jūsu fiksētās adreses kā izņēmumu.
- Noskaidrot sadarbību: CDN, load balancer, ugunsmūri un žurnālu rotāciju mēs saskaņojam tā, lai bloķējumi trāpītu pareizajām adresēm.
- Novērot: drošības uzraudzības ietvaros mēs bloķējumus un uzkrītošo nepārtraukti izvērtējam.
Biežāk uzdotie jautājumi
Vai Fail2ban aizsargā pret PHP2Shell?
Nē. Fail2ban reaģē tikai pēc tam, kad adrese žurnālos ir atkārtoti izcēlusies. Viens sekmīgs uzbrukums ar to netiek novērsts. Taču Fail2ban samazina skeneru radīto slodzi un padara atkārtotus mēģinājumus no viena avota dārgākus.
Kāpēc jail.conf nevajadzētu mainīt tieši?
Fails tiek aizstāts pakotņu atjauninājumos, un tas to pats saka. Savi iestatījumi pieder jail.local vai failos zem jail.d. Tur tie mērķtiecīgi pārraksta noklusējuma vērtības.
Kas ir recidive jail?
Jail, kas izvērtē pašas Fail2ban žurnālu. Kas tiek bloķēts atkal un atkal, saņem ievērojami garāku bloķējumu. Komplektā iekļautajā konfigurācijā tas ir viena nedēļa.
Vai Fail2ban darbojas aiz Cloudflare vai load balancer?
Tikai ar papildu konfigurāciju. Bez tās žurnālos ir priekšā novietotā pakalpojuma adrese, un bloķējums skartu visus apmeklētājus. Tīmekļa serverim tad jāpārņem īstā apmeklētāja adrese, un bloķēšanu labāk veikt priekšā novietotajā pakalpojumā.