Filter Fail2ban pre OpenVPN Access Server: real_ip a jail
Access Server píše vlastný formát logu, preto štandardné filtre nič nenájdu. Ukotvite sa na real_ip, rozdeľte jail podľa povrchu a overte, že adresa nie je proxy.
Skopírovali ste OpenVPN jail z príspevku komunity, reštartovali fail2ban a žiadna adresa nikdy nie je zablokovaná. Príčinou je takmer vždy formát logu: Access Server nepíše riadky o zlyhaní autentifikácie, ktoré očakáva štandardný filter. Skôr než sa dotknete filtra, overte, či záznamy vôbec existujú, pretože vzor nemôže zodpovedať tomu, čo služba nikdy nezalogovala.
Toto je runbook, ktorý dodržiavam na hoste s Access Serverom: potvrdiť tvar záznamu, napísať jeden ukotvený výraz, otestovať ho proti skutočnému logu, potom rozdeliť jail podľa napadnutého povrchu a overiť, že blokácia dorazí do firewallu.
Overte, že záznam o zlyhaní existuje
Access Server píše svoje štruktúrované riadky do /var/log/openvpnas.log a adresa klienta žije v poli real_ip v úvodzovkách, nie na začiatku riadku syslogu. Skôr než napíšete akýkoľvek vzor, hľadajte neúspešné prihlásenie, o ktorom viete, že sa stalo:
grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20Ak sa nič neobjaví, ďalším podozrivým je úroveň logovania. Access Server má debug prepínač pre logovaciu databázu v /usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1), a službu je potrebné po jeho zmene reštartovať. Berte ten prepínač ako diagnostické nastavenie, ktoré sa má zase stiahnuť, keď máte svoj vzor, nie ako trvalú konfiguráciu.
Kým ste v súbore, všimnite si, ktoré povrchy doň zapisujú. Zlyhania klientskeho portálu, administrátorského rozhrania a autentifikácie tunela končia v tom istom súbore s rôznymi markermi, a tento detail neskôr určuje usporiadanie jailov.
Ukotvite jeden filter na real_ip
Držte výraz úzky. Filter, ktorý si nárokuje každý riadok s IP adresou, bude blokovať ľudí za bežné odpojenia, a na vyťaženom serveri je jediným príznakom to, že si používatelia sťažujú, že ich zablokovali za zatvorenie notebooku. Nárokujte si záznam o chybe a zachyťte adresu v úvodzovkách:
# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =Úvodná medzera nie je kozmetická. Access Server odsadzuje svoje záznamy a ukotvenie na nej bráni vzoru nárokovať si aj riadky, ktoré do toho istého súboru píšu nesúvisiace služby. Ak vaše záznamy namiesto toho nesú úvodnú časovú pečiatku, prispôsobte ten prefix, ale ukotvite sa na niečo, čo je skutočne prítomné v každom zázname, ktorý chcete nárokovať.
Keď potrebujete presnosť po povrchoch, zúžte ďalej tým, že budete vyžadovať marker povrchu (WEB_CLIENT, WEB_ADMIN alebo VPN) na tom istom riadku. Jeden filter s troma vzormi sa audituje ľahšie než tri filtre, ktoré sa líšia jedným slovom.
Otestujte výraz, než zapnete jail
Nikdy nezapínajte filter, ktorý ste nespustili proti produkčnému logu. Dokumentovaný test prejde filter dvakrát, raz na načítanie a raz na aplikáciu, a správa o vynechaných riadkoch je tá časť, ktorá stojí za prečítanie:
fail2ban-regex --print-all-missed /var/log/openvpnas.log \
/etc/fail2ban/filter.d/openvpnaccess.local \
/etc/fail2ban/filter.d/openvpnaccess.local > missed.txtPorovnajte počet zhôd so zlyhaniami, ktoré ste overili v prvom kroku. Nula zhôd znamená, že vzor je zlý; zhody na riadkoch, ktoré nie sú zlyhaniami autentifikácie, znamenajú, že je príliš široký. Čítajte missed.txt, kým nedokážete vysvetliť každý riadok, ktorý ste sa rozhodli nenárokovať.
Robte tento test na kópii, ak je log veľký, a opakujte ho po každom upgradu Access Serveru. Formát logu je rozhranie, proti ktorému porovnávate, a nie je to stabilné API.
Rozdeľte jail podľa povrchu, nie podľa daemonu
Jeden Access Server ponúka niekoľko autentifikačných povrchov: klientske a administrátorské webové rozhranie na 943/tcp a tunel na 1194/udp alebo 443/tcp vo väčšine nasadení. Jediný jail pokrývajúci všetky dovolí pokusom o hádanie na tuneli zablokovať adresu, ktorá je aj vašou administratívnou cestou, a skrýva, ktorý povrch je vlastne napadnutý. Dajte každému povrchu vlastný jail s vlastným portom a prahmi:
# /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 s malými počítadlami a krátkou blokáciou, potom ich zvýšte, keď si týždeň pozriete skutočnú premávku. Veľkorysý prah na zdieľanej kancelárskej adrese trestá každého používateľa za jedným NAT, a agresívna blokácia na povrchu tunela odpojí legitímnych klientov, ktorým cez noc vypršali uložené prihlasovacie údaje.
Overte blokáciu, backend aj vedľajšie škody
Po reštarte je výstup stavu najrýchlejším potvrdením, že jail existuje a počíta:
fail2ban-client status
fail2ban-client status openvpnas-tunnelPotom potvrďte, že blokácia dorazí do firewallu, ktorý skutočne prevádzkujete, pretože jail nastavený pre backend, ktorý nikto nevynucuje, nič nechráni. Pri akcii iptables sa adresy objavia v reťazi pomenovanej po jaili (f2b-openvpnas-tunnel); pri akcii nftables skončia v množine vo vlastnej tabuľke fail2ban. Skontrolujte tú, ktorú používa váš host, namiesto toho, aby ste to predpokladali.
Dve vedľajšie kontroly sú dôležitejšie než samotná blokácia. Po prvé overte, že real_ip je adresa klienta a nie load balancer alebo reverzná proxy; za proxy každá blokácia dopadne na proxy a strhne so sebou celú službu. Po druhé zapíšte postup odblokovania, pretože adresa, ktorá v 02:00 prekročí prah, zvyčajne patrí pohotovostnému inženýrovi: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24.
Majte pri ladení na pamäti hranicu. Fail2ban je obmedzovač rýchlosti na jednom autentifikačnom povrchu, nie vrstva riadenia prístupu. Nenahrádza MFA, obmedzenia pre jednotlivé účty ani držanie administrátorského rozhrania mimo verejného internetu a Access Server má vlastné nastavenia autobanu, ktoré stojí za kontrolu, než na ten istý port naskladáte dva obmedzovače rýchlosti.