OpenVPN дэгээ яагаад скриптийнхээ хажууд байгаа файлыг олж чадахгүй байна
Дэгээ доторх харьцангуй зам нь скрипт биш процессын хувьд шийдэгддэг. Тэдгээрийг __file__-оор бэхлээд, дараа нь зөвшөөрлийн өмнө нэрийн орон зай, таних тэмдгийг шалгаарай.
Алдаагүй ажиллаад мөртлөө файл алга гэж мэдээлдэг дэгээнүүд ихэвчлэн буруу газрыг хардаг, ажилдаа бүтэлгүйтдэггүй. Скрипт доторх харьцангуй замууд процессын ажлын хавтаст харьцуулан шийдэгддэг бөгөөд үйлчилгээ таны сонгоогүй ажлын хавтастай эхэлдэг. Скриптийн хажууд байгаа файл болон процессын нээдэг файл нь ямар нэгэн зүйл тэднийг бэхэлсэн үед л нэг зүйл болдог. Энэ зөрүү нь зөвшөөрлийн асуудал гэж буруу уншигддаг дэгээний алдааны ихэнхийг тайлбарладаг.
Зөвшөөрлийн өмнө замыг шалгаарай, учир нь буруу файл дээрх зөвшөөрлийн алдаа бас л буруу файл юм.
Харьцангуй зам файлд биш, процессд харьцуулан шийдэгддэг
Скрипт open("policy.json") дуудахад цөм нэрийг процессын одоогийн ажлын хавтаст харьцуулан шийддэг. Скриптийн өөрийн байрлалаас юу ч тэр хайлтад оролцохгүй. OpenVPN дэгээнүүдийг өөрөө сонгосон хавтаснаас эхлүүлдэг бөгөөд cd сонголт үүнийг өөрчилж болох тул өөрийн хавтсаас гараар туршсан скрипт демон ажиллуулахад өөрөөр ажилладаг. Гараар турших нь давдаг, үйлчилгээний ажиллагаа бүтэлгүйтдэг, бүртгэлийн мөр зөвхөн алга болсон нэрийг дурддаг.
Python скриптийн байрлалыг __file__ гэж ил гаргадаг бөгөөд яг үүнээс бэхлэх боломж үүсдэг. Path(__file__).resolve().parent / "policy.json" замыг процессоос биш файлаас бүтээдэг. Тэр нэг мөр нь эрх мэдэлд юу ч өөрчлөхгүйгээр ажлын хавтаснаас хамааралтай байдлыг арилгадаг.
Замыг зориуд бэхлээд, дараа нь resolve юу хийдгийг шалгаарай
resolve() симбол холбоосыг дагадаг тул дэгээг байранд нь холбосон суулгалт холбоосын зорилд бэхлэгддэг, холбоосыг агуулсан хавтаст биш. Энэ нь хувилбарласан байршуулалтад ихэвчлэн хүсдэг зүйл бөгөөд симбол холбоосын хажууд өгөгдөл хүлээдэг зохион байгуулалтад буруу юм. Байршуулалт аль нэгийг хэлж байгааг шийдэж, үйлдвэрлэлд зөрүүг олж мэдэхийн оронд кодоо түүнд тохируулан бичээрэй. Path(__file__).parent resolve() гүйгээр холбоосын өөрийн хавтсыг хадгалдаг.
Хэрэв өгөгдөл програмд биш, инстанцад хамаарах бол тохиргооноос абсолют зам ав. Байрлалыг хатуу кодлох нь дэгээг нэг хостын зохион байгуулалтад холбодог.
Дөрвөн хил хязгаарыг дараалан туулаарай
Ажлын хавтаснаас эхэл: нэгжийн WorkingDirectory, OpenVPN-ийн cd сонголт болон exec-ийн өмнө хавтсыг сольдог аливаа бүрхүүлийг харьцуул. Дараа нь шийдэгдсэн байрлалыг баталгаажуул, учир нь өөр байршуулалт дахь ижил нэртэй файл хайлтад хариулж алдааг нууж болно. Дараа нь файлын системийн харагдац ирнэ: chroot эсвэл үйлчилгээний mount нэрийн орон зай хостын абсолют замыг зүгээр л байхгүй болгож чадна. Хамгийн сүүлд нэвтрэх таних тэмдэг, энэ нь харагдахуйцаас тусдаа асуулт юм.
ProtectHome ба PrivateTmp өөр өөр байрлалыг нуудаг бөгөөд аль нь ч хостоос авсан хавтсын жагсаалтад харагдахгүй. Shell дотор root-д байгаа зам нэгжийн нэрийн орон зайд үл үзэгдэх байж болох тул үйлчилгээний гадна ижил командыг турших нь маш бага зүйл нотолдог.
Үйлчилгээг өргөтгөхгүйгээр хайлтыг зас
Замыг бэхлэх нь зөвхөн эхний хил хязгаарыг шийднэ. Энэ нь үйлчилгээний нуудаг хавтсыг ил гаргахгүй бөгөөд эрх мэдэлгүй бүртгэлд зөвхөн root-д зориулсан файлд нэвтрэх эрх өгөхгүй. script-security өсгөх нь OpenVPN аль скриптүүдийг ажиллуулахыг өөрчилдөг; харьцангуй нэр хаана шийдэгдэхэд ямар ч нөлөөгүй. Бүх үйлчилгээний ажлын хавтсыг солих нь асуудлаас өргөн, учир нь бусад бүх харьцангуй гэрчилгээ, бүртгэл эсвэл туслах зам хамт шилждэг.
Нарийн засварыг эрхэмлэ: скрипт дэх тодорхой зам, инстанцын өгөгдлийн тодорхой тохиргооны утга, дэгээ үнэхээр ажилладаг бүртгэлд тохирох файлын эзэмшил.
Хил хязгаарыг нэрлэсэн нотолгоог бүртгэ
Хэрэгтэй бүтэлгүйтлийн тайланд гурван зүйл байдаг: дэгээний оролдсон яг зам, үүнийг үүсгэсэн орчин, аль хил хязгаар татгалзсан. Файлын агуулгыг асгахгүйгээр шийдэгдсэн зам болон онцгой тохиолдлыг хэвлэ. Энэ гурвал буруу бэхэлгээг нуугдмал mount болон зөвшөөрлөөс татгалзахаас ялгадаг бөгөөд эдгээр нь гурван өөр засвар юм.
root терминалаас файлыг уншиж чадна гэсэн мэдэгдэл тэдгээр асуултын зөвхөн нэгэнд хариулдаг, бусад аль нэгэнд нь биш. Үүний оронд үйлчилгээний өөрийн орчноос туршаарай.