Job berjalan saat login, log menunjukkan klien mulai berjalan, tetapi tunnel tidak pernah aktif. Atau tunnel aktif lalu hilang beberapa detik kemudian. Pada kedua kasus, property list kemungkinan besar sudah benar. launchd membuat dua janji saat menerima job: ia akan mengawasi sebuah proses, dan proses itu akan terus berjalan. VPN membutuhkan keduanya, dan berkas XML yang benar tidak menyediakan satu pun.

Property list yang valid bukan layanan yang berfungsi

plutil -lint memeriksa struktur. Perintah itu tidak dapat memberi tahu apakah biner ada, apakah argumen didukung oleh versi klien ini, atau apakah job dimulai dalam konteks tempat kredensial tersedia. Semua itu pertanyaan semantik, dan itulah penyebab sebagian besar kegagalan yang tampak seperti masalah launchd.

plutil -lint /Library/LaunchDaemons/com.example.vpn.plist
launchctl print system/com.example.vpn

Bacalah keluaran perintah kedua alih-alih menganggap job sudah dimuat. Perintah itu melaporkan status keluar terakhir dan apakah layanan berjalan, sehingga membedakan "tidak pernah dimulai" dari "dimulai lalu mati" sebelum Anda menyentuh profil.

Agent mewarisi sesi pengguna, daemon tidak

Dokumentasi launchd Apple memisahkan agent per pengguna dari daemon sistem. Agent berjalan dalam konteks pengguna yang login, dengan keychain dan lingkungan pengguna itu. Daemon berjalan tanpa sesi tersebut, dan memindahkan job ke direktori sistem tidak menciptakan kembali kredensial interaktif pengguna.

Perbedaan itulah yang menentukan desain. Jika koneksi memerlukan orang untuk login atau menyetujui prompt MFA, pengaturan yang didukung adalah job sesi pengguna yang berjalan setelah login. Jika koneksi harus bekerja tanpa ada yang login, klien membutuhkan identitas tanpa pengawasan yang disetujui, dengan proses pembaruan dan pencabutannya sendiri. Memilih baris yang salah menghasilkan job yang start dengan bersih lalu gagal pada langkah autentikasi pertama.

Jangan menutupi perbedaan itu dengan kata sandi di dalam array argumen atau dengan menonaktifkan pemeriksaan sertifikat. Keduanya mengubah persyaratan autentikasi menjadi rahasia permanen di berkas yang dapat dibaca, dan cara kedua berarti tunnel mengautentikasi apa pun yang menjawab.

Pengawasan hanya bekerja jika proses tetap di depan

Klien yang menjadikan dirinya daemon langsung mengembalikan kendali ke launchd, lalu pengawas mengawasi proses yang sudah berakhir. Tunnel mungkin masih aktif, tetapi launchd menganggap job gagal, dan kebijakan restart-nya akan melakukan sesuatu yang tidak Anda maksudkan.

Gunakan mode latar depan atau mode layanan yang didokumentasikan klien. Jika produk memiliki fitur startup sendiri yang didukung, fitur itu sudah tahu cara tetap di latar depan dan cara menyerahkan ke tumpukan jaringan; job khusus adalah desain terpisah, bukan peningkatan darinya.

Beri job label unik, executable yang dimaksud, dan array argumen yang disengaja. Array bukan baris perintah shell, jadi pipa dan pengalihan tidak berfungsi di sana, dan perilaku kutipan berbeda. Perintah yang berhasil di terminal administrator paling jauh hanyalah pemeriksaan awal.

Kredensial harus bekerja tanpa prompt

Operasi tanpa pengawasan memindahkan masalah kredensial, bukan menghilangkannya. Seseorang harus memiliki identitas itu, memutuskan berapa lama ia hidup, dan mendokumentasikan cara penggantiannya. Sertifikat tanpa pemantauan kedaluwarsa berubah menjadi gangguan yang punya tanggal di kalender.

Jauhkan rahasia dari argumen dan dari keluaran standar job. Jika klien mendukung pembacaan kredensial dari penyimpanan terproteksi, gunakan jalur itu, dan periksa apakah konteks eksekusi job dapat menjangkau penyimpanan tersebut. Daemon yang berjalan sebagai root biasanya tidak dapat membaca item keychain login, dan detail semacam ini hanya muncul dalam konteks sistem.

Tetapkan arti siap, lalu uji di sana

Peluncuran yang berhasil membuktikan proses sudah mulai. Itu tidak membuktikan jaringan aktif, gateway menerima identitas, atau aplikasi privat dapat dijangkau. Jika ada hal lain yang bergantung pada tunnel, ia membutuhkan sinyal kesiapan yang mencerminkan koneksi, bukan waktu mulai job.

Percobaan ulang harus dibatasi dan harus membedakan jaringan yang tidak ada dari kredensial yang ditolak. Menjalankan ulang pada setiap kegagalan tidak dapat memperbaiki sertifikat yang kedaluwarsa dan menghasilkan log penuh percobaan identik yang menyembunyikan yang sebenarnya.

Terima job dalam konteks tempat ia benar-benar akan berjalan: tanpa jaringan saat boot, login normal, bangun dari tidur, dan penghentian terkendali. Lalu catat label job, versi klien, dan revisi profil bersama-sama, agar orang berikutnya mewarisi layanan yang dapat dilacak, bukan berkas yang pernah berfungsi.

Artikel terkait