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.

Povezani članci