Kako osigurati NGINX s prilagođenim filterima Fail2ban

Podijelite ovaj vodič

Fail2Ban je izvrsna sigurnosna mjera za implementaciju za vaš poslužitelj web aplikacija. Dolazi s nizom značajki, zadanih filtara i radnji koje mogu odmah utjecati na zabranu loših web botova, iscrpljivanje resursa vašeg sustava i zaustavljanje napada, što je najvažniji dio svake web stranice.

Međutim, većina ljudi administratori sustava i vlasnici web stranica ponekad traže nešto više od onoga što fail2ban može ponuditi. U sljedećem vodiču naučit ćete kako stvoriti i koristiti prilagođene filtre na vašem Nginx poslužitelju, koji se mogu fino prilagoditi vašim potrebama i kasnije proširiti.

Svakako testirajte i oprezno koristite sve nove filtere fail2ban. Imajte na umu da će postavke morati biti prilagođene vašim potrebama.

Oglas

Dodajte nove Fail2Ban zatvore

Vodič pretpostavlja da imate instaliran Fail2ban i da ste upoznati s konfiguriranjem zatvora i postavki. U nastavku su neki dodatni zatvori koje ćete morati podesiti po svom ukusu ako koristite daljnje radnje zabrane kao što je Cloudflare ili prijavljivanje na AbuseIPDB.org itd.

Dodajte sljedeće zatvore koje želite koristiti u svoju /fail2ban/jail.local datoteku.

sudo nano /etc/fail2ban/jail.local
[nginx-403]
 enabled = true
 port     = http,https
 filter = nginx-403
 action = iptables-allports
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 4

[nginx-404]
 enabled = true
 port     = http,https
 filter = nginx-404
 action = iptables-allports
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 30 # <--- monitor and adjust, all servers are different.

[nginx-noagent]
 enabled = true
 port     = http,https
 filter = nginx-noagent
 action = iptables-allports
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 3

