Trumpai: atsarginių kopijų failus žiniatinklio šakniniame kataloge, t. y. duomenų bazių išklotines (.sql), archyvus (.zip, .tar.gz) ir atsargines kopijas (.bak, .old, ~), gali atsisiųsti kiekvienas, kas žino ar atspėja failo vardą. Tokių failų reguliariai ieškokite su find, atsargines kopijas perkelkite už viešo katalogo ribų, žiniatinklio serveryje užrakinkite tipines galūnes ir prieigos žurnaluose patikrinkite, ar jos jau buvo kviečiamos.
Atsarginė kopija, tampanti nutekėjimu
Prieš pat atnaujinimą kažkas dar greitai sukuria kopiją: backup.zip pagrindiniame kataloge, šalia datenbank.sql. Atnaujinimas pavyksta, failai lieka. Po mėnesių jie vis dar ten, su visu kodu, visais klientų duomenimis ir svetainės prisijungimo duomenimis.
Šis šablonas priklauso dažniausiems radiniams tikrinant žiniatinklio serverius. Jam nereikia nei išnaudojimo, nei spragos PHP. Žiniatinklio serveris iš žiniatinklio šakninio katalogo pateikia tai, kas ten yra, o archyvų ar SQL failų nevykdo, o siūlo atsisiųsti.
Svetainės archyve yra ne tik duomenys, bet ir kodas su konfigūracija. Kas jį atsisiunčia, gali ramiai ieškoti spragų ir žino duomenų bazės prisijungimo duomenis.
Automatiniai skaneriai tikslingai ieško tipinių pavadinimų kaip backup.zip, site.tar.gz ar dump.sql, dažnai kartu su domeno vardu ar data. Kas mano, kad neįprastas failo vardas apsaugo, nuvertina, kaip sistemingai ši paieška vykdoma.
Kokie failai turimi omenyje
Atsarginių kopijų failai žiniatinklio šakniniame kataloge pasitaiko keliomis formomis:
| Rūšis | Tipinės galūnės | Kas viduje |
|---|---|---|
| Duomenų bazių išklotinės (dump) | .sql, .sql.gz, .dump |
klientų duomenys, užsakymai, slaptažodžių maišos (hash), nustatymai |
| Svetainės archyvai | .zip, .tar, .tar.gz, .tgz, .rar, .7z |
visas kodas, konfigūracija, įkėlimai |
| Atskirų failų kopijos | .bak, .old, .orig, .save, .php~, .copy |
dažnai konfigūracijos failai su prisijungimo duomenimis |
| Redaktoriaus likučiai | .swp, .swo, ~ gale |
dalys šiuo metu redaguojamų failų |
| Papildinių atsarginės kopijos | atskiri CMS poaplankiai | pilnos kopijos, kartais su atspėjamais vardais |
Ypač jautrios konfigūracijos failų kopijos. Originalų failą config.php serveris vykdo, jo turinys lieka paslėptas. Kopiją config.php.bak jis pateikia kaip tekstą, kartu su duomenų bazės slaptažodžiu.
Atsarginės kopijos žiniatinklio šakniniame kataloge paieška: paieška serveryje
Toliau pateikta paieška išvardija įtartinus failus žemiau žiniatinklio šakninių katalogų su data ir dydžiu. Pritaikykite kelius savo serveriui:
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
Ne kiekvienas radinys yra problema. Kai kurie archyvai sąmoningai pateikti atsisiuntimui, pavyzdžiui, vadovai. Tačiau kiekvienas failas nusipelno sąmoningo sprendimo. Ypač atkreipkite dėmesį į didelius failus ir atsarginių kopijų papildinių aplankus. Bendrajame talpinime (shared hosting) be shell prieigos padeda failų apžvalga talpinimo valdymo skydelyje arba kreipinys per SFTP.
Radę duomenų bazės išklotinę (dump) su klientų duomenimis žiniatinklio šakniniame kataloge, nedelsiant perkelkite ją iš viešo katalogo ir išsaugokite prieigos žurnalus, kol jie nesuksukti. Tik tada išsiaiškinkite, ar failas buvo kviečiamas.
Ar failas jau buvo atsisiųstas?
Atsakymas yra žiniatinklio serverio prieigos žurnaluose. Ieškoma sėkmingų kreipinių, t. y. būsenos 200, į rastus failus:
# Sėkmingi tipinių atsarginių kopijų galūnių kreipiniai (Combined žurnalo formatas)
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}'
Išvestis rodo laiką, adresą, kelią ir atsakymo dydį. Jei perduotas dydis atitinka failo dydį, failas buvo atsisiųstas pilnai. Kaip toli atgal siekia žurnalai, priklauso nuo sukimo. Jei jie nesiekia failo sukūrimo datos, ankstesnio kreipinio atmesti negalima. Išsamiai tai aprašo Žiniatinklio serverio žurnalų vertinimas po atakos. Be prieigos prie neapdorotų žurnalų, pavyzdžiui, bendrajame talpinime, paprašykite talpinimo teikėjo atitinkamo laikotarpio žurnalų.
Jei buvo kviesta išklotinė (dump) su asmens duomenimis arba to atmesti negalima, prasideda pranešimo pareigos patikra. Pagrindus apibendrina BDAR pranešimo pareiga: 72 valandos po incidento; vertinimas konkrečiu atveju priklauso jūsų duomenų apsaugos pareigūnui. Prisijungimo duomenis iš kviestų failų pakeiskite bet kuriuo atveju.
Atsarginių kopijų papildiniai, valdymo skydeliai ir perkėlimai
Daug radinių kyla iš CMS ir parduotuvių atsarginių kopijų papildinių. Jie kopijas dažnai deda žiniatinklio šakninio katalogo poaplankyje, kartais su pavadinimais iš datos ir domeno, kuriuos galima atspėti. Kiekviename papildinyje patikrinkite tris nustatymus: kur kuriama kopija? Ar vietinės kopijos po įkėlimo į išorinį tikslą ištrinamos? Ar vietinis aplankas apsaugotas nuo tiesioginio kreipinio?
Talpinimo valdymo skydelių kopijos paprastai yra už žiniatinklio šakninio katalogo, pavyzdžiui, namų kataloge. Problema atsiranda, kai kas nors tokią kopiją nukopijuoja į žiniatinklio šakninį katalogą, nes atsisiuntimas naršykle patogesnis nei per SFTP. Perkėlimams todėl galioja: perdavimas per SFTP ar tiesiogiai tarp serverių, niekada per viešą nuorodą.
Jei jūsų svetaines prižiūri agentūros ar paslaugų teikėjai, ši taisyklė turėtų būti ir sutartyje, kartu su pareiga sutvarkyti po priežiūros darbų. Nuorodų pateikia IT paslaugų teikėjų sutartys: aiškiai nustatyti saugumo pareigas.
Ilgalaikė prevencija: saugojimo vieta ir užraktai
Kad problema nesikartotų, reikia dviejų lygmenų. Pirmas yra organizacinis: atsarginės kopijos turi fiksuotą vietą už žiniatinklio šakninio katalogo ir papildomai už serverio ribų. Kaip atrodo patikima kopija, aprašo vadovas Atsarginės kopijos pagal 3-2-1 taisyklę.
Antras lygmuo yra techninis: žiniatinklio serveris iš principo atsisako tipinių atsarginių kopijų galūnių, net jei koks nors failas vis dėlto liktų.
location ~* \.(sql|sql\.gz|dump|bak|old|orig|save|swp|swo)$ {
return 404;
}
location ~ ~$ {
return 404;
}
Archyvus kaip .zip užrakinkite tik jei jūsų svetainė neteikia atsisiuntimų šiuo formatu, arba tikslingai aplankuose, kuriuose atsisiuntimų nėra. Papildomai padeda reguliari automatinė paieška su pranešimu ir trumpa komandos taisyklė: jokių kopijų ir atsarginių kopijų žiniatinklio šakniniame kataloge, net ir penkioms minutėms. Giminingus atvejus, kaip paslėpti konfigūracijos failai, aptaria Prisijungimo duomenų ir .env failų teisinga apsauga.
Kaip PHP SOS padeda konkrečiai?
- Peržiūrime jūsų žiniatinklio šakninius katalogus ieškodami išklotinių (dump), archyvų, kopijų ir papildinių atsarginių kopijų ir įvertiname kiekvieną radinį.
- Pagal prieigos žurnalus tikriname, ar failai buvo kviečiami, ir rezultatą dokumentuojame jūsų duomenų apsaugos vertinimui.
- Įrengiame užraktus žiniatinklio serveryje ir reguliarią automatinę paiešką.
- Atsargines kopijas perkeliame į apsaugotą vietą už žiniatinklio šakninio katalogo.
Šie darbai yra mūsų PHP žiniatinklio serverių sutvirtinimo dalis.
Dažni klausimai
Kodėl atsarginės kopijos apskritai atsiduria žiniatinklio šakniniame kataloge?
Dažniausiai iš patogumo: išklotinė (dump) sukuriama perkėlimui, papildinys deda kopijas savo aplanke arba prieš pakeitimą greitai sukuriama failo kopija su galūne .bak. Vėliau failas pamirštamas.
Kiek pavojingas failas kaip config.php.bak?
Labai. Failą su galūne .php serveris vykdo, jo turinys lieka paslėptas. Kopiją su kita galūne serveris dažniausiai pateikia kaip tekstą, kartu su duomenų bazės slaptažodžiu ir raktais.
Ar viešai pasiekiama duomenų bazės išklotinė (dump) yra duomenų pažeidimas?
Jei joje yra asmens duomenų ir ji buvo kviečiama arba kvietimo atmesti negalima, gali būti svarstoma pranešimo pareiga pagal BDAR. Vertinimą konkrečiu atveju atlieka jūsų duomenų apsaugos pareigūnas arba teisinė konsultacija.
Kur vietoj to turėtų būti atsarginės kopijos?
Už žiniatinklio šakninio katalogo ir papildomai už serverio ribų, pagal 3-2-1 taisyklę. Bent viena kopija turėtų būti saugoma taip, kad pats žiniatinklio serveris jos negalėtų ištrinti ar pakeisti.