Ograničite Subversion host na VPN korisnike uz Apache 2.4
ServerName bira virtualni host, ali ne ograničava ko se povezuje. Zahtijevajte VPN raspon i stvarnog korisnika repozitorija, pa dokažite oba odbijanja.
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.