Ograničite Subversion host na VPN korisnike uz Apache 2.4
ServerName odabire virtualni host, ali ne ograničava tko 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, 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.