[nginx-noauth]
 enabled = true
 filter = nginx-noauth
 action = iptables-allports
 logpath = %(nginx_error_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 5

[nginx-no-x-spam]
 enabled = true
 filter = nginx-no-x-spam
 action = iptables-allports
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 5

[nginx-noscript]
 enabled = true
 action = iptables-allports
 filter = nginx-noscript
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 3

[nginx-noproxy]
 enabled = true
 action = iptables-allports
 filter = nginx-noproxy
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 0

[nginx-nowordpress]
 enabled = true
 action = iptables-allports
 filter = nginx-nowordpress
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 3

[portscan-block]
 enabled = true
 action = iptables-allports
 filter = portscan-block
 logpath = /var/log/ufw.log  <--- this has to be direct to your UFW logs.
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 5

Napravite nove Fail2Ban filtere

Zatim morate napraviti novu datoteku filtera za svaki od ovih filtara i staviti .konf na kraju datoteke.

Imajte na umu da je stvorena datoteka nešto što morate učiniti sami.

create file /location/fail2ban/filter.d/nginx-403.conf

 [Definition]

failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 403

 ignoreregex =

create file /location/fail2ban/filter.d/nginx-404.conf

 [Definition]

failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 404

 ignoreregex =

create file /location/fail2ban/filter.d/nginx-noagent.conf

 [Definition]

 failregex = ^<HOST> -.*"-" "-"$
                   ^<HOST> -.*"-" "curl.*"$

 ignoreregex =

create file /location/fail2ban/filter.d/nginx-noauth.conf

 [Definition]

 failregex = no user/password was provided for basic authentication.client:              user . was not found in.client:              user . password mismatch.*client: 

 ignoreregex =

create file /location/fail2ban/filter.d/nginx-no-x-spam.conf

 [Definition]

 failregex = {"log":"<HOST> .* ".*\\x.*" .*$

 ignoreregex =

create file /location/fail2ban/filter.d/nginx-noscript.conf

 [Definition]

 failregex =     ^<HOST> -.*GET.*(\.asp|\.exe|\.pl|\.cgi|\.scgi)

 ignoreregex =

create file /location/fail2ban/filter.d/nginx-noproxy.conf

 [Definition]

 failregex = ^<HOST> -.*GET http.*
                   ^<HOST> -.*CONNECT.*

 ignoreregex =

create file /location/fail2ban/filter.d/nginx-nowordpress.conf

 [Definition]
            
 failregex = ^<HOST> -.*"(GET|POST|HEAD) /+(?i)(wp(-|/)|xmlrpc.php|\?author=1)
                   ^<HOST> -.* "(GET|POST|HEAD|PROPFIND) /+(?i)    (a2billing|admin|apache|axis|blog|cfide|cgi|cms|config|etc|.git|hnap|inc|jenkins|jmx-|joomla|lib|linuxsucks|msd|muieblackcat|mysql|myadmin|n0w|owa-autodiscover|pbxip|pma|recordings|sap|sdk|script|service|shell|sqlite|vmskdl44rededd|vtigercrm|w00tw00t|webdav|websql|wordpress|xampp|xxbb)
             ^<HOST> -.* "(GET|POST|HEAD) /[^"]+.(asp|cgi|exe|jsp|mvc|pl)( |\?)
             ^<HOST> -.*(?i)(/bash|burger-imperia|changelog|hundejo|hvd-store|jorgee|masscan|pizza-imperia|pizza-tycoon|servlet|testproxy|uploadify)

 ignoreregex =

 journalmatch = _SYSTEMD_UNIT=nginx.service + _COMM=nginx

create file /location/fail2ban/filter.d/portscan-block.conf

[Definition]

failregex = .*\[UFW BLOCK\] IN=.* SRC=<HOST>

ignoreregex = SRC=(10.|172.1[6-9].|172.2[0-9].|172.3[0-1].|192.168.|fe\w:). DST=(static.ip.address.here|224.0.0.). PROTO=(2|UDP)(\s+|.* DPT=(1900|3702|5353|5355) LEN=\d*\s+)$

Filtar WebExploits

Najbolje ocijenjeni fail2ban filtar blokira URL skenere zlonamjernih robota. Međutim, ovaj se filtar ne preporučuje korisnicima koji su novi na Linux poslužiteljima, a fail2ban pogotovo nema vremena za praćenje i prilagodbu. Najveći problem s ovim filtrom je to što to mogu biti pravi korisnici, ali uglavnom će zabraniti SEO dobre botove koji mogu slučajno skenirati istu zamku.

Možete preuzeti nekoliko i ažuriranih popisa koje je izradila zajednica, ali najbolji način je da nadzirete svoje zapise i polako dodajete svoje kada primijetite skeniranja. S vremenom ćete sakupiti opsežan popis koji ste sami izradili i radit ćete s nula pozitivnih.

Prvo dodajte zatvor za skriptu za iskorištavanje weba.

Primjer:

[webexploits]
enabled   = false
logpath = %(nginx_access_log)s
filter = webexploits
port    = http,https
bantime = 1440m
findtime = 1440m
maxretry = 0

Zatim napravite filtar, ali ovdje postaje zanimljivo.

Primjer:

create file /location/fail2ban/filter.d/webexploits.conf

[Definition]

failregex = 
            ^<HOST> -.*(GET|POST|HEAD).*(/data/admin/)
            ^<HOST> -.*(GET|POST|HEAD).*(/dnt-policy.txt)
            ^<HOST> -.*(GET|POST|HEAD).*(/gpc.json)
            ^<HOST> -.*(GET|POST|HEAD).*(/wlwmanifest.xml)
            ^<HOST> -.*(GET|POST|HEAD).*(/adminer)
            ^<HOST> -.*(GET|POST|HEAD).*(/_adminer)
            ^<HOST> -.*(GET|POST|HEAD).*(/user/login)
            ^<HOST> -.*(GET|POST|HEAD).*(/.env)

ignoreregex =

Kao i gore, ovo su samo neki tipični primjeri. Zatim dodajte svoj i izmijenite filtar u sljedećem formatu.

            ^<HOST> -.*(GET|POST|HEAD).*(/URL-TO-ADD-HERE)

Iz primjera, URL-TO-ADD-HERE je proširenje u kojem vidite zlonamjerne korisnike ili botove koji skeniraju, kao što je WordPress XMLRPC.

            ^<HOST> -.*(GET|POST|HEAD).*(/xmlrpc.php)

Također možete modificirati DOBITI|OBJAVITI|GLAVU opcije, ali želite zabraniti svakome da dodiruje te URL-ove, što ne treba mijenjati.

Neki primjeri popisa su ovdje na ovom Githubu.

NEMOJTE SAMO NASLUČAJNO KOPIRATI I ZALJEPITI.

To zahtijeva testiranje i predlažem da dodate svoje iz svojih dnevnika. To se može ozbiljno vratiti ako ne odvojite vrijeme i predanost da to ispravite. Međutim, može smanjiti botove na ogromnim web stranicama koji troše resurse skeniranjem više URL-ova.

Obavezno testirajte svoje filtere kao što je navedeno u nastavku.

Nginx Secure Pages & Honeypot

Još jedna zanimljiva značajka koju možete učiniti s Nginxom je izrada filtera 444, a zatim stvaranje geolokacija kako biste, na primjer, sakrili stranice kao što je prijava koje nijedan dobar bot ili pravi korisnik ne bi trebao dodirivati.

Prvo dodajte zatvor.

Primjer:

[nginx-444]
 enabled = true
 port     = http,https
 filter = nginx-444
 action = iptables-allports
 logpath = %(nginx_access_log)s
 bantime = 1440m # 1 day
 findtime = 1440m # 1 day
 maxretry = 1

Zatim, ovaj put dodajte zatvor, čineći ga trenutnom zabranom. Savjetovao bih da stranicu dodate u svoj robots.txt kao izuzeće kako je dobri SEO botovi poput Googlea ne bi dirali. Možete napraviti lažne stranice i isključiti ih također u robots.txt kao honeypots. Ovaj primjer radi za stvarne stranice ili honeypots.

create file /location/fail2ban/filter.d/nginx-444.conf

 [Definition]

failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 444

 ignoreregex =

Zatim stvorite datoteku i stavite svoju IP adresu na bijelu listu ili na popis IP adresa koje želite izuzeti da mogu doći do stranice.

Primjer lokacije:

sudo nano /etc/nginx/whitelist.txt

Primjer dodavanja IP adrese nalazi se u nastavku. Uzmite na znanje lažan na kraju.

IP Address false;

or another example

195.168.50.1 false;

Dodajte sljedeće: nakon što dodate svoju IP adresu u datoteku nginx.conf.

geo $remote_addr $exclude_trafic {
 default true;
include /etc/nginx/whitelist.txt;
}

Obavijest isključite sav promet je zadana istinski.

Sada, u blok poslužitelja, dodajte sljedeću datoteku.

if ( $allowed_trafic = 'true'){
    return 444;
}

ZA PHP kao što je WordPress zaključavanje wp-login.php primjer.

  location ~ /wp-login.php {
if ( $exclude_trafic = 'true'){
    return 444;
} 
 fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    include fastcgi_params;
    include snippets/fastcgi-php.conf;
    fastcgi_intercept_errors on;
}

Imajte na umu da će ovo možda trebati popravljati ovisno o vašoj verziji PHP-a i distribuciji, što je još važnije. Ipak, primjer prema zadanim postavkama isključuje sav promet s te stranice osim ako niste na popisu dopuštenih s false.

Ovo uglavnom nije potrebno ako stojite iza Cloudflarea ili sličnih usluga, ali ovo može biti korisno više za honeypots na lažnim stranicama, svakako dodajte svoje HTML veze na njega tako da će se prikazivati ​​samo botovima za struganje i isključiti ga u svojim robots.txt tako da ga pravi botovi koji se pridržavaju vaših pravila neće dirati (zlonamjerni botovi ne slušaju robots.txt).

Oglas

Testirajte nove Fail2ban zatvore/filtre

Da biste to dovršili, obavezno ponovno pokrenite fail2ban u svom operativnom sustavu putem njegove naredbe.

Za većinu Linux distribucija, sljedeća naredba trebala bi raditi ako se izvodi systemd.

sudo systemctl restart fail2ban

Druge ne-systemd distribucije ili drugi sustavi ponovno pokreću vaš sustav ili fail2ban uslugu.

Nakon što se fail2ban ponovno pokrene, pokrenite sljedeću naredbu statusa fail2ban-client da biste vidjeli zatvor.

sudo fail2ban-client status nginx-noscripts

Primjer rezultata:

Status for the jail: nginx-noscripts
 |- Filter
 | |- Currently failed: 0
 | |- Total failed: 0
 | - File list: /var/log/nginx/access.log - Actions
 |- Currently banned: 95
 |- Total banned: 107
 `- Banned IP list:

Kao što je prikazano iznad, imate 95 IP adresa zabranjenih, s ukupno 107 uključujući aktivne i neaktivne povijesne zabrane.

Dalje, za testiranje filtera fail2ban, upotrijebite sljedeću naredbu primjera.

Primjer:

fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

Gore navedeno će analizirati vašu log datoteku i ispisati zabrane koje će biti aktivne ako omogućite filtar. To bi trebalo učiniti na filterima koji mogu uzrokovati lažne pozitivne rezultate, kao što su web iskorištavanja.

Oglas

Komentari i zaključak

U tutorialu ste naučili kako konfigurirati neke dodatne zatvore za vašu fail2ban konfiguraciju za vaš Nginx poslužitelj. Općenito, možete postići izvrsnu sigurnost na strani poslužitelja, filtere je moguće prilagoditi i podesiti, a ono što je prikazano je samo kratak o tome što se još može učiniti kako bi odgovaralo specifičnim situacijama i potrebama.

Jedini nedostatak kod fail2ban-a je pokretanje klastera poslužitelja, za sada, to nije izvodljivo osim ako ne koristite Cloudflare i blokirate ih na obrnutom proxyju, na primjer, ali za operatere s jednim poslužiteljem, možete praktički zaključati svoj poslužitelj kao fort Knox.

Pretplati me
Obavijesti o
17 Komentari
Umetne povratne informacije
Pogledajte sve komentare
Nalog Gosta,
Srijeda, 11. kolovoza 2021. u 11:25

Bok tege! Bi li vam smetalo ako podijelim vaš blog sa svojim myspaceom
skupina? Mnogo je ljudi za koje mislim da bi vas jako cijenili
sadržaj. Molim te obavijesti me. Hvala

Michael
Nalog Gosta,
Nedjelja, 28. studenog 2021. u 7 sati

Pozdrav,
habe bereits Fail2Ban laufen mit 13 zatvora.
Habe jetzt Deinen nginx-nowordpress Jail in meine Jail.local hinzugefügt und auch die nginx-nowordpress erstellt.
Nach service fail2ban restart habe ich aber auf einmal nur noch 12 Jails, eigentlich müssten es aber 14 sein.

2 Jails die nicht in der Jail.local sind, sondern in xy.local und xyz.local sind također weg…

Michael
Nalog Gosta,
Odgovarati na  Joshua James
Ponedjeljak, 29. studenog 2021. u 4:10 sati

Bok,

Ponovno sam provjerio zatvor bez WordPressa. Uklonjeno "journalmatch = _SYSTEMD_UNIT=nginx.service + _COMM=nginx" iz filtra. => Nakon toga jedan od mojih već postojećih zatvora više ne radi. Onemogućen vaš no-wordpress zatvor => svi moji zatvori ponovno rade.

Isprobao svoj portscan-block zatvor uklj. filter. => Fail2ban se više ne pokreće. Morate ponovo onemogućiti svoj zatvor.

Michael
Nalog Gosta,
Odgovarati na  Joshua James
Ponedjeljak, 29. studenog 2021. u 4:31 sati

Pokušao sam ponovo zatvor bez WordPressa, uklonio "journalmatch = _SYSTEMD_UNIT=nginx.service + _COMM=nginx" iz filtera. => jedan od mojih već postojećih zatvora više ne radi. Onemogućio sam tvoj zatvor bez WordPressa, svi moji zatvori opet rade.

Pokušao i portscan-block jail => fail2ban se više ne pokreće. Morate ponovo onemogućiti svoj zatvor i opet je sve u redu

Michael
Nalog Gosta,
Odgovarati na  Joshua James
Ponedjeljak, 29. studenog 2021. u 5:34 sati

Hvala Joshua, pripremit ću ovo sljedećih dana

Michael
Nalog Gosta,
Odgovarati na  Joshua James
Utorak, 30. studenog 2021. u 5:39 sati

Poslao sam vam mail s datotekama :) Puno hvala!

Michael
Nalog Gosta,
Nedjelja, 28. studenog 2021. u 8 sati

Vau, to je bio brz odgovor, hvala.
Ja sam na Ubuntu 20.4 LTS s Fail2Ban V 1.57 (najnovije koje dobijete s apt ažuriranjem).
Ne, imam 11 od 13 zatvora u zatvoru.local. Samo su 2 zatvora u odvojenim zatvorima iz bilo kojeg razloga...

Hvala na provjeri

Michael

Michael
Nalog Gosta,
Nedjelja, 28. studenog 2021. u 8 sati

Oprosti fail2ban-client -V pokaži mi 0.11.1

Michael
Nalog Gosta,
Nedjelja, 28. studenog 2021. u 9 sati

Da s Nginxom, pokušat ću promijeniti sintaksu za filtar kao što je predloženo u vašem prvom citatu...

Ali za sada moram u krevet :)

Hvala na brzoj pomoći do sada :)

Techieferret
Nalog Gosta,
Srijeda, 19. siječnja 2022. u 2:14 sati

Imate grešku. U [nginx-no-x-spam] koristite filter = nginx-nologin umjesto nginx-no-x-spam.

adplus-oglašavanje
17
0
Volio bih vaše misli, molim vas komentirajte.x