Usmjeravanje virtualnog hosta Subversion na VPN adresu mijenja koja stranica odgovara na zahtjev, ne kome je dopušteno da ga pošalje. Provjera pristupa događa se kasnije, prema pravilima u sekciji koja se poklopila s URL-om, i ime 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 socket je prihvatio vezu i koji identitet je nosio zahtjev.

Š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 zahtjev. 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 vidjeti bez nagađanja. apachectl -S ispisuje svaki host, njegov port i imena i označava koji je zadani za adresu.

RequireAll je kontejner koji obje provjere čini obaveznim

Apache 2.4 umotava Require direktive jedne sekcije u implicitni RequireAny, pa dvije 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 raspona tunela i korisnika kojeg repozitorij 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 repozitorij i ne dirajte DAV direktive koje već rade, jer ovaj fragment ne zamjenjuje ni AuthType ni datoteku lozinki ni autorizaciju na nivou putanje.

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

Adresa koju Apache procjenjuje je adresa socketa

Require ip poredi s adresom koju je Apache zabilježio za vezu, a to nije uvijek 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 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 čim da se poredi.

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 hop.

Složite slušalac 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 izabrati host na socketu koji nikada nije otvoren. Cijena je redoslijed pokretanja: ako je sučelje tunela isključeno kad Apache kreće, vezivanje ne uspije i usluga se ne podiže. Uparite ga s redoslijedom unita ili se vežite na adresu koja postoji nezavisno od tunela.

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 sekcija kada blok stoji u uključenoj datoteci. Apache spaja kontejnere autorizacije kroz ugniježđene sekcije i najspecifičnija podudarna sekcija može zamijeniti zahtjev umjesto 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 prije nego što kažete da je gotovo

Testirajte četiri zahtjeva, ne jedan. Unutar VPN-a s valjanim računom trebate dobiti popis repozitorija. Unutar VPN-a s pogrešnom lozinkom trebate dobiti 401, a ne popis. Izvan VPN-a s valjanim vjerodajnicama trebate dobiti 403, a isti javni zahtjev 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 statusni red. Ponovite i radni slučaj kroz stvarni klijent, jer svn info vježba 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 završena, i preimenovanje hosta to neće promijeniti.

Povezani članci