Fail2ban filter za OpenVPN Access Server: real_ip i jailovi
Access Server piše vlastiti format loga, pa standardni filteri ne pronalaze ništa. Sidrite na real_ip, podijelite jailove po površini i provjerite da adresa nije proxy.
Kopirali ste OpenVPN jail iz objave u zajednici, restartovali fail2ban i nijedna adresa nikada ne bude blokirana. Razlog je gotovo uvijek format loga: Access Server ne piše linije neuspjele autentifikacije koje standardni filter očekuje. Prije nego što dirnete filter, provjerite postoje li zapisi uopće, jer uzorak ne može pogoditi ono što servis nikada nije zapisao.
Ovo je runbook kojeg slijedim na hostu sa Access Serverom: potvrdi oblik zapisa, napiši jedan usidreni izraz, testiraj ga na stvarnom logu, zatim podijeli jailove po površini koja je napadnuta i provjeri da blokada stiže do firewall-a.
Potvrdite da zapis o grešci postoji
Access Server piše svoje strukturirane linije u /var/log/openvpnas.log, a adresa klijenta se nalazi u polju real_ip pod navodnicima, a ne na početku syslog linije. Tražite neuspješnu prijavu za koju znate da se dogodila prije nego što napišete bilo kakav uzorak:
grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20Ako se ništa ne pojavi, sljedeći sumnjivac je nivo loga. Access Server ima debug prekidač za bazu logova u /usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1), i servis se mora restartovati nakon što ga promijenite. Tretirajte taj prekidač kao dijagnostičku postavku koju treba ponovo spustiti kada dobijete svoj uzorak, a ne kao trajnu konfiguraciju.
Dok ste u datoteci, zabilježite koje površine u nju pišu. Greške klijentskog portala, administrativnog interfejsa i autentifikacije tunela završavaju u istoj datoteci, ali s različitim markerima, a taj detalj kasnije određuje raspored jailova.
Usidrite jedan filter na real_ip
Držite izraz uskim. Filter koji prisvaja svaku liniju s IP adresom blokirat će ljude zbog običnih prekida veze, a na zauzetom serveru jedini simptom je da se korisnici žale da su zaključani jer su zatvorili laptop. Prisvojite zapis o grešci i uhvatite adresu pod navodnicima:
# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =Vodeći razmak nije kozmetika. Access Server uvlači svoje zapise, a sidrenje na njega sprječava uzorak da prisvoji i linije koje u istu datoteku pišu nepovezani servisi. Ako vaši zapisi umjesto toga nose vodeći vremenski pečat, uskladite taj prefiks, ali usidrite se na nešto što je zaista prisutno u svakom zapisu koji namjeravate prisvojiti.
Kada vam treba preciznost po površini, suzite dalje zahtijevajući marker površine (WEB_CLIENT, WEB_ADMIN ili VPN) u istoj liniji. Jedan filter s tri uzorka lakše je revidirati od tri filtera koji se razlikuju u jednoj riječi.
Testirajte izraz prije nego što omogućite jail
Nikada ne omogućavajte filter koji niste pokrenuli na produkcijskom logu. Dokumentirani test propušta filter dvaput, jednom za učitavanje i jednom za primjenu, a izvještaj o propuštenim linijama je dio koji vrijedi čitati:
fail2ban-regex --print-all-missed /var/log/openvpnas.log \
/etc/fail2ban/filter.d/openvpnaccess.local \
/etc/fail2ban/filter.d/openvpnaccess.local > missed.txtUporedite broj poklapanja s greškama koje ste potvrdili u prvom koraku. Nula poklapanja znači da je uzorak pogrešan; poklapanja na linijama koje nisu greške autentifikacije znače da je preširok. Čitajte missed.txt dok ne budete mogli objasniti svaku liniju koju ste odlučili ne prisvojiti.
Radite ovaj test na kopiji ako je log velik, i ponovite ga nakon svakog nadograđivanja Access Servera. Format loga je interfejs prema kojem usklađujete, i on nije stabilan API.
Podijelite jailove po površini, a ne po daemonu
Jedan Access Server predstavlja nekoliko autentifikacijskih površina: klijentski i administrativni web interfejs na 943/tcp, i tunel na 1194/udp ili 443/tcp u većini instalacija. Jedan jail koji pokriva sve njih dopušta pokušajima pogađanja na tunelu da blokiraju adresu koja je i vaša administrativna putanja, i skriva koja je površina zapravo napadnuta. Dajte svakoj površini vlastiti jail s vlastitim portom i pragovima:
# /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 = 1hPočnite s malim brojačima i kratkom blokadom, pa ih podignite nakon što odgledate sedmicu stvarnog prometa. Darežljiv prag na zajedničkoj uredskoj adresi kažnjava svakog korisnika iza jednog NAT-a, a agresivna blokada na površini tunela prekida legitimne klijente čije su pohranjene vjerodajnice istekle preko noći.
Provjerite blokadu, backend i kolateralnu štetu
Nakon restarta, statusni izlaz je najbrža potvrda da jail postoji i da broji:
fail2ban-client status
fail2ban-client status openvpnas-tunnelZatim potvrdite da blokada stiže do firewall-a koji stvarno vodite, jer jail konfigurisan za backend koji nitko ne provodi ne štiti ništa. S iptables akcijom adrese se pojavljuju u lancu nazvanom po jailu (f2b-openvpnas-tunnel); s nftables akcijom padaju u set u vlastitoj fail2ban tablici. Provjerite onaj koji koristi vaš host umjesto da pretpostavljate.
Dvije kolateralne provjere važnije su od same blokade. Prvo, provjerite da je real_ip adresa klijenta, a ne balanser opterećenja ili obrnuti proxy; iza proxyja svaka blokada pada na proxy i ruši cijeli servis sa sobom. Drugo, zapišite proceduru za odblokiranje, jer adresa koja prekorači prag u 02:00 obično pripada dežurnom inženjeru: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24.
Imajte granicu na umu dok podešavate. Fail2ban je ograničavač brzine na jednoj autentifikacijskoj površini, a ne sloj kontrole pristupa. On ne zamjenjuje MFA, ograničenja po računu ili držanje administrativnog interfejsa izvan javnog interneta, a Access Server ima vlastite autoban postavke koje vrijedi provjeriti prije nego što naslažete dva ograničavača brzine na isti port.