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 аргуудыг дасгалжуулдаг.

Дөрвөн үр дүнгийн аль нэг нь таны зорьсон бодлоготой зөрүүтэй бол тохиргоо дуусаагүй бөгөөд хостын нэрийг өөрчлөх нь үүнийг өөрчлөхгүй.

Холбоотой нийтлэлүүд