Īsi sakot: Publiska .git mape rodas, kad vietne tiek izvietota ar git clone vai git pull tieši tīmekļa saknē un tīmekļa serveris slēptās mapes nebloķē. Tad var atvērt visu pirmkodu kopā ar versiju vēsturi, ieskaitot agrāk reģistrētus piekļuves datus. Pārbaudiet savus domēnus ar vienkāršu izsaukumu, nekavējoties bloķējiet piekļuvi, pārejiet uz izvietošanu ar pakotnēm bez .git un nomainiet piekļuves datus no vēstures.
Pirmkods līdzi ņemšanai
Git ir standarta rīks versiju kontrolei, un mazām komandām tā ir loģiska izvēle arī izvietošanai: pieslēgties serverim, git pull, gatavs. Tas darbojas uzticami un ātri. Tomēr tam ir blakusefekts, ko bieži neviens nepamana.
Projekta mapē atrodas slēpta mape .git. Tajā ir ne tikai pašreizējais stāvoklis, bet katrs fails katrā versijā, kas jebkad reģistrēta, kā arī commit ziņojumi, izstrādātāju vārdi un e-pasta adreses un atsauces uz serveriem. Ja šī mape atrodas tīmekļa saknē un tīmekļa serveris to piegādā, ikviens to var atvērt.
Uzbrucējiem tā ir dāvana. Ar pirmkodu ievainojamības var meklēt mērķtiecīgi, nevis tās minēt no ārpuses. Un vēsturē bieži atrodas lietas, kas šķita sen izdzēstas: datubāzes parole no sākuma laika, API atslēga, testa fails ar klientu datiem.
Vai jūsu .git mape ir publiska? Lūk, kā pārbaudīt
Pārbaude aizņem sekundes un neko nemaina. Katram domēnam un apakšdomēnam izsauciet failu, kas pastāv katrā Git repozitorijā:
# Sagaidāms: 403 vai 404
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.git/HEAD
curl -s -o /dev/null -w "%{http_code}\n" https://www.example.de/.git/config
# Serverī: vai zem tīmekļa saknēm ir .git mapes?
find /var/www /srv/www -maxdepth 4 -type d -name ".git" 2>/dev/null
Statuss 200 nozīmē: mape ir sasniedzama. Ņemiet vērā arī apakšdirektorijus. Dažkārt repozitorijs atrodas nevis pašā tīmekļa saknē, bet spraudņa vai motīva mapē, ko atsevišķi uztur ar Git.
Pārbaudiet arī staging un testa vides. Tās ar Git tiek atjauninātas biežāk nekā ražošana un bieži ir sasniedzamas uz uzminamiem apakšdomēniem.
Nekavējoties: bloķēt piekļuvi
Kamēr izvietošana nav pārkārtota, noteikums tīmekļa serverī bloķē piekļuvi versiju kontroles mapēm. Vispārīga slēpto failu bloķēšana, kā aprakstīts rakstā Piekļuves datu un .env failu pareiza aizsardzība, to aptver kopā ar pārējo. Kas vēlas bloķēt tikai versiju kontroli, lieto šaurāku noteikumu:
location ~ /\.(git|svn|hg)(/|$) {
return 404;
}
RedirectMatch 404 /\.(git|svn|hg)(/|$)
Pēc tam atkārtojiet iepriekšējo pārbaudi, un to ar īstu izsaukumu no ārpuses: sekmīgs konfigurācijas tests nozīmē tikai to, ka sintakse ir pareiza, nevis to, ka noteikums iedarbojas pirms citiem noteikumiem statiskajiem failiem. Paneļos, piemēram, Plesk vai cPanel, noteikumu ierakstiet tam paredzētajās papildu direktīvās, lai tas nākamajā konfigurācijas ģenerēšanā netiktu pazaudēts.
Ja mape bija sasniedzama, visus piekļuves datus, kas jebkad bijuši repozitorijā, uzskatiet par zināmiem. Ar bloķēšanu vien tad nepietiek, vērtības jānomaina.
Ilgtermiņā: izvietot bez .git tīmekļa saknē
Bloķēšana ir aizsardzības līdzeklis, nevis risinājums. Ilgtermiņā versiju kontrolei serverī ražošanā nav vietas. Pierādīti ceļi atkarībā no jūsu vides:
| Metode | Kā darbojas | Piemērota |
|---|---|---|
| Būvējuma pakotne no CI | pipeline izveido arhīvu bez .git, serveris to izpako jaunā izlaiduma direktorijā |
komandām ar CI/CD |
git archive |
izveido viena stāvokļa arhīvu bez versiju datiem | maziem projektiem bez pipeline |
rsync ar izņēmumiem |
pārsūta tikai nepieciešamos failus | klasiskiem serveriem |
| Konteinera attēls | kods būvēšanas laikā tiek iekopēts attēlā, .git izslēgts ar .dockerignore |
konteineru darbībai |
Izlaiduma direktorijam katrai versijai ar simbolisku saiti uz aktuālo stāvokli ir vēl viena priekšrocība: problēmu gadījumā varat uzreiz pārslēgties atpakaļ. Konteineru uzstādījumiem rakstā CI/CD: PHP attēlu automātiska pārbūve aprakstīts, kā būvējumi kļūst reproducējami. Tur jāpārbauda arī, vai .git nenonāk attēlā.
# Piemērs: izveidot viena stāvokļa pakotni bez versiju datiem
git archive --format=tar.gz -o release.tar.gz HEAD
Citi projekta faili, kam nav vietas tīmekļa saknē
.git mape ir pazīstamākais piemērs, bet ne vienīgais. Kas izvieto veselas projekta direktorijas, tīmekļa saknē ieved citus failus, kam tur nav vietas:
- Izstrādes vides mapes, piemēram,
.ideavai.vscode, kur paplašinājumi failu augšupielādei dažkārt glabā serveru adreses un piekļuves datus. composer.jsonuncomposer.lock, kas izpauž visu bibliotēku precīzās versijas un tādējādi atvieglo zināmo ievainojamību meklēšanu.- Konfigurācijas testiem, būvēšanas rīkiem un pipeline, kas atklāj iekšējus hostvārdus un procesus.
- Operētājsistēmu atliekas, piemēram,
.DS_Store, kas satur veselu direktoriju failu sarakstus.
Risinājums ir tas pats, kas .git mapei: piegādāt tikai to, kam jābūt publiskam, ideālā gadījumā ar atsevišķu apakšmapi kā tīmekļa sakni. Kas izvietošanu tāpat pāriet uz pakotnēm, tas uzreiz nosaka izslēdzamo failu sarakstu un pārbauda to pie katra jauna rīka projektā.
Ja mape bija atvērta: pārbaudīt vēsturi un žurnālus
Ja izrādās, ka .git mape bija sasniedzama, rīkojieties šādā secībā:
- Bloķēt piekļuvi un atkārtot pārbaudi.
- Pārmeklēt vēsturi, kādi noslēpumi jebkad reģistrēti: konfigurācijas faili,
.env, atslēgas, datubāzu izmetumi. - Nomainīt piekļuves datus, un visus, kas atrasti 2. solī, arī ja šodien tie kodā vairs nav.
- Izvērtēt piekļuves žurnālus, vai faili zem
/.git/tika atvērti ar statusu 200 un no kurām adresēm. Kā to darīt, rāda Tīmekļa servera žurnālu izvērtēšana pēc uzbrukuma. - Mērķtiecīgi pārbaudīt pirmkodu, jo uzbrucēji to tagad pazīst. Zināmās vājās vietas jānovērš prioritāri.
- Noskaidrot datu aizsardzību, ja vēsturē bija personas dati, piemēram, testa eksporti. Novērtējumu veic jūsu datu aizsardzības speciālists.
Rīki noslēpumu meklēšanai repozitorijos pēc tam pastāvīgi pieder pipeline. OWASP šādas pārbaudes nepārprotami iesaka, kā hook pirms reģistrēšanas un CI.
Kā PHP SOS palīdz konkrēti?
- Mēs pārbaudām visus jūsu domēnus un apakšdomēnus uz sasniedzamām versiju kontroles mapēm.
- Mēs nekavējoties bloķējam piekļuvi un pārejam uz izvietošanu ar pakotnēm bez versiju datiem.
- Mēs pārmeklējam vēsturi uz noslēpumiem un pavadām skarto piekļuvju nomaiņu.
- Mēs izvērtējam piekļuves žurnālus un dokumentējam, vai un kad dati tika atvērti.
Šie pasākumi ir daļa no mūsu PHP tīmekļa serveru nostiprināšanas.
Biežāk uzdotie jautājumi
Kā rodas publiska .git mape?
Parasti ar izvietošanu, izmantojot git clone vai git pull tieši tīmekļa saknē. Mape .git ar visu versiju vēsturi tad atrodas blakus index.php, un bez bloķēšanas tīmekļa serveris tās failus piegādā.
Vai pietiek izdzēst .git mapi?
Nākotnei jā, pagātnei nē. Ja mape bija sasniedzama, saturs jau varēja tikt nokopēts. Piekļuves dati, kas kādreiz bija repozitorijā, tāpēc jānomaina.
Vai palīdz piekļuves datus vēlāk izņemt no Git vēstures?
Tas novērš, ka jaunas kopijas tos satur. Kas repozitoriju jau ir atvēris, tam vecie stāvokļi joprojām ir. Izšķiroša ir piekļuves datu nomaiņa, ne tikai vēstures pārrakstīšana.
Vai tas attiecas arī uz citām versiju kontroles sistēmām?
Jā. Arī mapes, piemēram, .svn vai .hg, satur projekta datus, un tām nekad nevajadzētu būt sasniedzamām tīmekļa saknē. Vispārīga bloķēšana failiem un mapēm, kuru nosaukums sākas ar punktu, aptver visus šos gadījumus.