Filter Fail2ban za OpenVPN Access Server: real_ip in jail
Access Server piše svoj lasten format dnevnika, zato standardni filtri ne najdejo ničesar. Zasidrajte se na real_ip, razdelite jail po površinah in preverite, da naslov ni proxy.
Kopirali ste OpenVPN jail iz objave v skupnosti, znova zagnali fail2ban in noben naslov ni nikoli blokiran. Vzrok je skoraj vedno format dnevnika: Access Server ne piše vrstic o neuspešni avtentikaciji, ki jih pričakuje standardni filter. Preden se dotaknete filtra, preverite, ali zapisi sploh obstajajo, ker vzorec se ne more ujemati s tem, česar storitev ni nikoli zabeležila.
To je runbook, ki se ga držim na gostitelju z Access Serverjem: potrdite obliko zapisa, napišite en zasidran izraz, preizkusite ga na pravem dnevniku, nato razdelite jail po napadeni površini in preverite, da blokada doseže požarni zid.
Preverite, da zapis o napaki obstaja
Access Server piše svoje strukturirane vrstice v /var/log/openvpnas.log, naslov odjemalca pa je v polju real_ip v narekovajih, ne na začetku vrstice syslog. Preden napišete kateri koli vzorec, poiščite neuspešno prijavo, za katero veste, da se je zgodila:
grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20Če se ne pokaže nič, je naslednji sumljivec raven dnevnika. Access Server ima preklopnik za razhroščevanje dnevniške zbirke podatkov v /usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1), in storitev je treba po spremembi znova zagnati. Ta preklopnik obravnavajte kot diagnostično nastavitev, ki jo je treba spet znižati, ko imate svoj vzorec, ne kot trajno konfiguracijo.
Medtem ko ste v datoteki, opazite, katere površine vanjo pišejo. Napake odjemalskega portala, skrbniškega vmesnika in avtentikacije tunela pristanejo v isti datoteki z različnimi oznakami, in ta podrobnost pozneje določi postavitev jailov.
Zasidrajte en filter na real_ip
Naj bo izraz ozek. Filter, ki si prisvoji vsako vrstico z naslovom IP, bo blokiral ljudi zaradi običajnih prekinitev povezave, na zasedenem strežniku pa je edini simptom pritožba uporabnikov, da so bili zaklenjeni, ker so zaprli prenosnik. Prisvojite si zapis o napaki in ujemite naslov v narekovajih:
# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =Vodilni presledek ni kozmetika. Access Server svoje zapise zamakne, in sidranje nanj preprečuje, da bi si vzorec prisvojil tudi vrstice, ki jih v isto datoteko pišejo nepovezane storitve. Če imajo vaši zapisi namesto tega na začetku časovni žig, se ujemite s to predpono, a se zasidrajte na nekaj, kar je resnično prisotno v vsakem zapisu, ki si ga nameravate prisvojiti.
Ko potrebujete natančnost po površinah, zožite še bolj z zahtevo po oznaki površine (WEB_CLIENT, WEB_ADMIN ali VPN) v isti vrstici. En filter s tremi vzorci je lažje revidirati kot tri filtre, ki se razlikujejo v eni besedi.
Preizkusite izraz, preden omogočite jail
Nikoli ne omogočite filtra, ki ga niste pognali na produkcijskem dnevniku. Dokumentirani test pošlje filter skozi dvakrat, enkrat za nalaganje in enkrat za uporabo, poročilo o zgrešenih vrsticah pa je tisti del, ki ga je vredno brati:
fail2ban-regex --print-all-missed /var/log/openvpnas.log \
/etc/fail2ban/filter.d/openvpnaccess.local \
/etc/fail2ban/filter.d/openvpnaccess.local > missed.txtPrimerjajte število ujemanj z napakami, ki ste jih potrdili v prvem koraku. Nič ujemanj pomeni, da je vzorec napačen; ujemanja v vrsticah, ki niso napake avtentikacije, pomenijo, da je preširok. Berite missed.txt, dokler ne morete pojasniti vsake vrstice, ki ste se ji odločili ne prisvojiti.
Ta test izvedite na kopiji, če je dnevnik velik, in ga ponovite po vsaki nadgradnji Access Serverja. Format dnevnika je vmesnik, s katerim se ujemate, in ni stabilen API.
Razdelite jail po površini, ne po demonu
En Access Server ponuja več površin avtentikacije: odjemalski in skrbniški spletni vmesnik na 943/tcp ter tunel na 1194/udp ali 443/tcp v večini postavitev. En jail, ki pokriva vse, omogoča poskusom ugibanja na tunelu, da blokirajo naslov, ki je tudi vaša skrbniška pot, in skriva, katera površina je v resnici napadena. Vsaki površini dajte svoj jail z lastnimi vrati in pragovi:
# /etc/fail2ban/jail.d/openvpnaccess.local
[openvpnas-web-client]
enabled = true
port = 943
protocol = tcp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 3
findtime = 10m
bantime = 1h
[openvpnas-tunnel]
enabled = true
port = 443
protocol = udp
filter = openvpnaccess
logpath = /var/log/openvpnas.log
maxretry = 5
findtime = 10m
bantime = 1hZačnite z majhnimi števci in kratko blokado, nato jih dvignite, ko si ogledate teden pravega prometa. Radodaren prag na skupnem pisarniškem naslovu kaznuje vsakega uporabnika za enim NAT, agresivna blokada na površini tunela pa prekine zakonite odjemalce, katerih shranjene poverilnice so čez noč potekle.
Preverite blokado, backend in stranske škode
Po ponovnem zagonu je izpis stanja najhitrejša potrditev, da jail obstaja in šteje:
fail2ban-client status
fail2ban-client status openvpnas-tunnelNato preverite, da blokada doseže požarni zid, ki ga v resnici upravljate, ker jail, nastavljen za backend, ki ga nihče ne uveljavlja, ne ščiti ničesar. Pri dejanju iptables se naslovi pojavijo v verigi, poimenovani po jailu (f2b-openvpnas-tunnel); pri dejanju nftables pristanejo v množici v lastni tabeli fail2ban. Preverite tisto, ki jo uporablja vaš gostitelj, namesto da bi domnevali.
Dve stranski preveritvi štejeta več kot sama blokada. Najprej preverite, da je real_ip naslov odjemalca in ne razporejevalnik obremenitve ali obratni proxy; za proxyjem vsaka blokada pade na proxy in s seboj potegne celotno storitev. Drugič, zapišite postopek odblokiranja, ker naslov, ki ob 02:00 preseže prag, običajno pripada dežurnemu inženirju: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24.
Med uravnavanjem imejte v mislih mejo. Fail2ban je omejevalnik hitrosti na eni površini avtentikacije, ne plast nadzora dostopa. Ne nadomešča MFA, omejitev na račun ali tega, da skrbniški vmesnik ostane zunaj javnega interneta, in Access Server ima svoje nastavitve autoban, ki jih velja preveriti, preden na ista vrata zložite dva omejevalnika hitrosti.