Hook melaporkan keberhasilan, dan jalur yang sama masih tampak kosong dari shell. Kedua pernyataan bisa benar sekaligus, karena layanan systemd dapat hidup di ruang nama mount-nya sendiri dengan direktori sementara privat. Setelah itu dipahami, pertanyaan menariknya adalah apakah penulisan itu berhasil sama sekali.

Dua direktori sementara, satu jalur

Pengaturan isolasi memberi unit pandangan privat atas direktori sementara alih-alih membuatnya hanya-baca. Proses di luar unit tidak dapat melihat apa yang ditulisnya di sana, dan apa pun yang ditinggalkannya dibuang saat unit berhenti. Jadi jalur yang dicetak hook dan jalur yang diperiksa dari shell bisa merujuk ke objek berbeda dengan nama yang sama.

Ini masalah visibilitas, dan tampak seperti masalah kehilangan data. Tidak ada yang dihapus, karena file itu hanya berada di ruang nama yang bukan tempat shell menjadi anggota. Perintah yang sama berperilaku berbeda saat dijalankan di dalam unit, dan pengamatan itulah yang biasanya menyelesaikan perdebatan. Baca pengaturan unit sebelum menyimpulkan apa pun tentang penulisan.

Pisahkan tak terlihat dari tak dapat ditulis

Penulisan berhasil dan pembukaan gagal menghasilkan bukti yang berbeda, dan perbedaan itulah yang menentukan perbaikan. Jika hook mengatakan file sudah dibuat tetapi pembaca luar tidak menemukannya, Anda punya pertanyaan ruang nama. Jika hook melaporkan galat izin atau pembukaan gagal, file itu tidak pernah ditulis dan tidak ada perubahan ruang nama yang akan membantu.

systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-state

Jalur akar proses memperlihatkan pandangan sistem file milik layanan sendiri, tunduk pada pemeriksaan izin pada proses itu selama masih berjalan. Baca jurnal unit di sesi yang sama, karena galat penulisan dan file yang hilang mudah dicampur begitu seseorang sudah memutuskan penyebabnya.

Beri data bersama lokasi eksplisit

Data yang hanya dibutuhkan layanan berada di direktori sementara privatnya. Data yang harus dibaca proses lain memerlukan jalur yang ditentukan untuk keduanya, dengan pemilik, mode, dan kedaluwarsa yang dinyatakan. Putuskan mana dari keduanya yang Anda miliki sebelum menyunting unit. Sebagian besar insiden ini berasal dari memperlakukan file privat sebagai file bersama.

[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750

Direktori runtime menempatkan folder di bawah area runtime sistem, membuatnya untuk pengguna dan grup unit yang dikonfigurasi, dan menghapusnya saat unit berhenti. Tambahkan melalui drop-in agar unit paket tetap utuh, lalu muat ulang manajer dan mulai ulang instans itu, dengan menerima bahwa kliennya akan tersambung kembali.

Pertahankan direktori runtime apa pun yang sudah diperlukan unit terpasang. Mengganti daftar alih-alih menambahkannya adalah cara umum untuk merusak fitur tak terkait yang tidak dihubungkan siapa pun dengan perubahan itu.

Dua lapisan hak istimewa bisa tidak sepakat

Manajer layanan membuat direktori untuk pengguna unit yang dikonfigurasi, sedangkan daemon VPN dapat turun secara terpisah ke akunnya sendiri sebelum menjalankan hook koneksi. Itu lapisan yang berbeda, dan keduanya bisa menyebut identitas yang berbeda.

Direktori milik root dengan mode ketat sepenuhnya terlihat oleh daemon yang sudah melepaskan hak istimewanya, dan tetap tidak dapat ditulisi olehnya. Galatnya lalu terbaca sebagai masalah izin padahal jalur itu ada tepat di tempat yang Anda harapkan. Bandingkan pemilik direktori dengan identitas yang dilaporkan hook. Saat keduanya berbeda, mode tidak pernah menjadi pertanyaannya.

Periksa identitas yang benar-benar dipakai hook sebelum mengubah kepemilikan. Mengubah pengguna eksekusi layanan untuk memperbaiki direktori dapat mengubah akses perangkat dan hak istimewa jaringan di tempat lain, dan itu harga mahal untuk masalah kecil.

Verifikasi seluruh penyerahan

Pastikan empat hal sekaligus: hook menulis dengan identitas aslinya, pembaca yang dimaksud dapat mengonsumsi file, pengguna tak terkait tidak dapat, dan menghentikan unit membersihkan sebagaimana dirancang. Munculnya file di direktori sementara bersama milik host bukan persyaratan, dan biasanya itu tanda bahwa pertukaran tidak pernah mendapat jalurnya sendiri. Uji pembaca setelah mulai ulang, bukan hanya saat eksekusi pertama. Perilaku pembersihan adalah bagian dari desain, jadi amati alih-alih menganggapnya.

Keadaan persisten berada di tempat dengan masa hidup yang cocok, karena direktori runtime dimaksudkan untuk hilang. Pilih lokasi berdasarkan masa hidup, bukan berdasarkan kemudahan. Kebiasaan itu mencegah versi berikutnya dari penyelidikan yang sama.

Artikel terkait