Stručne: Admin sekciu najúčinnejšie ochránite tak, že ju otvoríte len pre známe siete: povolením IP vo webservery, cez VPN s pevnou výstupnou adresou alebo druhým, predradeným prihlásením. Dôležitý je úplný zoznam všetkých správcovských adries, správne zaobchádzanie s proxy a CDN a test zvonka. Odtienenie dopĺňa dvojfaktorové prihlásenie a aktualizácie, nenahrádza ich.
Prečo je backend vôbec otvorený?
V mnohých firmách administrátori minulý týždeň aktualizovali PHP a reštartovali workery. Kto si potom pozrie prístupové protokoly, často zistí niečo iné: prihlasovacia stránka CMS, databázový nástroj a hostingový panel sa volajú nepretržite z celého sveta. Potrebuje ich však len hŕstka ľudí z vlastného tímu.
Každá z týchto adries je útočná plocha. Prihlasovacie formuláre sa skúšajú metódou pokus-omyl, správcovské nástroje obsahujú vlastné zraniteľnosti a pluginy pre backend bývajú menej prekontrolované než jadro CMS. Ak cudzí tieto sekcie vôbec nedosiahnu, mnohé útoky vyjdú naprázdno skôr, než sa začnú.
Poctivo zaradené: proti samotnému PHP2Shell to pomáha len málo. Zraniteľnosti sú v interpreteri a podľa php.net sa dajú vyvolať bez prihlásenia cez verejné stránky PHP. Odtienenie backendu je trvalé spevnenie, nie núdzová záplata.
Ochrana admin sekcie cez IP, VPN alebo druhé prihlásenie
Neexistuje jediná správna metóda. Rozhoduje, ako váš tím pracuje a kde web beží.
| Metóda | Vhodná pre | Hranica |
|---|---|---|
| Povolenie IP vo webservery | kancelária s pevnou adresou, malé tímy | meniace sa adresy v home office, údržba zoznamu |
| VPN s pevnou výstupnou adresou | rozptýlené tímy, dodávatelia | samotná VPN musí byť dobre zabezpečená a aktuálna |
| Predradené prihlásenie (HTTP autentifikácia) | doplnok, ak nie je možná pevná adresa | dodatočné heslo, zmysluplné len spolu s TLS |
| Klientske certifikáty | niekoľko pevne spravovaných zariadení | vydávanie a zneplatňovanie certifikátov vyžaduje disciplínu |
| Vlastný názov hostiteľa len vo vnútornej sieti | väčšie prostredia s vnútorným DNS | prestavba aplikácie, nie každé CMS to podporuje |
V praxi sa osvedčuje kombinácia: povolenie len pre VPN alebo firemnú sieť a k tomu druhé prihlásenie ako záložná úroveň. Samotné prihlásenie do CMS zostáva s dvojfaktorovým overením, ako opisuje sprievodca Dvojfaktorové prihlásenie pre prístupy správcov.
Ktoré adresy vlastne patria k backendu?
Najčastejšou slabinou nie je technika, ale neúplný zoznam. Postupujte preto v tomto poradí:
- Zachytiť prihlasovacie stránky CMS alebo obchodu, vrátane alternatívnych prihlasovacích adries, ktoré zakladajú pluginy.
- Vyhľadať správcovské nástroje: databázové rozhrania, správcov súborov, inštalačné skripty, stránky stavu a monitoringu.
- Zahrnúť hostingové a serverové panely, ktoré často bežia na vlastných portoch.
- Skontrolovať testovacie a staging inštancie, ktoré často používajú rovnaké prístupové údaje ako ostrý web.
- Vymedziť rozhrania: niektoré cesty backendu volá aj verejný frontend, napríklad pri požiadavkách Ajax. Tie nesmiete slepo blokovať, inak sa pokazia formuláre alebo nákupné košíky.
Piaty bod je dôvod, prečo sa odtienenie musí vždy testovať. Pri WordPresse sa napríklad súbor v admin priečinku využíva aj pre verejné funkcie.
Konfigurácia: povolenie IP plus druhé prihlásenie
V Nginx sa dajú obe podmienky skombinovať. Pomocou satisfy all musí požiadavka pochádzať z povolenej siete a navyše uspieť v druhom prihlásení. Cesta, adresy a odovzdanie do PHP sú zástupné hodnoty:
location ^~ /backend/ {
satisfy all;
allow 192.0.2.0/24; # firemná sieť (zástupná hodnota)
allow 198.51.100.10; # výstup VPN (zástupná hodnota)
deny all;
auth_basic "Interner Bereich";
auth_basic_user_file /etc/nginx/htpasswd-backend;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php-fpm.sock;
}
}
Vnorená lokácia PHP je dôležitá: vďaka ^~ sa ďalšie pravidlá pre .php už nevyhodnocujú. V Apache dosiahnete to isté blokom, v ktorom musia platiť obe podmienky:
<Location "/backend">
AuthType Basic
AuthName "Interner Bereich"
AuthUserFile /etc/apache2/htpasswd-backend
<RequireAll>
Require ip 192.0.2.0/24 198.51.100.10
Require valid-user
</RequireAll>
</Location>
Súbor s heslami patrí mimo webový koreň. Druhé prihlásenie prenáša prístupové údaje pri každej požiadavke, preto ho používajte len cez HTTPS.
Pred každou zmenou nechajte otvorenú druhú cestu na server, napríklad existujúcu reláciu SSH. Kto vyradí sám seba, inak potrebuje hostera.
Nástrahy: CDN, proxy, IPv6 a home office
Ak váš web leží za CDN ako Cloudflare alebo za load balancerom, webserver spočiatku vidí len ich adresy. Povolenie IP by potom buď zablokovalo všetkých, alebo prepustilo všetkých. Webserver musí skutočnú adresu prevziať z hlavičky, v Nginx pomocou set_real_ip_from a real_ip_header, v Apache pomocou mod_remoteip.
Pritom platí: hlavičku prijímajte len od adries vlastných proxy. Inak môže každý návštevník predstierať ľubovoľný pôvod. Rovnako dôležité je, aby pôvodný server nebol dostupný priamo, pretože inak sa proxy aj s jeho pravidlami dá obísť. Pokyny k tomu sú v článku Firewall pre webserver.
Dva ďalšie body sa často prehliadnu. Ak je server dostupný cez IPv6, potrebujú záznam aj adresy IPv6 vašej siete, inak sa administrátori s IPv6 ocitnú pred blokovaním. A súkromné internetové prípojky svoju adresu pravidelne menia. Pre home office a externých dodávateľov je preto VPN spravidla stabilnejším riešením.
Ako overíte, že odtienenie funguje
Pravidlo, ktoré nie je otestované, sa nepovažuje za zavedené. Testujte z prípojky mimo firemnej siete, napríklad cez mobilnú sieť:
# Očakáva sa: 403 (zablokované) alebo 401 (vyžaduje sa druhé prihlásenie)
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/backend/
# Skontrolovať aj súbory PHP priamo, nielen priečinok
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/backend/index.php
Potom tie isté volania z firemnej siete alebo cez VPN: tam musí byť stránka dostupná. Následne skontrolujte verejný frontend, teda formuláre, vyhľadávanie a nákupný košík. V protokoloch nasledujúcich dní by sa mali prístupy na admin adresy objavovať takmer výlučne so stavom 401 alebo 403.
Ak bola sekcia doteraz otvorená, oplatí sa pozrieť na existujúce účty. Ako nájdete neznámych administrátorov, opisuje Cudzie admin účty v CMS a na serveri: ako ich nájsť. Doplnkovo brzdí ochrana proti hromadnému skúšaniu, pozri Ochrana prihlásenia admina proti brute force.
Ako konkrétne pomáha PHP SOS?
- Zachytíme všetky správcovské adresy vašich webov, panelov a nástrojov a oddelíme ich od ciest, ktoré sú potrebné verejne.
- S vami vyberieme vhodný postup podľa veľkosti tímu, home office a hostingu.
- Pravidlá zavedieme vo webservery, zohľadníme CDN, proxy a IPv6 a pritom necháme otvorenú cestu späť.
- Otestujeme zvonka aj zvnútra a odovzdáme krátku dokumentáciu s povolenými sieťami.
Odtienenie admin sekcií je súčasťou nášho spevnenia servera (hardening) pre webservery PHP.
Časté otázky
Nestačí bezpečné heslo na prihlásenie do CMS?
Silné heslo a dvojfaktorové prihlásenie sú povinnosť, chránia však len samotné prihlásenie. Zraniteľnosti v prihlasovacích stránkach, pluginoch alebo správcovských nástrojoch sú napriek tomu dostupné pre každého. Odtienenie na úrovni siete alebo webservera zabezpečí, že sa cudzí k nim vôbec nedostanú.
Čo robiť, ak majú zamestnanci meniace sa adresy IP?
Vtedy je spravidla lepším riešením VPN s pevnou výstupnou adresou než zoznam jednotlivých adries. Všetci administrátori sa najprv pripoja cez VPN a webserver povolí len jeho adresu. Alternatívou je predradené druhé prihlásenie.
Funguje blokovanie IP aj za Cloudflare alebo load balancerom?
Len ak webserver preberie skutočnú adresu návštevníka z dôveryhodnej hlavičky a túto hlavičku prijíma výlučne od vlastného proxy. Inak vidí len adresy proxy alebo dôveruje sfalšovaným údajom. Okrem toho by pôvodný server nemal byť dostupný priamo z internetu.
Chráni odtienená admin sekcia pred PHP2Shell?
Len veľmi obmedzene. Zraniteľnosti PHP2Shell sú v interpreteri PHP a dajú sa bez prihlásenia napadnúť cez každú verejnú stránku PHP. Proti PHP2Shell pomáha aktualizácia PHP s následným reštartom všetkých workerov, odtienenie iba zmenšuje zvyšnú útočnú plochu.