# Chrániť prihlásenia administrátorov pred brute force: ochrana pred brute force pre každé prihlásenie

> Ochrana pred brute force pre prihlásenie a administráciu: rate limiting, Fail2ban, dvojfaktorové prihlásenie a bezpečné ukladanie hesiel cez password_hash.

Zdroj: https://phpsos.de/sk/ratgeber/brute-force-login-schutz/  
Stav: 25.10.2026  
Poskytovateľ: PHP SOS, Núdzová pomoc pri PHP a bezpečnosť serverov. Okamžitá pomoc cez WhatsApp: https://wa.me/491736494914?text=Dobr%C3%BD%20de%C5%88%2C%20PHP%20SOS%2C%20potrebujeme%20pomoc%20s%20na%C5%A1%C3%ADm%20serverom%20s%20PHP.%20Spolo%C4%8Dnos%C5%A5%3A%20%E2%80%A6%20Web%3A%20%E2%80%A6

**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](https://phpsos.de/sk/ratgeber/zwei-faktor-admin/).
- **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.

```nginx
# 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:

```apache
<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:

```ini
# /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
<?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](https://phpsos.de/sk/ratgeber/logfiles-auswerten/).

## 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.php` tiež 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](https://phpsos.de/sk/plattformen/wordpress/).

## 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](https://phpsos.de/sk/leistungen/server-haertung/) a testujeme ich.
- Sprevádzame zavedenie dvojfaktorového prihlásenia pre adminov a dokumentujeme núdzové prístupy.
- Pomocou [bezpečnostného monitoringu](https://phpsos.de/sk/leistungen/security-monitoring/) 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.

## Zdroje

- [OWASP Cheat Sheet Series (Authentication)](https://cheatsheetseries.owasp.org/)
- [BSI: odporúčania k bezpečným heslám a dvojfaktorovému prihláseniu](https://www.bsi.bund.de/)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
