Apache 2.4 ilə Subversion hostunu VPN istifadəçiləri ilə məhdudlaşdırın
ServerName virtual hostu seçir, kimin qoşulduğunu məhdudlaşdırmır. VPN diapazonunu və real repozitoriya istifadəçisini tələb edin, sonra hər iki imtinanı sübut edin.
Subversion virtual hostunu VPN ünvanına yönəltmək hansı saytın sorğuya cavab verdiyini dəyişir, kimin sorğu göndərə biləcəyini yox. Giriş yoxlaması sonra baş verir — URL-ə uyğun gələn bölmədəki qaydalara əsasən — və host adı heç vaxt bu qərara daxil olmur. Əgər yeganə dəyişikliyiniz ServerName idisə, repozitoriya dünənki kimi əlçatandır. Konfiqurasiyada iki ayrı suala cavab verilməlidir: hansı soket bağlantını qəbul etdi və sorğu hansı kimliyi daşıyırdı.
ServerName əslində nəyi müəyyən edir
Ada əsaslanan virtual hostinq Host başlığını ServerName və ServerAlias girişləri ilə müqayisə edir, bir host seçir və sorğunu həmin hosta həvalə edir. Bağlantının özü əvvəllər hosta deyil, serverə aid Listen soketi tərəfindən qəbul edilib. Buna görə də şəxsi görünən ad heç bir müdafiə təmin etmir: soketə çata bilən istənilən müştəri həmin Host başlığını göndərə bilər. Ad marşrutlaşdırma açarıdır, marşrutlaşdırma açarlarını isə çağıran seçir.
Xəritələnməni təxmin etmədən görə bilərsiniz. apachectl -S hər hostu, onun portunu və adlarını çap edir, ünvan üçün hansının standart olduğunu işarələyir.
RequireAll hər iki yoxlamanı məcburi edən konteynerdir
Apache 2.4 bir bölmənin Require direktivlərini gizli RequireAny içində bükür, yəni iki çılpaq direktiv onlardan birinin kifayət etdiyini bildirir. Konteyneri əlavə edin və məna tərsinə çevrilir:
<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 hər iki şərti tələb edir: tunel diapazonu daxilində mənbə ünvanı və repozitoriyanın qəbul etdiyi istifadəçi. Yalnız-VPN Subversion URL-i üçün bunu ifadə etməlidir. mod_authz_core sənədi konteyner qaydalarını sənədləşdirir. Bloku repozitoriya üçün mövcud Location daxilində saxlayın və artıq işləyən DAV direktivlərini yerində qoyun, çünki bu fraqment nə AuthType-u, nə parol faylını, nə də yol səviyyəsində avtorizasiyanı əvəz edir.
Mənbə yoxlaması mod_authz_host-dan gəlir, ona görə başqa bir şeyi sazlamadan əvvəl onun yükləndiyini təsdiqləyin: apachectl -M | grep authz_host.
Apache-nin qiymətləndirdiyi ünvan soket ünvanıdır
Require ip Apache-nin bağlantı üçün qeyd etdiyi ünvanla müqayisə edir, bu isə müştərinin sahib olduğunu düşündüyü ünvan deyil.
VPN ünvanlarını tərcüməsiz marşrutlaşdırdıqda Apache tunel ünvanını görür və 10.8.0.0/24 uyğun gəlir. Şlüz ünvanları tərcümə etdikdə Apache şlüzü görür və qayda səssizcə heç nəyə uyğun gəlmir; hostun qarşısında TLS-i sonlandıran yük balanslayıcısının arxasında da eyni şey olur. mod_remoteip bu hal üçün mövcuddur. RemoteIPHeader X-Forwarded-For balanslayıcı üçün RemoteIPTrustedProxy ilə birlikdə qeydə alınan ünvanı əvəz edir və yalnız bundan sonra diapazonun müqayisə edəcəyi bir şey olur.
İxtiyari yönləndirmə başlığına etibar etmək heç qayda olmamasından pisdir. İstənilən müştəri 10.8.0.9 ehtiva edən X-Forwarded-For göndərib etibarlı bir addıma heç bağlanmamış diapazon yoxlamasını ödəyə bilər.
Dinləyicini və repozitoriya siyasətini qat-qat tətbiq edin
Bind ayrı bir nəzarətdir və çox vaxt daha sadədir. Listen 10.8.0.1:443 hansı soketlərin mövcud olduğunu müəyyən edir və sorğu heç açılmamış soketdə host seçə bilməz. Qiyməti işəsalma sırasıdır: Apache başlayanda tunel interfeysi söndürsə, bind uğursuz olur və xidmət qalxmır. Onu unit sırası ilə cütləyin və ya tuneldən asılı olmayan ünvana bind edin.
Yol icazələri AuthzSVNAccessFile-da qalır. Sayt üçün etibarlı hesab layihə yoluna yazma icazəsi ilə eyni hüquq deyil və şəbəkə qaydası bunu dəyişmir.
Blok daxil edilmiş faylda olduqda bölmə birləşməsinə diqqət edin. Apache avtorizasiya konteynerlərini iç-içə bölmələr boyunca birləşdirir və ən konkret uyğun bölmə tələbi əlavə etmək əvəzinə əvəz edə bilər, ona görə /svn üzərindəki qayda daha dar bölmə öz qaydasını təyin edəndən sonra /svn/repo/trunk-a çatmaya bilər.
Bitmiş saymazdan əvvəl hər iki imtinanı sübut edin
Bir deyil, dörd sorğu sınayın. VPN daxilində etibarlı hesabla repozitoriya siyahısını almalısınız. VPN daxilində səhv parolla siyahı deyil, 401 almalısınız. VPN xaricindən etibarlı etimadnamələrlə 403 almalısınız və alternativ host adına edilən eyni ictimai sorğu da eyni şəkildə uğursuz olmalıdır.
Hər hal üçün bir əmr kifayətdir: curl -sI -u user:pass https://svn.example.com/svn/repo/, sonra status sətrini oxuyun. İşləyən halı real müştəri ilə də təkrarlayın, çünki svn info commit və yeniləmələrin istifadə edəcəyi DAV metodlarını sınaqdan keçirir.
Dörd nəticədən hər hansı biri nəzərdə tutduğunuz siyasətlə ziddiyyət təşkil edirsə, konfiqurasiya bitməyib və hostun adını dəyişmək bunu dəyişməyəcək.