Nasmerovanie virtuálneho hostiteľa Subversion na adresu VPN mení, ktorá stránka odpovie na požiadavku, nie to, kto ju smie odoslať. Kontrola prístupu prebieha neskôr, podľa pravidiel v sekcii, ktorá zodpovedala URL, a názov hostiteľa nikdy nevstupuje do tohto rozhodnutia. Ak bol ServerName vašou jedinou zmenou, repozitár je prístupný presne ako včera. V konfigurácii treba odpovedať na dve oddelené otázky: ktorý socket prijal spojenie a akú identitu niesla požiadavka.

Čo ServerName v skutočnosti rozhoduje

Virtuálny hosting založený na názve porovnáva hlavičku Host so záznamami ServerName a ServerAlias, vyberie jedného hostiteľa a nechá ho požiadavku spracovať. Samotné spojenie prijal skôr socket Listen, ktorý patrí serveru, nie hostiteľovi. Preto názov, ktorý vyzerá súkromne, neposkytuje žiadnu ochranu: každý klient, ktorý dosiahne socket, môže túto hlavičku Host odoslať. Názov je smerovací kľúč a smerovacie kľúče vyberá volajúci.

Mapovanie môžete vidieť bez hádania. apachectl -S vypíše každého hostiteľa, jeho port a názvy a označí, ktorý je pre adresu predvolený.

RequireAll je kontajner, ktorý robí obe kontroly povinnými

Apache 2.4 zabalí direktívy Require jednej sekcie do implicitného RequireAny, takže dve holé direktívy znamenajú, že stačí ktorákoľvek z nich. Pridajte kontajner a význam sa obráti:

<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 vyžaduje obe podmienky: zdrojovú adresu v rozsahu tunela a používateľa, ktorého repozitár akceptuje. To by malo znamenať iba-VPN pre URL Subversion. Referencia mod_authz_core dokumentuje pravidlá kontajnera. Nechajte blok v existujúcom Location pre repozitár a ponechajte na mieste direktívy DAV, ktoré už fungujú, pretože tento fragment nenahrádza ani AuthType, ani súbor hesiel, ani autorizáciu na úrovni cesty.

Test zdroja pochádza z mod_authz_host, preto pred ladením čohokoľvek iného potvrďte, že je načítaný: apachectl -M | grep authz_host.

Adresa, ktorú Apache vyhodnocuje, je adresa socketu

Require ip porovnáva s adresou, ktorú Apache zaznamenal pre spojenie, a to nie je vždy adresa, o ktorej si klient myslí, že ju má.

Keď VPN smeruje svoje adresy bez prekladu, Apache vidí adresu tunela a 10.8.0.0/24 zodpovedá. Keď brána prekladá, Apache vidí bránu a pravidlo potichu nezodpovedá ničomu; to isté sa deje za vyvažovačom, ktorý ukončuje TLS pred hostiteľom. Pre tento prípad existuje mod_remoteip. RemoteIPHeader X-Forwarded-For spolu s RemoteIPTrustedProxy pre vyvažovač nahrádza zaznamenanú adresu a až potom má rozsah s čím porovnávať.

Dôverovať ľubovoľnej preposielacej hlavičke je horšie ako nemť žiadne pravidlo. Každý klient môže odoslať X-Forwarded-For s 10.8.0.9 a splniť kontrolu rozsahu, ktorá nikdy nebola ukotvená k dôveryhodnému skoku.

Vrstvite poslucháč a politiku repozitára

Väzba je samostatná kontrola a často tá jednoduchšia. Listen 10.8.0.1:443 rozhoduje, ktoré sockety existujú, a požiadavka nemôže vybrať hostiteľa na sockete, ktorý nebol nikdy otvorený. Cenou je poradie spúšťania: ak je rozhranie tunela pri štarte Apache vypnuté, väzba zlyhá a služba nenabehne. Spárujte ju s poradím jednotiek alebo ju naviažte na adresu, ktorá existuje nezávisle od tunela.

Oprávnenia cesty zostávajú v AuthzSVNAccessFile. Platný účet pre stránku nie je to isté oprávnenie ako zápis do cesty projektu a sieťové pravidlo to nemení.

Sledujte zlučovanie sekcií, keď blok leží vo vloženom súbore. Apache zlučuje autorizačné kontajnery cez vnorené sekcie a najšpecifickejšia zodpovedajúca sekcia môže požiadavku nahradiť namiesto toho, aby ju doplnila, takže pravidlo na /svn sa nemusí dostať na /svn/repo/trunk, keď užšia sekcia definuje svoje.

Preukážte obe odmietnutia, kým to označíte za hotové

Otestujte štyri požiadavky, nie jednu. Vo vnútri VPN s platným účtom by ste mali dostať výpis repozitára. Vo vnútri VPN s nesprávnym heslom by ste mali dostať 401 namiesto výpisu. Zvonku VPN s platnými údajmi by ste mali dostať 403 a tá istá verejná požiadavka na alternatívny názov hostiteľa musí zlyhať rovnako.

Jeden príkaz na prípad stačí: curl -sI -u user:pass https://svn.example.com/svn/repo/, potom prečítajte stavový riadok. Zopakujte aj fungujúci prípad skutočným klientom, pretože svn info precvičuje metódy DAV, ktoré budú používať commity a aktualizácie.

Ak ktorýkoľvek zo štyroch výsledkov nezodpovedá zamýšľanej politike, konfigurácia nie je hotová a premenovanie hostiteľa to nezmení.

Súvisiace články