Ukratko: Sigurnosne kopije u webrootu, dakle dumpove baza podataka (.sql), arhive (.zip, .tar.gz) i sigurnosne kopije (.bak, .old, ~), može preuzeti svatko tko zna ili pogodi naziv datoteke. Takve datoteke redovito tražite pomoću find, sigurnosne kopije premjestite izvan javnog direktorija, tipične nastavke blokirajte u web-poslužitelju i u pristupnim zapisnicima provjerite jesu li već dohvaćene.
Sigurnosna kopija koja postaje curenje
Neposredno prije updatea netko brzo napravi sigurnosnu kopiju: backup.zip u glavnom direktoriju, pokraj nje datenbank.sql. Update uspije, datoteke ostanu. Mjesecima kasnije još su tu, s cjelokupnim kodom, svim podacima kupaca i pristupnim podacima web-stranice.
Ovaj uzorak spada među najčešće nalaze pri provjerama web-poslužitelja. Ne treba exploit ni ranjivost u PHP-u. Web-poslužitelj iz webroota isporučuje što tamo leži, a arhive ili SQL datoteke ne izvršava, nego ih nudi za preuzimanje.
Arhiva web-stranice pritom ne sadrži samo podatke, nego i kod zajedno s konfiguracijom. Tko je preuzme, može na miru tražiti ranjivosti i zna pristupne podatke za bazu podataka.
Automatizirani skeneri ciljano traže tipične nazive poput backup.zip, site.tar.gz ili dump.sql, često u kombinaciji s nazivom domene ili datumom. Tko vjeruje da ga neobičan naziv datoteke štiti, podcjenjuje koliko je ta potraga sustavna.
Koje se datoteke misle
Sigurnosne kopije u webrootu javljaju se u više oblika:
| Vrsta | Tipični nastavci | Što se u njima krije |
|---|---|---|
| Dumpovi baza podataka | .sql, .sql.gz, .dump |
podaci kupaca, narudžbe, hashovi lozinki, postavke |
| Arhive web-stranice | .zip, .tar, .tar.gz, .tgz, .rar, .7z |
cijeli kod, konfiguracija, uploadi |
| Kopije pojedinačnih datoteka | .bak, .old, .orig, .save, .php~, .copy |
često konfiguracijske datoteke s pristupnim podacima |
| Ostaci uređivača | .swp, .swo, ~ na kraju |
dijelovi datoteka koje se upravo uređuju |
| Sigurnosne kopije dodataka | vlastiti poddirektoriji u CMS-u | potpune sigurnosne kopije, djelomično s nazivima koji se mogu pogoditi |
Osobito su osjetljive kopije konfiguracijskih datoteka. Izvornu datoteku config.php poslužitelj izvršava i njezin sadržaj ostaje skriven. Kopiju config.php.bak isporučuje kao tekst, zajedno s lozinkom baze podataka.
Pronaći backup u webrootu: pretraga na poslužitelju
Sljedeća pretraga navodi sumnjive datoteke ispod webrootova s datumom i veličinom. Putanje prilagodite svojem poslužitelju:
find /var/www /srv/www -type f \( \
-iname '*.sql' -o -iname '*.sql.gz' -o -iname '*.dump' -o \
-iname '*.zip' -o -iname '*.tar' -o -iname '*.tar.gz' -o -iname '*.tgz' -o \
-iname '*.rar' -o -iname '*.7z' -o \
-iname '*.bak' -o -iname '*.old' -o -iname '*.orig' -o -iname '*.save' -o \
-iname '*~' -o -iname '*.swp' \) \
-printf '%TY-%Tm-%Td %10s %p\n' 2>/dev/null | sort
Nije svaki pogodak problem. Neke su arhive svjesno stavljene na preuzimanje, primjerice priručnici. Svaka datoteka ipak zaslužuje svjesnu odluku. Obratite osobitu pažnju na velike datoteke i na mape dodataka za sigurnosne kopije. Kod zajedničkog hostinga bez pristupa ljusci pomaže pregled datoteka u hosting panelu ili dohvat putem SFTP-a.
Ako u webrootu nađete dump baze podataka s podacima kupaca, odmah ga premjestite iz javnog direktorija i osigurajte pristupne zapisnike prije nego se rotiraju. Tek zatim razjasnite je li datoteka dohvaćena.
Je li datoteka već preuzeta?
Odgovor stoji u pristupnim zapisnicima web-poslužitelja. Traže se uspješni dohvati, dakle status 200, na pronađene datoteke:
# Uspješni dohvati tipičnih nastavaka sigurnosnih kopija (Combined format zapisnika)
zgrep -hE '\.(sql|sql\.gz|zip|tar|tgz|gz|bak|old|7z|rar)[ ?]' /var/log/nginx/access.log* \
| awk '$9 == 200 {print $4, $1, $7, $10}'
Ispis pokazuje vrijeme, adresu, putanju i veličinu odgovora. Ako preneseno odgovara veličini datoteke, datoteka je preuzeta u cijelosti. Koliko unatrag zapisnici sežu, ovisi o rotaciji. Ako ne sežu do datuma izrade datoteke, raniji se dohvat ne može isključiti. Opširno to opisuje Analizirati zapisnike web-poslužitelja nakon napada. Bez pristupa sirovim zapisnicima, primjerice kod zajedničkog hostinga, od hostera zatražite zapisnike za dotično razdoblje.
Ako je dohvaćen dump s osobnim podacima ili se to ne može isključiti, počinje provjera obveze prijave. Osnove sažima Obveza prijave prema GDPR-u: 72 sata nakon incidenta; procjena u pojedinačnom slučaju pripada Vašem službeniku za zaštitu podataka. Pristupne podatke iz dohvaćenih datoteka u svakom slučaju zamijenite.
Dodaci za sigurnosne kopije, paneli i selidbe
Mnogi nalazi potječu od dodataka za sigurnosne kopije CMS-ova i shopova. Oni sigurnosne kopije često odlažu u poddirektorij webroota, djelomično s nazivima od datuma i domene koji se mogu pogoditi. U svakom dodatku provjerite tri postavke: kamo se sprema? Brišu li se lokalne kopije nakon učitavanja na vanjsko odredište? Je li lokalna mapa zaštićena od izravnog dohvata?
Sigurnosne kopije iz hosting panela u pravilu leže izvan webroota, primjerice u matičnom direktoriju. Problematično postaje kad netko takvu sigurnosnu kopiju kopira u webroot jer je preuzimanje u pregledniku ugodnije nego putem SFTP-a. Za selidbe stoga vrijedi: prijenos putem SFTP-a ili izravno između poslužitelja, nikad preko javne poveznice.
Ako agencije ili pružatelji usluga održavaju Vaše web-stranice, ovo bi pravilo trebalo stajati i u ugovoru, uz obvezu čišćenja nakon radova održavanja. Napomene daje Ugovori s IT pružateljima usluga: jasno urediti sigurnosne obveze.
Trajno spriječiti: mjesto pohrane i blokade
Da se problem ne ponovi, trebaju dvije razine. Prva je organizacijska: sigurnosne kopije imaju čvrsto mjesto izvan webroota i dodatno izvan poslužitelja. Kako izgleda pouzdana sigurnosna kopija, opisuje vodič Sigurnosne kopije prema pravilu 3-2-1.
Druga razina je tehnička: web-poslužitelj u načelu odbija tipične nastavke sigurnosnih kopija, čak i ako neka datoteka ipak ostane ležati.
location ~* \.(sql|sql\.gz|dump|bak|old|orig|save|swp|swo)$ {
return 404;
}
location ~ ~$ {
return 404;
}
Arhive poput .zip blokirajte samo ako Vaša web-stranica ne nudi preuzimanja u tom formatu, ili ciljano u direktorijima u kojima nema preuzimanja. Dodatno pomažu redovita automatska pretraga s obavijesti i kratko pravilo u timu: nikakvih sigurnosnih kopija i kopija u webrootu, ni na pet minuta. Srodne slučajeve poput skrivenih konfiguracijskih datoteka obrađuje Ispravno zaštititi pristupne podatke i .env datoteke.
Kako PHP SOS konkretno pomaže?
- Pretražujemo Vaše webrootove u potrazi za dumpovima, arhivama, kopijama i sigurnosnim kopijama dodataka te ocjenjujemo svaki nalaz.
- Na temelju pristupnih zapisnika provjeravamo jesu li datoteke dohvaćene i dokumentiramo rezultat za Vašu procjenu zaštite podataka.
- Postavljamo blokade u web-poslužitelju i redovitu automatsku pretragu.
- Sigurnosne kopije premještamo na zaštićeno mjesto izvan webroota.
Ovi radovi dio su našeg ojačavanja poslužitelja za PHP web-poslužitelje.
Česta pitanja
Zašto sigurnosne kopije uopće završavaju u webrootu?
Najčešće iz udobnosti: dump se izrađuje za selidbu, dodatak odlaže sigurnosne kopije u vlastitu mapu ili se prije promjene brzo napravi kopija datoteke s nastavkom .bak. Nakon toga datoteka pada u zaborav.
Koliko je opasna datoteka poput config.php.bak?
Vrlo. Datoteku s nastavkom .php poslužitelj izvršava i njezin sadržaj ostaje skriven. Kopiju s drugim nastavkom poslužitelj pak obično isporučuje kao tekst, zajedno s lozinkom baze podataka i ključevima.
Je li javno dostupan dump baze podataka povreda podataka?
Ako sadrži osobne podatke i dohvaćen je ili se dohvat ne može isključiti, u obzir dolazi obveza prijave prema GDPR-u. Procjenu u pojedinačnom slučaju preuzima Vaš službenik za zaštitu podataka ili Vaš pravni savjetnik.
Gdje bi sigurnosne kopije umjesto toga trebale ležati?
Izvan webroota i dodatno izvan poslužitelja, prema pravilu 3-2-1. Barem jedna kopija trebala bi biti pohranjena tako da je sam web-poslužitelj ne može obrisati ni promijeniti.