Subversion виртуалды хостты VPN мекенжайына бағыттау қай сайт сұранысқа жауап беретінін өзгертеді, ал кімнің оны жіберуге құқығы бар екенін емес. Қатынасты тексеру кейінірек, URL-ге сәйкес келген бөлімдегі ережелер бойынша жүреді, және хост атауы бұл шешімге ешқашан кірмейді. Егер ServerName сіздің жалғыз өзгерісіңіз болса, қойма кешегідей қолжетімді. Конфигурацияда екі бөлек сұраққа жауап беру керек: қай сокет қосылымды қабылдады және сұраныс қандай сәйкестік алып жүрді.

ServerName шын мәнінде нені шешеді

Атауға негізделген виртуалды хостинг Host тақырыбын ServerName және ServerAlias жазбаларымен салыстырады, бір хостты таңдайды және оған сұранысты өңдеуге мүмкіндік береді. Қосылымның өзін бұрын серверге тиесілі Listen сокеті қабылдаған, хостқа емес. Сондықтан жеке көрінетін атау ешқандай қорғаныс бермейді: сокетке жететін кез келген клиент сол Host тақырыбын жібере алады. Атау — маршруттау кілті, ал маршруттау кілттерін шақырушы таңдайды.

Сәйкестендіруді болжамсыз көруге болады. apachectl -S әр хостты, оның порты мен атауларын шығарады және мекенжай үшін қайсысы әдепкі екенін белгілейді.

RequireAll — екі тексеруді де міндетті ететін контейнер

Apache 2.4 бір бөлімнің Require директиваларын жасырын RequireAny ішіне орайды, сондықтан екі жалаң директива олардың біреуі жеткілікті дегенді білдіреді. Контейнерді қосыңыз, мағынасы керісінше болады:

<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 екі шартты талап етеді: туннель ауқымындағы бастау мекенжайы және қойма қабылдайтын пайдаланушы. Subversion URL үшін тек-VPN дегеніміз осы болуы керек. mod_authz_core анықтамасы контейнер ережелерін құжаттайды. Блокты қойманың бар Location ішінде қалдырыңыз және бұрыннан жұмыс істеп тұрған DAV директиваларын орнында қалдырыңыз, өйткені бұл үзінді не AuthType, не құпиясөз файлы, не жол деңгейіндегі авторизацияны алмастырмайды.

Бастау тексерісі mod_authz_host модулінен келеді, сондықтан басқа нәрсені жөндеуден бұрын оның жүктелгенін растаңыз: apachectl -M | grep authz_host.

Apache бағалайтын мекенжай — сокет мекенжайы

Require ip Apache қосылым үшін жазып алған мекенжаймен салыстырады, бұл клиент өзінде бар деп ойлайтын мекенжай бола бермейді.

VPN мекенжайларын аудармасыз маршруттағанда Apache туннель мекенжайын көреді және 10.8.0.0/24 сәйкес келеді. Шлюз аударғанда Apache шлюзді көреді және ереже үнсіз ештеңемен сәйкес келмейді; хосттың алдында TLS-ті аяқтайтын жүктеме теңгергішінің артында да солай болады. Сол жағдай үшін mod_remoteip бар. Теңгергіш үшін RemoteIPTrustedProxy-пен бірге RemoteIPHeader X-Forwarded-For жазылған мекенжайды алмастырады, сонда ғана ауқымның салыстыратын нәрсесі болады.

Еркін жіберу тақырыбына сену ешбір ереженің болмағанынан да нашар. Кез келген клиент 10.8.0.9 бар X-Forwarded-For жіберіп, сенімді секіріске ешқашан байланбаған ауқым тексерісін қанағаттандыра алады.

Тыңдаушыны және қойма саясатын қабаттаңыз

Байланыстыру жеке бақылау және көбіне қарапайымырақ. Listen 10.8.0.1:443 қандай сокеттер бар екенін шешеді, ал сұраныс ешқашан ашылмаған сокетте хост таңдай алмайды. Бағасы — іске қосу реті: егер Apache іске қосылғанда туннель интерфейсі өшірулі болса, байланыстыру сәтсіз аяқталады және қызмет көтерілмейді. Оны бірліктер ретімен жұптаңыз немесе туннельге тәуелсіз мекенжайға байлаңыз.

Жол рұқсаттары AuthzSVNAccessFile ішінде қалады. Сайт үшін жарамды тіркелгі жоба жолына жазу рұқсатымен бірдей емес, және желі ережесі мұны өзгертпейді.

Блок енгізілген файлда тұрғанда бөлімдердің бірігуіне назар аударыңыз. Apache авторизация контейнерлерін кірістірілген бөлімдер бойынша біріктіреді және ең нақты сәйкес бөлім талапты қосу емес, алмастыруы мүмкін, сондықтан /svn ережесі тар бөлім өзінікін анықтаған кезде /svn/repo/trunk-ке жетпеуі мүмкін.

Аяқталды деп айтпас бұрын екі бас тартуды дәлелдеңіз

Бір емес, төрт сұранысты сынаңыз. VPN ішінде жарамды тіркелгімен қойма тізімін алуыңыз керек. VPN ішінде қате құпиясөзбен тізім емес, 401 алуыңыз керек. VPN сыртынан жарамды тіркелу деректерімен 403 алуыңыз керек, және балама хост атауына қатысты сол жария сұраныс та дәл солай сәтсіз болуы тиіс.

Әр жағдайға бір команда жеткілікті: curl -sI -u user:pass https://svn.example.com/svn/repo/, содан кейін күй жолын оқыңыз. Жұмыс істеген жағдайды нақты клиент арқылы да қайталаңыз, өйткені svn info commit пен жаңартулар қолданатын DAV әдістерін жаттықтырады.

Егер төрт нәтиженің қайсысы болса да сіз көздеген саясатқа қайшы келсе, конфигурация аяқталмаған, және хосттың атын өзгерту мұны өзгертпейді.

Қатысты мақалалар