Usmjeravanje virtualnog hosta Subversion na VPN adresu mijenja koja stranica odgovara na zahtjev, a ne kome je dopušteno da ga pošalje. Provjera pristupa događa se kasnije, prema pravilima u odjeljku koji se poklopio s URL-om, i naziv hosta nikada ne ulazi u tu odluku. Ako je ServerName bila vaša jedina promjena, repozitorij je jednako dostupan kao jučer. U konfiguraciji treba odgovoriti na dva odvojena pitanja: koji je socket prihvatio vezu i koji je identitet nosio zahtjev.

Što ServerName zapravo odlučuje

Virtualno hostanje temeljeno na nazivu uspoređuje zaglavlje Host s unosima ServerName i ServerAlias, odabire jedan host i pušta ga da obradi zahtjev. Samu vezu ranije je prihvatio Listen socket koji pripada poslužitelju, a ne hostu. Zato naziv koji izgleda privatno ne pruža nikakvu zaštitu: svaki klijent koji dosegne socket može poslati to zaglavlje Host. Naziv je ključ usmjeravanja, a ključeve usmjeravanja bira pozivatelj.

Mapiranje možete vidjeti bez nagađanja. apachectl -S ispisuje svaki host, njegov port i nazive te označava koji je zadani za adresu.

RequireAll je spremnik koji obje provjere čini obveznima

Apache 2.4 zamata direktive Require jednog odjeljka u implicitni RequireAny, pa dvije gole direktive znače da je dovoljna bilo koja. Dodajte spremnik 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 uvjeta: izvornu adresu unutar raspona tunela i korisnika kojeg repozitorij prihvaća. To bi trebalo značiti samo-VPN za Subversion URL. Referenca za mod_authz_core dokumentira pravila spremnika. Ostavite blok unutar postojećeg Location za repozitorij i pustite DAV direktive koje već rade na mjestu, jer ovaj ulomak ne zamjenjuje ni AuthType ni datoteku zaporki ni autorizaciju na razini putanje.

Provjera izvora dolazi iz mod_authz_host, pa potvrdite da je učitan prije nego što bilo što drugo otklanjate: apachectl -M | grep authz_host.

Adresa koju Apache procjenjuje je adresa socketa

Require ip uspoređuje s adresom koju je Apache zabilježio za vezu, a to nije uvijek adresa za koju klijent misli da ju ima.

Kada VPN usmjerava svoje adrese bez prijevoda, Apache vidi adresu tunela i 10.8.0.0/24 se poklapa. Kada pristupnik prevodi, Apache vidi pristupnik i pravilo tiho ne odgovara ničemu; isto se događa iza balansera opterećenja koji završava TLS ispred hosta. Za taj slučaj postoji mod_remoteip. RemoteIPHeader X-Forwarded-For zajedno s RemoteIPTrustedProxy za balanser zamjenjuje zabilježenu adresu i tek tada raspon ima s čime se usporediti.

Vjerovati proizvoljnom zaglavlju prosljeđivanja gore je nego nemati nikakvo pravilo. Svaki klijent može poslati X-Forwarded-For sa 10.8.0.9 i zadovoljiti provjeru raspona koja nikada nije bila usidrena na pouzdan skok.

Složite slušatelja i politiku repozitorija

Vezivanje je odvojena kontrola i često jednostavnija. Listen 10.8.0.1:443 odlučuje koji socketi postoje, a zahtjev ne može odabrati host na socketu koji nikada nije otvoren. Cijena je redoslijed pokretanja: ako je sučelje tunela isključeno kad Apache kreće, vezivanje ne uspijeva i usluga se ne podiže. Uparite ga s redoslijedom jedinica ili se vežite na adresu koja postoji neovisno o tunelu.

Dozvole putanja ostaju u AuthzSVNAccessFile. Valjan račun za stranicu nije isto ovlaštenje kao pravo pisanja u putanju projekta, i mrežno pravilo to ne mijenja.

Pazite na spajanje odjeljaka kada blok stoji u uključenoj datoteci. Apache spaja spremnike autorizacije kroz ugniježđene odjeljke i najspecifičniji podudarni odjeljak može zamijeniti zahtjev umjesto da ga dopuni, pa pravilo na /svn možda neće dosegnuti /svn/repo/trunk kada uža sekcija definira svoje.

Dokažite oba odbijanja prije nego što to nazovete gotovim

Testirajte četiri zahtjeva, ne jedan. Unutar VPN-a s valjanim računom trebali biste dobiti popis repozitorija. Unutar VPN-a s pogrešnom zaporkom trebali biste dobiti 401 umjesto popisa. Izvan VPN-a s valjanim vjerodajnicama trebali biste dobiti 403, a isti javni zahtjev prema alternativnom nazivu hosta mora pasti na isti način.

Jedna naredba po slučaju dovoljna je: curl -sI -u user:pass https://svn.example.com/svn/repo/, zatim pročitajte statusni redak. Ponovite i radni slučaj kroz stvarnog klijenta, jer svn info uvježbava DAV metode koje će koristiti commit i ažuriranja.

Ako se bilo koji od četiri rezultata ne slaže s politikom koju ste namjeravali, konfiguracija nije dovršena, i preimenovanje hosta to neće promijeniti.

Povezani članci