Cangkuk yang berjalan tanpa ralat tetapi masih melaporkan fail yang hilang biasanya melihat di tempat yang salah, bukan gagal dalam tugasnya. Laluan relatif dalam skrip diselesaikan terhadap direktori kerja proses, dan perkhidmatan bermula dengan direktori kerja yang anda tidak pilih. Fail di sebelah skrip dan fail yang dibuka oleh proses hanya sama apabila sesuatu menambatnya. Jurang itu menjelaskan sebahagian besar kegagalan cangkuk yang salah dibaca sebagai masalah kebenaran.

Semak laluan sebelum kebenaran, kerana ralat kebenaran pada fail yang salah masih fail yang salah.

Laluan relatif diselesaikan terhadap proses, bukan terhadap fail

Apabila skrip memanggil open("policy.json"), kernel menyelesaikan nama itu terhadap direktori kerja semasa proses. Tiada apa-apa daripada lokasi skrip itu sendiri yang menyertai carian itu. OpenVPN memulakan cangkuk dari direktori yang dipilihnya sendiri, dan pilihan cd boleh mengubahnya, jadi skrip yang diuji secara manual dari foldernya sendiri berkelakuan berbeza apabila daemon menjalankannya. Ujian manual lulus, larian perkhidmatan gagal, dan baris log hanya menyebut nama yang hilang.

Python mendedahkan lokasi skrip sebagai __file__, dan itulah yang membolehkan penambatan. Path(__file__).resolve().parent / "policy.json" membina laluan daripada fail dan bukan daripada proses. Satu baris itu menghapuskan kebergantungan pada direktori kerja tanpa mengubah apa-apa pada keistimewaan.

Tambatkan laluan secara sengaja, kemudian semak apa yang dilakukan resolve

resolve() mengikut pautan simbolik, jadi pemasangan yang memautkan cangkuk ke tempatnya menambat pada sasaran pautan, bukan pada direktori yang memegang pautan itu. Itu biasanya yang anda mahukan untuk penggunaan berversi, dan ia salah untuk susun atur yang menjangka data di sebelah pautan simbolik. Tentukan mana yang dimaksudkan oleh penggunaan, dan tulis kod yang sepadan daripada menemui perbezaannya dalam pengeluaran. Path(__file__).parent tanpa resolve() mengekalkan direktori pautan itu sendiri.

Jika data milik instans dan bukan program, ambil laluan mutlak daripada konfigurasi. Mengodkan lokasi secara keras mengikat cangkuk kepada satu susun atur hos.

Lalui empat sempadan mengikut urutan

Mulakan dengan direktori kerja: bandingkan WorkingDirectory, pilihan cd OpenVPN, dan mana-mana pembalut yang menukar direktori sebelum exec. Kemudian sahkan lokasi yang diselesaikan, kerana fail dengan nama serupa dalam penggunaan lain boleh menjawab carian dan menyembunyikan kesilapan. Seterusnya pandangan sistem fail: chroot atau ruang nama gunung perkhidmatan boleh menjadikan laluan hos mutlak benar-benar tiada. Akhir sekali identiti akses, yang merupakan persoalan berasingan daripada keterlihatan.

ProtectHome dan PrivateTmp menyembunyikan lokasi berbeza, dan kedua-duanya tidak muncul dalam senarai direktori yang diambil daripada hos. Laluan yang wujud untuk root dalam shell mungkin tidak kelihatan di dalam ruang nama unit, dan itulah sebabnya menguji arahan yang sama di luar perkhidmatan membuktikan begitu sedikit.

Betulkan carian tanpa meluaskan perkhidmatan

Menambat laluan hanya menyelesaikan sempadan pertama. Ia tidak mendedahkan direktori yang disembunyikan perkhidmatan, dan ia tidak memberi akaun tanpa keistimewaan akses kepada fail yang hanya untuk root. Menaikkan script-security mengubah skrip mana yang akan dijalankan oleh OpenVPN; ia tidak mempunyai kesan ke atas tempat nama relatif diselesaikan. Menukar direktori kerja untuk seluruh perkhidmatan lebih luas daripada masalah, kerana setiap laluan relatif sijil, log atau pembantu yang lain bergerak bersamanya.

Utamakan pembetulan sempit: laluan deterministik dalam skrip, nilai konfigurasi eksplisit untuk data instans, dan pemilikan fail yang sepadan dengan akaun yang cangkuk benar-benar berjalan di bawahnya.

Rekod bukti yang menamakan sempadan

Laporan kegagalan yang berguna mengandungi tiga perkara: laluan tepat yang dicuba cangkuk, persekitaran yang menghasilkannya, dan sempadan mana yang menolak. Cetak laluan yang diselesaikan dan pengecualian tanpa mencurahkan kandungan fail. Triniti itu memisahkan penambatan yang salah daripada gunung tersembunyi dan daripada penafian kebenaran, yang merupakan tiga pembetulan berbeza.

Dakwaan bahawa root boleh membaca fail dari terminal menjawab salah satu daripada soalan itu dan tidak satu pun daripada yang lain. Uji daripada konteks perkhidmatan itu sendiri.

Artikel berkaitan