OpenVPN qarmağı niyə skriptinin yanındakı faylı tapa bilmir
Qarmaqdakı nisbi yollar prosesə görə həll olunur, skriptə görə deyil. Onları __file__ ilə bərkidin, sonra icazələrdən əvvəl ad sahəsini və kimliyi yoxlayın.
Xətasız işləyib yenə də itkin fayl bildirən qarmaqlar adətən yanlış yerə baxır, işini yerinə yetirməməkdə deyil. Skriptdəki nisbi yollar prosesin iş qovluğuna görə həll olunur və xidmət sizin seçmədiyiniz iş qovluğu ilə başlayır. Skriptin yanındakı fayl ilə prosesin açdığı fayl yalnız nə isə onları bərkitdikdə eyni şey olur. Bu boşluq icazə problemi kimi səhv oxunan qarmaq uğursuzluqlarının böyük hissəsini izah edir.
Yolu icazələrdən əvvəl yoxlayın, çünki yanlış fayldakı icazə xətası yenə də yanlış fayldır.
Nisbi yol fayla görə deyil, prosesə görə həll olunur
Skript open("policy.json") çağırdıqda, nüvə adı prosesin cari iş qovluğuna görə həll edir. Skriptin öz yerinin heç bir hissəsi bu axtarışda iştirak etmir. OpenVPN qarmaqları özünün seçdiyi qovluqdan başladır və cd seçimi bunu dəyişə bilər, ona görə öz qovluğundan əl ilə sınaqdan keçirilmiş skript daemon onu işlətdikdə başqa cür davranır. Əl sınağı keçir, xidmətin işə salınması uğursuz olur və jurnal sətri yalnız itkin adı qeyd edir.
Python skriptin yerini __file__ kimi ortaya qoyur, bərkitməni mümkün edən də budur. Path(__file__).resolve().parent / "policy.json" fayldan, prosesdən deyil, yol qurur. Bu bir sətir imtiyazlarda heç nəyi dəyişmədən iş qovluğundan asılılığı aradan qaldırır.
Yolu qəsdən bərkidin, sonra resolve-un nə etdiyini yoxlayın
resolve() simvolik keçidlərə uyğun gedir, ona görə qarmağı yerinə bağlayan quraşdırma keçidin hədəfində, keçidi saxlayan qovluqda deyil, bərkidilir. Bu, versiyalı yerləşdirmə üçün adətən istədiyinizdir və simvolik keçidin yanında məlumat gözləyən düzüm üçün səhvdir. Yerləşdirmənin hansını nəzərdə tutduğuna qərar verin və fərqi istehsalda kəşf etmək yerinə kodu uyğun yazın. Path(__file__).parent, resolve() olmadan keçidin öz qovluğunu saxlayır.
Məlumat proqrama deyil, instansiyaya aiddirsə, konfiqurasiyadan mütləq yol götürün. Yeri koda bərkitmək qarmağı bir host düzümünə bağlayır.
Dörd sərhədi sıra ilə keçin
İş qovluğundan başlayın: bölmənin WorkingDirectory, OpenVPN-in cd seçimi və exec-dən əvvəl qovluğu dəyişən hər hansı sarğı ilə müqayisə edin. Sonra həll olunmuş yeri təsdiqləyin, çünki başqa yerləşdirmədə eyni adlı fayl axtarışa cavab verib səhvi gizlədə bilər. Bundan sonra fayl sistemi görünüşü gəlir: chroot və ya xidmətin mount ad sahəsi mütləq host yolunu sadəcə yox edə bilər. Ən sonda giriş kimliyi gəlir və bu, görünməkdən ayrı bir sualdır.
ProtectHome və PrivateTmp fərqli yerləri gizlədir və heç biri hostdan götürülmüş qovluq siyahısında görünmür. root üçün qabıqda mövcud olan yol bölmənin ad sahəsi daxilində görünməz ola bilər, buna görə eyni əmri xidmətdən kənarda sınamaq çox az şey sübut edir.
Axtarışı xidməti genişləndirmədən düzəldin
Yolu bərkitmək yalnız birinci sərhədi həll edir. Xidmətin gizlətdiyi qovluğu aşkara çıxarmır və imtiyazsız hesaba yalnız root üçün olan fayla giriş vermir. script-security səviyyəsinin artırılması OpenVPN-in hansı skriptləri işlədəcəyini dəyişir; nisbi adın harada həll olunduğuna heç bir təsir göstərmir. İş qovluğunu bütün xidmət üçün dəyişmək problemdən genişdir, çünki hər digər nisbi sertifikat, jurnal və ya köməkçi yol onunla birlikdə köçür.
Dar düzəlişə üstünlük verin: skriptdə deterministik yol, instansiya məlumatları üçün açıq konfiqurasiya dəyəri və fayl sahibliyinin qarmağın həqiqətən işlədiyi hesaba uyğun olması.
Sərhədi adlandıran sübut qeyd edin
Faydalı uğursuzluq hesabatı üç şeyi ehtiva edir: qarmağın cəhd etdiyi dəqiq yol, onu yaradan mühit və hansı sərhədin imtina etdiyi. Həll olunmuş yolu və istisnanı faylın məzmununu tökmədən çap edin. Bu üçlük yanlış bərkitməni gizli mountdan və icazə imtinasından ayırır, bunlar isə üç fərqli düzəlişdir.
root-un faylı terminaldan oxuya bilməsi iddiası o suallardan birinə cavab verir, digərlərindən heç birinə. Bunun yerinə xidmətin öz kontekstindən sınaq keçirin.