Ukratko: Admin područje najučinkovitije štitite tako da ga otvorite samo za poznate mreže: pomoću IP popisa u web-poslužitelju, preko VPN-a s fiksnom izlaznom adresom ili drugom, prethodnom prijavom. Važni su potpun popis svih adresa za upravljanje, ispravno postupanje s proxyjima i CDN-ovima te test izvana. Odvajanje nadopunjuje dvofaktorsku prijavu i ažuriranja, ne zamjenjuje ih.
Zašto je backend uopće otvoren?
U mnogim su tvrtkama administratori prošlog tjedna ažurirali PHP i ponovno pokrenuli workere. Tko nakon toga pogleda pristupne zapisnike, često uoči nešto drugo: stranicu za prijavu CMS-a, alat za bazu podataka i hosting panel danas poziva cijeli svijet, 24 sata na dan. A trebaju ih samo šačica ljudi iz vlastitog tima.
Svaka od tih adresa napadna je površina. Obrasci za prijavu isprobavaju se redom, alati za upravljanje imaju vlastite ranjivosti, a dodaci za backend često su slabije provjereni od jezgre CMS-a. Ako stranci do tih područja uopće ne mogu doći, mnogi napadi propadnu prije nego počnu.
Iskreno razvrstano: protiv samog PHP2Shella to pomaže malo. Ranjivosti se nalaze u interpreteru i prema php.net-u mogu se pokrenuti bez prijave preko javnih PHP stranica. Odvajanje backenda trajno je ojačavanje, a ne hitna zakrpa.
Zaštita admin područja pomoću IP-a, VPN-a ili druge prijave
Ne postoji jedna ispravna metoda. Odlučuje kako Vaš tim radi i gdje web-stranica radi.
| Metoda | Prikladno za | Granica |
|---|---|---|
| IP popis u web-poslužitelju | ured s fiksnom adresom, mali timovi | promjenjive adrese u radu od kuće, održavanje popisa |
| VPN s fiksnom izlaznom adresom | raspoređeni timovi, pružatelji usluga | VPN mora i sam biti dobro zaštićen i ažuran |
| Prethodna prijava (HTTP autentifikacija) | dopuna kad fiksna adresa nije moguća | dodatna lozinka, smislena samo uz TLS |
| Klijentski certifikati | nekoliko stalno upravljanih uređaja | izdavanje i opoziv certifikata traže disciplinu |
| Vlastiti naziv hosta samo u internoj mreži | veća okruženja s internim DNS-om | preinaka aplikacije, ne podržava svaki CMS |
U praksi se pokazala kombinacija: odobrenje samo za VPN ili mrežu tvrtke, uz drugu prijavu kao rezervnu razinu. Prava prijava u CMS-u ostaje s dvofaktorskim postupkom, kako opisuje vodič Dvofaktorska prijava za administratorske pristupe.
Koje adrese zapravo pripadaju backendu?
Najčešća slabost nije tehnika, nego nepotpun popis. Zato postupajte ovim redom:
- Popisati stranice za prijavu CMS-a ili shopa, uključujući alternativne adrese za prijavu koje stvaraju dodaci.
- Potražiti alate za upravljanje: sučelja baza podataka, upravitelje datoteka, instalacijske skripte, stranice statusa i nadzora.
- Uključiti hosting i poslužiteljske panele, koji često rade na vlastitim portovima.
- Provjeriti test i staging instance, koje često koriste iste pristupne podatke kao live stranica.
- Razgraničiti sučelja: neke backend putanje poziva i javni frontend, primjerice za Ajax zahtjeve. Njih ne smijete slijepo blokirati, jer će se pokvariti obrasci ili košarice.
Peta je točka razlog zašto se odvajanje uvijek mora testirati. Kod WordPressa se, primjerice, jedna datoteka u admin mapi koristi i za javne funkcije.
Konfiguracija: IP popis uz drugu prijavu
Pod Nginxom se oba uvjeta mogu kombinirati. Uz satisfy all zahtjev mora dolaziti iz odobrene mreže i dodatno proći drugu prijavu. Putanja, adrese i predaja PHP-u su rezervirana mjesta:
location ^~ /backend/ {
satisfy all;
allow 192.0.2.0/24; # mreža tvrtke (rezervirano mjesto)
allow 198.51.100.10; # izlaz VPN-a (rezervirano mjesto)
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;
}
}
Ugniježđena PHP location važna je: zbog ^~ ostala se pravila za .php više ne evaluiraju. Pod Apacheom isto postižete blokom u kojem moraju vrijediti oba uvjeta:
<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>
Datoteka s lozinkama pripada izvan webroota. Druga prijava prenosi pristupne podatke pri svakom zahtjevu, zato je koristite samo preko HTTPS-a.
Prije svake promjene držite otvoren drugi put na poslužitelj, primjerice postojeću SSH sesiju. Tko sam sebe isključi, inače treba hostera.
Zamke: CDN, proxy, IPv6 i rad od kuće
Ako je Vaša web-stranica iza CDN-a poput Cloudflarea ili load balancera, web-poslužitelj najprije vidi samo njegove adrese. IP odobrenje tada bi ili blokiralo sve ili propustilo sve. Web-poslužitelj mora stvarnu adresu preuzeti iz zaglavlja, pod Nginxom pomoću set_real_ip_from i real_ip_header, pod Apacheom pomoću mod_remoteip.
Pritom vrijedi: zaglavlje prihvaćajte samo s vlastitih adresa proxyja. Inače svaki posjetitelj može glumiti proizvoljno podrijetlo. Jednako je važno da izvorni poslužitelj nije izravno dostupan, jer se inače proxy sa svojim pravilima može zaobići. Napomene o tome nalaze se u članku Vatrozid za web-poslužitelje.
Još dvije točke često se previđaju. Ako je poslužitelj dostupan preko IPv6, i IPv6 adrese Vaše mreže trebaju unos, inače administratori s IPv6 stoje pred blokadom. A privatni internetski priključci redovito mijenjaju adresu. Za rad od kuće i vanjske pružatelje usluga VPN je stoga obično stabilnije rješenje.
Kako provjeriti djeluje li odvajanje
Pravilo koje nije testirano ne vrijedi kao provedeno. Provjerite s priključka izvan mreže tvrtke, na primjer preko mobilne mreže:
# Očekuje se: 403 (blokirano) ili 401 (traži se druga prijava)
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/backend/
# Provjeriti i PHP datoteke izravno, ne samo direktorij
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/backend/index.php
Zatim iste pozive iz mreže tvrtke ili VPN-a: tamo stranica mora biti dostupna. Nakon toga provjerite javni frontend, dakle obrasce, pretragu i košaricu. U zapisnicima idućih dana pristupi admin adresama trebali bi se pojavljivati gotovo samo sa statusom 401 ili 403.
Ako je područje dosad bilo otvoreno, vrijedi pogledati postojeće račune. Kako pronaći nepoznate administratore, opisuje članak Pronaći strane administratorske račune u CMS-u i na poslužitelju. Dodatno koči zaštita od masovnog isprobavanja, vidi Zaštititi administratorske prijave od brute forcea.
Kako PHP SOS konkretno pomaže?
- Bilježimo sve adrese za upravljanje Vaših web-stranica, panela i alata te ih odvajamo od putanja koje su javno potrebne.
- S Vama biramo odgovarajući postupak, ovisno o veličini tima, radu od kuće i hostingu.
- Pravila provodimo u web-poslužitelju, uzimamo u obzir CDN, proxy i IPv6 te pritom držimo otvoren povratni put.
- Testiramo izvana i iznutra te predajemo kratku dokumentaciju s odobrenim mrežama.
Odvajanje admin područja dio je našeg ojačavanja poslužitelja za PHP web-poslužitelje.
Česta pitanja
Ne dovodi li siguran lozinka za CMS prijavu do kraja?
Jaka lozinka i dvofaktorska prijava obvezne su, ali štite samo samu prijavu. Ranjivosti u stranicama za prijavu, dodacima ili alatima za upravljanje i dalje su dostupne svima. Odvajanje na razini mreže ili web-poslužitelja osigurava da stranci uopće ne dođu do njih.
Što učiniti ako moji zaposlenici imaju promjenjive IP adrese?
Tada je VPN s fiksnom izlaznom adresom obično bolje rješenje od popisa pojedinačnih adresa. Svi administratori najprije se spajaju na VPN, a web-poslužitelj odobrava samo njegovu adresu. Alternativno je prikladna prethodna druga prijava.
Radi li IP blokada i iza Cloudflarea ili load balancera?
Samo ako web-poslužitelj stvarnu adresu posjetitelja preuzima iz pouzdanog zaglavlja i to zaglavlje prihvaća isključivo od vlastitog proxyja. Inače vidi samo adrese proxyja ili vjeruje krivotvorenim podacima. Uz to izvorni poslužitelj ne bi trebao biti izravno dostupan s interneta.
Štiti li odvojeno admin područje od PHP2Shella?
Samo vrlo ograničeno. Ranjivosti PHP2Shell nalaze se u PHP interpreteru i bez prijave se mogu napasti preko svake javne PHP stranice. Protiv PHP2Shella pomaže PHP update s ponovnim pokretanjem svih workera, a odvajanje samo smanjuje preostalu napadnu površinu.