Lyhyesti: Fail2ban lukee lokitiedostoja ja estää palomuurissa osoitteet, jotka herättävät aikaikkunassa liikaa huomiota. Nginxille ja Apachelle se tuo valmiita jaileja kuten nginx-botsearch tai apache-noscript; omat suodattimet testaatte komennolla fail2ban-regex. Asetukset kuuluvat tiedostoon jail.local, omat osoitteenne kohtaan ignoreip, toistajat pysäyttää recidive-jail. Yksittäisiä kohdennettuja hyökkäyksiä vastaan Fail2ban ei auta, massaskannauksia vastaan kyllä.
Kun lokit ovat täynnä skannereita
Joka katsoo näinä päivinä verkkopalvelimiensa käyttölokeja, löytää ne usein täynnä pyyntöjä poluille, joita ei ole lainkaan: vanhoja ylläpitökäyttöliittymiä, testitiedostoja, muiden tuotteiden tunnettuja haavoittuvuuksia. PHP2Shellin kaltaisessa tilanteessa tulee lisäksi kohdennettu haavoittuvien palvelimien etsintä: Cloudflare ja Patchstack raportoivat hyökkäysyrityksistä, Unit 42 laski yli 22,6 miljoonaa altistunutta, mahdollisesti haavoittuvaa instanssia.
Fail2ban on koeteltu työkalu tätä massaa vastaan. Se lukee lokitiedostoja, tunnistaa suodattimilla poikkeavat merkinnät ja estää lähettäjän osoitteen palomuurissa määräajaksi. Se keventää palvelinta, vähentää lokikohinaa ja tekee järjestelmällisestä kokeilusta yhdestä lähteestä vaivalloisempaa.
Se, mitä Fail2ban ei voi, on yhtä tärkeää: yksittäistä pyyntöä, joka hyödyntää aukkoa, ei estetä. PHP2Shelliä vastaan auttaa vain PHP-päivitys. Miten automatisoidut hyökkäykset etenevät, kuvaa Massaskannaukset päivittämättömään PHP:hen.
Fail2ban Nginxille ja Apachelle: mukana toimitetut jailit
Jail yhdistää suodattimen lokitiedostoon ja estotoimintoon. Mukana toimitettu jail.conf sisältää jo jailit verkkopalvelimille. Ne ovat oletuksena pois päältä, ja ne aktivoidaan yksitellen.
| Jail | Verkkopalvelin | Tunnistaa |
|---|---|---|
nginx-http-auth |
Nginx | epäonnistuneet HTTP Basic -kirjautumiset |
nginx-limit-req |
Nginx | pyynnöt, jotka ylittävät Nginxin nopeusrajan |
nginx-botsearch |
Nginx | tyypillisten, olemattomien polkujen etsintä |
nginx-bad-request |
Nginx | virheelliset pyynnöt |
apache-auth |
Apache | epäonnistuneet kirjautumiset |
apache-badbots |
Apache | tunnetut haitalliset bot-tunnisteet |
apache-noscript |
Apache | olemattomien skriptien kutsut |
apache-overflows |
Apache | liian pitkät pyynnöt |
apache-botsearch |
Apache | tyypillisten, olemattomien polkujen etsintä |
php-url-fopen |
molemmat | tietyt URL-liitosyritysten kuviot |
recidive |
molemmat | osoitteet, jotka Fail2ban on estänyt toistuvasti |
Mukana toimitetun asetuksen oletusarvot ovat melko lieviä: esto 10 minuutiksi 5 osuman jälkeen 10 minuutin sisällä. Verkkopalvelimille, joilla on paljon skannausliikennettä, kannattaa pidempi esto ja kasvava kerroin toistoille.
Perusasetus tiedostossa jail.local
jail.conf sanoo itse, ettei sitä pidä muuttaa, koska päivitykset korvaavat sen. Omat arvot kuuluvat tiedostoon /etc/fail2ban/jail.local. Seuraava Nginx-esimerkki asettaa järkeviä oletuksia ja aktivoi sopivat jailit:
# /etc/fail2ban/jail.local
[DEFAULT]
# Kirjaa omat kiinteät osoitteet (korvaa esimerkkiosoite)
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
Apachelle aktivoitte sen sijaan esimerkiksi apache-auth, apache-noscript ja apache-botsearch. Lokipolut Fail2ban tuo mukanaan jakelun mukaan; jos polkunne poikkeavat, asettakaa logpath kyseisessä jailissa. Jos järjestelmänne lukee lokit vain päiväkirjan kautta, apua antaa backend = systemd.
Oma suodatin PHP-tiedostojen massapyynnöille
Tyypillinen kuvio nykytilanteessa on paljon pyyntöjä lyhyessä ajassa PHP-tiedostoihin, joita ei ole. Oma suodatin tunnistaa sen tilakoodista 404. Se kuvaa vain sen, mikä on omassa lokissanne:
# /etc/fail2ban/filter.d/nginx-php-404.conf
[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) [^"]*\.php[^"]*" 404
ignoreregex =
# Lisäys tiedostoon /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
Ennen kuin aktivoitte suodattimen, tarkistakaa se todellista lokia vasten. Näin näette, kuinka monta riviä se osuu ja onko mukana oikeutettuja käyntejä:
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
# Vapauta vahingossa estetty osoite
sudo fail2ban-client set nginx-php-404 unbanip 203.0.113.25
Valitkaa kynnys anteliaasti. Indeksoija, joka käy läpi vanhentuneita linkkejä, tai valvontapalvelu ei saa päätyä estoon.
Yleisimmät sudenkuopat
Fail2ban on nopeasti asennettu mutta helposti väärin käytetty. Nämä kohdat kannattaa tarkistaa ennen tuotantokäyttöä:
- Itsensä ulossulkeminen: Toimisto-, VPN- ja valvontaosoitteet kuuluvat kohtaan
ignoreip, ennen kuin jailit aktivoidaan. - Edessä olevat palvelut: CDN:n tai kuormantasaajan takana Fail2ban näkee ilman mukautusta vain niiden osoitteet. Lisää oppaassa Ylläpitäjäkirjautumisten suojaus raa'an voiman hyökkäyksiltä.
- Lokien kierrätys: Lokitiedoston vaihtumisen jälkeen Fail2banin on luettava uusi tiedosto. Tarkistakaa ensimmäisen kierrätyksen jälkeen, laskevatko jailit yhä osumia.
- Yhteispeli palomuurin kanssa: Fail2ban kirjaa estot palomuuriin. Joka hallinnoi palomuuriaan lataamalla säännöstön kokonaan uudelleen, voi samalla poistaa nämä merkinnät. Miten rakennatte palomuurin itse, kerrotaan kohdassa Palomuuri verkkopalvelimelle: avatkaa vain tarvittavat portit.
- IPv6: Hyökkäyksiä tulee myös IPv6:n kautta. Tarkistakaa, kattaako estotoimintonne molemmat protokollat.
Arvioikaa estolistat säännöllisesti. Jos estoja kertyy tietyistä verkoista tai tietyille poluille, se viittaa kohdennettuun etsintään ja on syy tarkastella vaikutuksen alaista sovellusta tarkemmin.
Yhteenveto: työkalu massaa vastaan, ei kaikkea vastaan
Fail2ban on nopeasti pystytetty ja ottaa osan jatkuvasta ammunnasta pois verkkopalvelimilta. Mukana toimitetut jailit kattavat tyypilliset kuviot, omat suodattimet voi testata vaarattomasti fail2ban-regex-komennolla todellisia lokeja vasten, ja recidive-jail huolehtii siitä, että sinnikkäät lähteet pysyvät kauemmin ulkona.
Älkää yliarvioiko sitä. Fail2ban reagoi toistoon, ei ensimmäiseen osumaan, ja se näkee vain sen, mikä on lokeissa. PHP2Shellin kaltaista aukkoa vastaan auttaa vain päivitys, hajautettuja hyökkäyksiä vastaan monesta osoitteesta Fail2ban auttaa tuskin lainkaan. Arvonsa se saa yhtenä kerroksena muiden joukossa: kevyen palomuurin, koventamien verkkopalvelinasetusten, kaksivaiheisen tunnistautumisen ja valvonnan rinnalla, joka ei vain estä poikkeamia vaan myös ilmoittaa niistä.
Miten PHP SOS auttaa konkreettisesti?
- Lokien arviointi: Tarkastelemme, mitä kuvioita käyttölokeissanne esiintyy, ja valitsemme sopivat jailit.
- Käyttöönotto ja testaus: Otamme Fail2banin käyttöön omin suodattimin, testaamme jokaisen suodattimen todellisia lokeja vasten ja kirjaamme kiinteät osoitteenne poikkeuksiksi.
- Yhteispelin selvitys: Sovitamme CDN:n, kuormantasaajan, palomuurin ja lokien kierrätyksen yhteen niin, että estot osuvat oikeisiin osoitteisiin.
- Seuranta: Tietoturvavalvonnan yhteydessä arvioimme estoja ja poikkeamia jatkuvasti.
Usein kysytyt kysymykset
Suojaako Fail2ban PHP2Shelliltä?
Ei. Fail2ban reagoi vasta, kun osoite on herättänyt lokeissa huomiota useita kertoja. Yksittäistä onnistunutta hyökkäystä se ei estä. Fail2ban kuitenkin vähentää skannerien aiheuttamaa kuormaa ja tekee toistuvista yrityksistä samasta lähteestä kalliimpia.
Miksi jail.conf-tiedostoa ei pidä muuttaa suoraan?
Tiedosto korvataan pakettipäivityksissä, ja se sanoo sen itse. Omat asetukset kuuluvat tiedostoon jail.local tai tiedostoihin hakemistossa jail.d. Siellä ne ylikirjoittavat oletusarvot kohdennetusti.
Mikä on recidive-jail?
Jail, joka arvioi Fail2banin omaa lokia. Joka estetään yhä uudelleen, saa selvästi pidemmän eston. Mukana toimitetussa asetuksessa se on viikko.
Toimiiko Fail2ban Cloudflaren tai kuormantasaajan takana?
Vain lisäasetuksilla. Ilman niitä lokeissa näkyy edellä olevan palvelun osoite, ja esto osuisi kaikkiin kävijöihin. Verkkopalvelimen on silloin otettava käyttöön kävijän todellinen osoite, ja estot kannattaa asettaa mieluummin edellä olevassa palvelussa.