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, а агресивното блокирање на површината на тунелот ги исклучува легитимните клиенти чии зачувани акредитиви истекоа преку ноќ.
Проверете го блокирањето, backend-от и колатералната штета
По рестартирањето, излезот од статусот е најбрзата потврда дека jail-от постои и брои:
fail2ban-client status
fail2ban-client status openvpnas-tunnelПотоа потврдете дека блокирањето стигнува до огнениот ѕид што навистина го водите, бидејќи jail конфигуриран за backend што никој не го спроведува не штити ништо. Со дејството 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 има свои поставки за автоматско блокирање што вреди да се проверат пред да наредите два ограничувачи на брзина на истиот порт.