Stručne: Účinná ochrana prihlásenia pred brute force sa skladá z viacerých vrstiev: dvojfaktorové prihlásenie pre všetkých adminov, brzda pokusov o prihlásenie vo webovom serveri, automatické blokovania na sieťovej úrovni a bezpečné ukladanie hesiel v kóde. Kde je to možné, je administrátorská oblasť navyše dostupná iba zo známych sietí.
Ako prebiehajú útoky brute force na prihlásenia
Každá verejne dostupná prihlasovacia stránka bude skôr či neskôr napadnutá automatizovane. Týka sa to prihlásení do CMS, backendov e-shopov, hostingových panelov, webmailu a SSH. Útočníci pritom nepotrebujú vedieť, komu web patrí; ich nástroje prehľadávajú internet za známymi adresami prihlásenia.
Rozšírené sú tri varianty. Pri klasickom brute force sa proti jednému účtu skúša veľa hesiel. Pri password sprayingu sa jedno časté heslo testuje proti mnohým účtom, aby sa obišli blokovania. Pri credential stuffingu sa používajú prístupové údaje, ktoré boli ukradnuté pri iných službách.
Pre vedenie a majiteľov sa situácia dá zhrnúť jednoducho: prevzatý administrátorský účet je rovnako nebezpečný ako zraniteľnosť na serveri. Kto je admin, môže inštalovať rozšírenia, meniť kód a exportovať údaje.
Takéto útoky možno rozpoznať podľa nahromadenia neúspešných prihlásení, podľa požiadaviek POST na adresu prihlásenia z mnohých rôznych adries IP a podľa pokusov o prihlásenie s používateľskými menami ako „admin“ alebo menami z tiráže. Na to môže poukazovať aj citeľne vyššia záťaž servera v nezvyčajných časoch, pretože každé prihlásenie stojí výpočtový čas na kontrolu hesla.
Ochrana pred brute force pri prihlásení: najúčinnejšie opatrenia
Nie každé opatrenie sa hodí ku každému systému. Nasledujúce poradie sa osvedčilo, pretože prvé body spájajú najväčší účinok s malou námahou:
- Dvojfaktorové prihlásenie pre všetky účty s právami admina. Ani uhádnuté heslo potom nestačí. Podrobnosti v príručke Dvojfaktorové prihlásenie pre prístupy administrátorov.
- Jedinečné, dlhé heslá zo správcu hesiel, žiadne zdieľané účty.
- Rate limiting vo webovom serveri, aby bolo na adresu možných len niekoľko pokusov za minútu.
- Automatické blokovania opakovane nápadných adries na sieťovej úrovni, napríklad pomocou Fail2ban.
- Zmenšiť administrátorskú oblasť: prístup len z firemnej siete alebo cez VPN, nepotrebné rozhrania vypnúť.
- Jednotné chybové hlásenia, ktoré neprezrádzajú, či používateľské meno existuje.
- Monitoring neúspešných prihlásení a upozornenie pri nápadnostiach.
Rate limiting vo webovom serveri
S Nginx možno počet požiadaviek na adresu prihlásenia obmedziť podľa adresy IP. Ukážka zobrazuje prihlasovaciu stránku WordPressu; cestu a odovzdanie PHP prispôsobte svojmu systému.
# v bloku http
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# v bloku server
location = /wp-login.php {
limit_req zone=login burst=3 nodelay;
limit_req_status 429;
# sem vložiť bežné odovzdanie PHP vášho servera
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
V Apache ponúka jednoduchú, účinnú ochranu obmedzenie administrátorskej oblasti na známe adresy:
<Location "/admin">
Require ip 192.0.2.0/24
</Location>
Adresa 192.0.2.0/24 je zástupná z dokumentačného rozsahu; nastavte svoju firemnú sieť alebo adresu svojho VPN. Ak váš web leží za proxy alebo CDN, musí server poznať skutočnú adresu návštevníka, inak pravidlo nezaberie, ako je želané.
Fail2ban a blokovania na sieťovej úrovni
Fail2ban číta súbory logov a adresy, ktoré opakovane vyčnievajú, zablokuje vo firewalle na stanovený čas. Pre rate limiting Nginx prináša Fail2ban už vhodný filter:
# /etc/fail2ban/jail.local
[nginx-limit-req]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 10m
bantime = 1h
[sshd]
enabled = true
maxretry = 5
bantime = 1h
Po reštarte pomocou fail2ban-client status skontrolujte, či sú jaily aktívne. Dbajte na to, aby ste vlastné pevné adresy vyňali cez ignoreip, aby ste sa sami nevyradili. Pre prihlasovacie stránky jednotlivých CMS sú možné vlastné filtre, musia sa však hodiť ku skutočnému formátu logu a vopred sa otestovať.
Ak stojí pred serverom CDN alebo proxy, Fail2ban bez ďalšieho nastavenia vidí iba jeho adresy. Blokovanie by potom zasiahlo všetkých návštevníkov. V takom prípade musí webový server prevziať skutočnú adresu návštevníka z hlavičky predradenej služby a blokovania sa lepšie nastavujú priamo u CDN.
Blokovania na sieťovej úrovni sú nástrojom proti masám, nie proti cieleným útokom. Distribuované útoky z veľmi mnohých adries s niekoľkými pokusmi na adresu podkopávajú každý prah. Preto zostáva druhý faktor najdôležitejšou vrstvou a Fail2ban znižuje predovšetkým záťaž a šum v logoch.
Správne ukladať heslá vo vlastnom softvéri
Kto programuje vlastné prihlásenia, nemal by heslá nikdy ukladať v čitateľnej podobe ani s rýchlymi hašovacími funkciami ako MD5 alebo SHA-1. PHP prináša s password_hash() bezpečné riešenie, ktoré spravuje soľ a postup automaticky.
<?php
declare(strict_types=1);
// Pri registrácii alebo zmene hesla
$hash = password_hash($passwort, PASSWORD_DEFAULT);
// Pri prihlásení
if (password_verify($eingabe, $hashAusDatenbank)) {
if (password_needs_rehash($hashAusDatenbank, PASSWORD_DEFAULT)) {
$neu = password_hash($eingabe, PASSWORD_DEFAULT);
// $neu uložiť do databázy
}
// Prihlásenie úspešné, obnoviť ID session
} else {
usleep(random_int(200000, 400000)); // rovnomerný čas odpovede
// vypísať jednotné chybové hlásenie
}
password_needs_rehash() zaisťuje, že sa staršie hashe pri nasledujúcom prihlásení automaticky prestavia na aktuálny postup. Neúspešné pokusy zaznamenávajte s časom, účtom a adresou, aby vzory zaujali. Pokyny k vyhodnoteniu sú v príručke Vyhodnotenie logov webového servera po útoku.
Osobitosti pri CMS, e-shopoch a paneloch
Mnohé systémy majú popri viditeľnej prihlasovacej stránke ďalšie cesty, ktorými sa kontrolujú prístupové údaje. Tieto vedľajšie vchody sa pri ochrane často zabúdajú.
- WordPress: Rozhranie
xmlrpc.phptiež prijíma prihlásenia. Ak ho nepotrebujete, napríklad pre staršie aplikácie, zablokujte ho vo webovom serveri. Skontrolujte navyše, či sú používateľské mená viditeľné cez stránky autorov alebo rozhranie REST, a pre adminov používajte mená, ktoré sa verejne neobjavujú. - E-shopy: Popri administrátorskej oblasti sú cieľom zákaznícke účty, najmä pre credential stuffing. Tu pomáhajú rate limiting, upozornenia pri nových prihláseniach a voliteľný druhý faktor pre zákazníkov.
- Hostingové panely a webmail: Tieto rozhrania sú často dostupné z celého sveta a chránia celý server. Mali by byť dostupné iba zo známych sietí alebo cez VPN.
- SSH: Prihlásenie kľúčom namiesto hesla robí klasické hádanie neúčinným.
Aké ochranné funkcie váš systém prináša sám, je v dokumentácii výrobcu. Rozšírenia tretích strán by mali byť aktívne udržiavané, inak sa samy stanú rizikom. Pre prevádzkovateľov WordPressu zhŕňa aktuálne priority stránka WordPress a PHP2Shell.
Ako konkrétne pomáha PHP SOS?
- Zmapujeme všetky dostupné prihlasovacie stránky vašich serverov, od CMS po hostingový panel, a posúdime ich ochranu.
- Rate limiting, Fail2ban a obmedzenia prístupu zavádzame v rámci spevnenia servera a testujeme ich.
- Sprevádzame zavedenie dvojfaktorového prihlásenia pre adminov a dokumentujeme núdzové prístupy.
- Pomocou bezpečnostného monitoringu máme neúspešné prihlásenia a nové administrátorské účty neustále na očiach.
Časté otázky
Podľa čoho spoznám útok brute force?
Typické je veľa neúspešných prihlásení v krátkom čase, často proti tej istej prihlasovacej stránke a s meniacimi sa používateľskými menami. V access logu sa to prejaví ako nahromadenie požiadaviek POST na adresu prihlásenia, často z mnohých rôznych adries IP.
Mal by sa účet po viacerých neúspešných pokusoch zablokovať?
Pozor: tvrdé blokovania môžu útočníci využiť na vyradenie legitímnych používateľov. Lepšie sú rastúce oneskorenia, časovo obmedzené blokovania podľa adresy IP a upozornenie držiteľa účtu.
Pomáha premenovať adresu prihlásenia?
Znižuje automatizovaný šum v logoch, ale nie je to skutočná ochrana. Kto adresu pozná alebo ju nájde, môže útočiť ďalej. Účinné sú dvojfaktorové prihlásenie, rate limiting a obmedzenie administrátorskej oblasti.
Čo je credential stuffing?
Útočníci pritom skúšajú kombinácie e-mailu a hesla, ktoré boli ukradnuté pri iných službách. Funguje to, keď používatelia používajú to isté heslo viackrát. Jedinečné heslá a druhý faktor tejto metóde berú základ.