Subversion-isäntä vain VPN-käyttäjille Apache 2.4:n avulla
ServerName valitsee virtuaali-isännän, mutta ei rajoita, kuka yhdistää. Vaadi VPN-alue ja todellinen tietovaraston käyttäjä ja todista sitten molemmat hylkäykset.
Subversion-virtuaali-isännän osoittaminen VPN-osoitteeseen muuttaa sitä, mikä sivusto vastaa pyyntöön, ei sitä, kuka saa lähettää sen. Pääsyn tarkistus tehdään myöhemmin URL-osoitetta vastanneen osion sääntöjen mukaan, eikä isännän nimi koskaan vaikuta siihen päätökseen. Jos ServerName oli ainoa muutoksesi, tietovarasto on täsmälleen yhtä tavoitettavissa kuin eilen. Asetuksissa on vastattava kahteen erilliseen kysymykseen: mikä socket vastaanotti yhteyden ja mitä identiteettiä pyyntö kantoi.
Mitä ServerName todella päättää
Nimeen perustuva virtuaali-isännöinti vertaa Host-otsaketta ServerName- ja ServerAlias-merkintöihin, valitsee yhden isännän ja antaa sen käsitellä pyynnön. Yhteyden otti aiemmin vastaan palvelimelle kuuluva Listen-socket, ei isäntä. Siksi yksityiseltä näyttävä nimi ei tarjoa mitään suojaa: mikä tahansa asiakas, joka pääsee socketiin, voi lähettää kyseisen Host-otsakkeen. Nimi on reititysavain, ja reititysavaimet valitsee kutsuja.
Voit nähdä kartoituksen arvaamatta. apachectl -S tulostaa jokaisen isännän, sen portin ja nimet sekä merkitsee, mikä on osoitteen oletus.
RequireAll on säiliö, joka tekee molemmista tarkistuksista pakollisia
Apache 2.4 käärii yhden osion Require-direktiivit implisiittiseen RequireAny-rakenteeseen, joten kaksi paljasta direktiiviä tarkoittaa, että kumpi tahansa riittää. Lisää säiliö, niin merkitys kääntyy:
<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 vaatii molemmat ehdot: lähdeosoitteen tunnelin alueelta ja käyttäjän, jonka tietovarasto hyväksyy. Sitä vain-VPN:n pitäisi tarkoittaa Subversion-URL-osoitteelle. mod_authz_core-viite dokumentoi säiliön säännöt. Jätä lohko tietovaraston olemassa olevaan Location-osaan ja jätä jo toimivat DAV-direktiivit paikoilleen, koska tämä katkelma ei korvaa AuthTypea, salasanatiedostoa eikä polkutason valtuutusta.
Lähdetarkistus tulee mod_authz_hostista, joten varmista ennen muuta virheenkorjausta, että se on ladattu: apachectl -M | grep authz_host.
Osoite, jonka Apache arvioi, on socketin osoite
Require ip vertaa osoitteeseen, jonka Apache tallensi yhteydelle, eikä se ole aina osoite, jonka asiakas uskoo itsellään olevan.
Kun VPN reitittää osoitteensa ilman käännöstä, Apache näkee tunnelin osoitteen ja 10.8.0.0/24 täsmää. Kun yhdyskäytävä kääntää, Apache näkee yhdyskäytävän eikä sääntö täsmää hiljaa mihinkään; sama tapahtuu kuormantasaimen takana, joka lopettaa TLS:n isännän edessä. Sitä tapausta varten on mod_remoteip. RemoteIPHeader X-Forwarded-For yhdessä kuormantasaimelle tarkoitetun RemoteIPTrustedProxy:n kanssa korvaa tallennetun osoitteen, ja vasta silloin alueella on jotain verrattavaa.
Mielivaltaiseen välitysotsakkeeseen luottaminen on pahempaa kuin se, ettei sääntöä ole lainkaan. Kuka tahansa asiakas voi lähettää X-Forwarded-For-otsakkeen, jossa on 10.8.0.9, ja täyttää aluetarkistuksen, jota ei koskaan ankkuroitu luotettuun hyppyyn.
Kerrosta kuuntelija ja tietovaraston käytäntö
Sidonta on erillinen hallinta ja usein yksinkertaisempi. Listen 10.8.0.1:443 päättää, mitkä socketit ovat olemassa, eikä pyyntö voi valita isäntää socketilta, jota ei koskaan avattu. Hinta on käynnistysjärjestys: jos tunnelin rajapinta on alhaalla Apachen käynnistyessä, sidonta epäonnistuu eikä palvelu nouse. Yhdistä se yksiköiden järjestykseen tai sido osoitteeseen, joka on olemassa tunnelista riippumatta.
Polkujen käyttöoikeudet pysyvät AuthzSVNAccessFile-tiedostossa. Sivuston kelvollinen tili ei ole sama valtuus kuin kirjoitusoikeus projektin polkuun, eikä verkkosääntö muuta sitä.
Varo osioiden yhdistämistä, kun lohko on sisällytetyssä tiedostossa. Apache yhdistää valtuutussäiliöt sisäkkäisten osioiden yli, ja tarkin vastaava osio voi korvata vaatimuksen sen sijaan että lisäisi siihen, joten /svn-polun sääntö ei välttämättä yllä /svn/repo/trunk-polulle, kun kapeampi osio määrittää omansa.
Todista molemmat hylkäykset ennen kuin sanot sen valmiiksi
Testaa neljä pyyntöä, älä yhtä. VPN:n sisällä kelvollisella tilillä sinun pitäisi saada tietovaraston luettelo. VPN:n sisällä väärällä salasanalla sinun pitäisi saada 401 luettelon sijaan. VPN:n ulkopuolelta kelvollisilla tunnuksilla sinun pitäisi saada 403, ja saman julkisen pyynnön vaihtoehtoiseen isäntänimeen on epäonnistuttava samalla tavalla.
Yksi komento tapausta kohden riittää: curl -sI -u user:pass https://svn.example.com/svn/repo/, lue sitten tilasarake. Toista toimiva tapaus myös oikealla asiakasohjelmalla, koska svn info harjoittaa DAV-menetelmiä, joita commitit ja päivitykset käyttävät.
Jos jokin neljästä tuloksesta on ristiriidassa aiotun käytännön kanssa, asetukset eivät ole valmiit, eikä isännän uudelleennimeäminen muuta sitä.