Филтър Fail2ban за OpenVPN Access Server: real_ip и jail-ове
Access Server пише собствен формат на журнала, затова стандартните филтри не намират нищо. Закотви се на real_ip, раздели jail-овете по повърхност и провери, че адресът не е прокси.
Копирахте OpenVPN jail от публикация в общността, рестартирахте fail2ban и нито един адрес така и не се блокира. Причината почти винаги е форматът на журнала: Access Server не пише редовете за неуспешна автентикация, които стандартният филтър очаква. Преди да пипате филтъра, проверете дали записите въобще съществуват, защото шаблон не може да съвпадне с това, което услугата никога не е записала.
Това е процедурата, която следвам на хост с Access Server: потвърди формата на записа, напиши един закотвен израз, тествай го срещу реалния журнал, после раздели jail-овете по повърхността, която е под атака, и провери, че блокировката стига до защитната стена.
Потвърдете, че записът за грешка съществува
Access Server пише собствени структурирани редове в /var/log/openvpnas.log, а адресът на клиента живее в поле real_ip в кавички, а не в началото на syslog ред. Търсете неуспешен вход, за който знаете, че се е случил, преди да пишете какъвто и да е шаблон:
grep -i 'LOG ERR' /var/log/openvpnas.log | tail -20Ако не се появи нищо, следващият заподозрян е нивото на журнала. Access Server има превключвател за отстраняване на грешки в базата с журнали в /usr/local/openvpn_as/etc/as.conf (DEBUG_LOGDB=1), и услугата трябва да бъде рестартирана след промяната му. Отнасяйте се към този превключвател като диагностична настройка, която се връща обратно, след като имате шаблона си, а не като постоянна конфигурация.
Докато сте във файла, отбележете кои повърхности пишат в него. Грешките в клиентския портал, в административния интерфейс и при автентикацията на тунела попадат в един и същ файл, но с различни маркери, и тази подробност по-късно определя оформлението на jail-овете.
Закотви един филтър на real_ip
Дръжте израза тесен. Филтър, който заграбва всеки ред с IP адрес, ще блокира хора за обикновени прекъсвания на връзката, а на натоварен сървър единственият симптом е оплакването на потребителите, че са заключени, защото са затворили лаптопа. Заграбете записа за грешка и уловете адреса в кавички:
# /etc/fail2ban/filter.d/openvpnaccess.local
[Definition]
failregex = ^ .*LOG ERR.*"real_ip": "<HOST>".*
ignoreregex =Водещият интервал не е козметика. Access Server прави отстъп на записите си и закотвянето на него пречи на шаблона да заграбва и редове, които несвързани услуги пишат в същия файл. Ако записите ви вместо това започват с времева марка, съпоставете този префикс, но се закотви на нещо, което наистина присъства във всеки запис, който смятате да заграбите.
Когато ви трябва точност по повърхност, стеснете още, като изискате маркера на повърхността (WEB_CLIENT, WEB_ADMIN или VPN) на същия ред. Един филтър с три шаблона се одитира по-лесно от три филтъра, които се различават с една дума.
Тествайте израза, преди да включите jail
Никога не включвайте филтър, който не сте пускали срещу производствения журнал. Документираният тест подава филтъра два пъти, веднъж за зареждане и веднъж за прилагане, а отчетът за пропуснати редове е частта, която си струва да се прочете:
fail2ban-regex --print-all-missed /var/log/openvpnas.log \
/etc/fail2ban/filter.d/openvpnaccess.local \
/etc/fail2ban/filter.d/openvpnaccess.local > missed.txtСравнете броя съвпадения с грешките, които потвърдихте в първата стъпка. Нула съвпадения означават, че шаблонът е грешен; съвпадения на редове, които не са грешки при автентикация, означават, че е твърде широк. Четете missed.txt, докато не можете да обясните всеки ред, който сте избрали да не заграбите.
Правете този тест върху копие, ако журналът е голям, и го повтаряйте след всяко обновяване на Access Server. Форматът на журнала е интерфейсът, срещу който съпоставяте, и той не е стабилен API.
Разделете jail-овете по повърхност, не по демон
Един Access Server представя няколко повърхности за автентикация: клиентски и административен уеб интерфейс на 943/tcp и тунел на 1194/udp или 443/tcp при повечето внедрявания. Един jail за всички тях позволява на опитите за отгатване по тунела да блокират адрес, който е и вашият административен път, и скрива коя повърхност всъщност е под атака. Дайте на всяка повърхност свой jail със собствен порт и прагове:
# /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 = 1hЗапочнете с малки броячи и кратък бан, после ги вдигнете, след като наблюдавате седмица реален трафик. Щедър праг на споделен офисен адрес наказва всеки потребител зад един NAT, а агресивен бан на повърхността на тунела прекъсва законни клиенти, чиито запазени идентификационни данни са изтекли през нощта.
Проверете бана, бекенда и страничните щети
След рестарт изходът на статуса е най-бързото потвърждение, че jail съществува и брои:
fail2ban-client status
fail2ban-client status openvpnas-tunnelСлед това потвърдете, че банът стига до защитната стена, която наистина ползвате, защото jail, настроен за бекенд, който никой не налага, не защитава нищо. При действието iptables адресите се появяват във верига, кръстена на jail (f2b-openvpnas-tunnel); при действието nftables те попадат в набор в собствената таблица на fail2ban. Проверете това, което ползва вашият хост, вместо да предполагате.
Две странични проверки са по-важни от самия бан. Първо, проверете, че real_ip е адресът на клиента, а не балансиращ сървър или обратно прокси; зад прокси всяка блокировка пада върху проксито и събаря цялата услуга с него. Второ, запишете процедурата за отблокиране, защото адресът, който прескача прага в 02:00, обикновено принадлежи на дежурния инженер: fail2ban-client set openvpnas-tunnel unbanip 203.0.113.24.
Имайте границата предвид, докато настройвате. Fail2ban е ограничител на честотата на една повърхност за автентикация, а не слой за контрол на достъпа. Той не заменя MFA, ограниченията за отделен акаунт или държането на административния интерфейс извън публичния интернет, а Access Server има свои настройки за автоматичен бан, които си струва да проверите, преди да струпате два ограничителя на честотата на един и същ порт.