Ograničite Subversion host na VPN korisnike uz Apache 2.4
ServerName bira virtuelni host, ali ne ograničava ko se povezuje. Zahtevajte VPN opseg i stvarnog korisnika repozitorijuma, pa dokažite oba odbijanja.
Usmeravanje virtuelnog hosta Subversion na VPN adresu menja to koja stranica odgovara na zahtev, a ne kome je dozvoljeno da ga pošalje. Provera pristupa se dešava kasnije, prema pravilima u sekciji koja se poklopila sa URL-om, i ime hosta nikada ne ulazi u tu odluku. Ako je ServerName bila vaša jedina izmena, repozitorijum je jednako dostupan kao juče. U konfiguraciji treba odgovoriti na dva odvojena pitanja: koji socket je prihvatio vezu i koji identitet je nosio zahtev.
Šta ServerName zapravo odlučuje
Virtuelni hosting zasnovan na imenu poredi Host zaglavlje sa unosima ServerName i ServerAlias, bira jedan host i pušta ga da obradi zahtev. Sama veza je ranije prihvaćena na Listen socketu koji pripada serveru, a ne hostu. Zato ime koje izgleda privatno ne pruža nikakvu zaštitu: svaki klijent koji dosegne socket može poslati to Host zaglavlje. Ime je ključ rutiranja, a ključeve rutiranja bira pozivalac.
Mapiranje možete videti bez nagađanja. apachectl -S ispisuje svaki host, njegov port i imena i označava koji je podrazumevani za adresu.
RequireAll je kontejner koji obe provere čini obaveznim
Apache 2.4 umotava Require direktive jedne sekcije u implicitni RequireAny, pa dve gole direktive znače da je dovoljna bilo koja. Dodajte kontejner i značenje se preokreće:
<Location /svn/repo>
AuthType Basic
AuthName "Subversion"
AuthBasicProvider file
AuthUserFile /etc/apache2/svn.htpasswd
<RequireAll>
Require ip 10.8.0.0/24
Require valid-user
</RequireAll>
</Location>RequireAll traži oba uslova: izvornu adresu unutar opsega tunela i korisnika kojeg repozitorijum prihvata. To bi trebalo da znači samo-VPN za Subversion URL. Referenca za mod_authz_core dokumentuje pravila kontejnera. Ostavite blok unutar postojećeg Location za repozitorijum i ne dirajte DAV direktive koje već rade, jer ovaj fragment ne zamenjuje ni AuthType ni datoteku lozinki ni autorizaciju na nivou putanje.
Provera izvora dolazi iz mod_authz_host, pa potvrdite da je učitan pre nego što bilo šta drugo debagujete: apachectl -M | grep authz_host.
Adresa koju Apache procenjuje je adresa socketa
Require ip poredi sa adresom koju je Apache zabeležio za vezu, a to nije uvek adresa za koju klijent misli da je ima.
Kada VPN rutira svoje adrese bez prevođenja, Apache vidi adresu tunela i 10.8.0.0/24 se poklapa. Kada gateway prevodi, Apache vidi gateway i pravilo tiho ne poklapa ništa; isto se dešava iza balansera opterećenja koji završava TLS ispred hosta. Za taj slučaj postoji mod_remoteip. RemoteIPHeader X-Forwarded-For zajedno sa RemoteIPTrustedProxy za balanser zamenjuje zabeleženu adresu i tek tada opseg ima s čim da se poredi.
Verovati proizvoljnom zaglavlju prosleđivanja gore je nego nemati nikakvo pravilo. Svaki klijent može poslati X-Forwarded-For sa 10.8.0.9 i zadovoljiti proveru opsega koja nikada nije bila usidrena na pouzdan skok.
Složite slušalac i politiku repozitorijuma
Vezivanje je odvojena kontrola i često jednostavnija. Listen 10.8.0.1:443 odlučuje koji socketi postoje, a zahtev ne može izabrati host na socketu koji nikada nije otvoren. Cena je redosled pokretanja: ako je interfejs tunela isključen kada Apache kreće, vezivanje ne uspeva i usluga se ne podiže. Uparite ga sa redosledom jedinica ili se vežite na adresu koja postoji nezavisno od tunela.
Dozvole putanje ostaju u AuthzSVNAccessFile. Valjan nalog za stranicu nije isto ovlašćenje kao pravo pisanja u putanju projekta, i mrežno pravilo to ne menja.
Pazite na spajanje sekcija kada blok stoji u uključenoj datoteci. Apache spaja kontejnere autorizacije kroz ugnježdene sekcije i najspecifičnija podudarna sekcija može zameniti zahtev umesto da ga dopuni, pa pravilo na /svn možda neće dosegnuti /svn/repo/trunk kada uža sekcija definiše svoje.
Dokažite oba odbijanja pre nego što kažete da je gotovo
Testirajte četiri zahteva, ne jedan. Unutar VPN-a sa valjanim nalogom treba da dobijete listu repozitorijuma. Unutar VPN-a sa pogrešnom lozinkom treba da dobijete 401, a ne listu. Izvan VPN-a sa valjanim akreditivima treba da dobijete 403, a isti javni zahtev prema alternativnom imenu hosta mora pasti na isti način.
Jedna komanda po slučaju je dovoljna: curl -sI -u user:pass https://svn.example.com/svn/repo/, zatim pročitajte statusnu liniju. Ponovite i radni slučaj kroz stvarni klijent, jer svn info vežba DAV metode koje će koristiti commit i ažuriranja.
Ako se bilo koji od četiri rezultata ne slaže sa politikom koju ste nameravali, konfiguracija nije završena, i preimenovanje hosta to neće promeniti.