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

Aiheeseen liittyvät artikkelit