OpenVPN membaca kata sandi dari terminal, bukan dari stdin
Di mana OpenVPN sebenarnya membaca kata sandi, mengapa berkas di stdin gagal, dan tiga jalur masuk yang didukung untuk login berskrip di Linux dan macOS.
OpenVPN meminta nama pengguna dan kata sandi di terminal pengendali, dan berkas yang dialihkan ke masukan standar bukanlah terminal itu. Satu detail itulah yang menjelaskan skrip yang menggantung padahal kata sandinya ada di dalam pipa. Perintah diminta oleh klien dan pembacaan diambil dari perangkat terminal, jadi mengalihkan stdin tidak mengubah apa pun. Beri klien masukan lewat salah satu jalur masuknya yang terdokumentasi dan skrip yang sama akan terhubung pada percobaan pertama.
Tiga jalur mencakup hampir semua kasus, dan masing-masing gagal dengan caranya sendiri. Pilih menurut perintah yang benar-benar ditampilkan klien, bukan menurut opsi yang paling mudah diskrip.
Perintah tidak datang dari stdin
Saat OpenVPN membutuhkan kredensial ia membuka terminal pengendali dan membaca di sana. Itu sebabnya uji interaktif terlihat baik-baik saja sementara perintah yang sama di bawah cron atau berkas unit berdiam tanpa gerak dengan perintah tertulis di log yang tidak dilihat siapa pun. Sebagian build kembali ke masukan standar saat tidak ada terminal, dan ketidakcocokan itu lebih buruk daripada kegagalan keras karena menyembunyikan masalah sampai penerapan.
Periksa lingkungan sebelum menulis kode apa pun: jalankan klien di bawah pengguna yang sama, dengan stdin yang sama, seperti yang akan dilakukan penjadwal atau manajer layanan. Jika perintah tidak pernah muncul di log dan prosesnya tidak maju, ada sesuatu yang menunggu terminal yang tidak ada.
Jalur satu: berkas kredensial dua baris
Opsi autentikasi menerima sebuah jalur, dan berkasnya berisi tepat dua baris, nama pengguna lalu kata sandi, tanpa hal lain. Berikan jalurnya secara eksplisit alih-alih mengandalkan nama berkas bawaan, karena berkas kredensial nyasar di direktori kerja adalah cara akun yang salah akhirnya terpakai. Atur mode ke 0600 dan berikan kepemilikan kepada akun yang menjalankan klien.
Klien membaca berkas itu sekali saat mulai, jadi memutar kata sandi berarti menyalakan ulang prosesnya. Biasanya itulah perilaku yang Anda inginkan, dan itu tempatnya di runbook di samping prosedur pemutaran.
Jalur dua: askpass untuk frasa sandi kunci
Kunci privat yang dilindungi frasa sandi memunculkan perintah kedua yang berbeda, dan perintah itu punya jawaban berbasis berkas sendiri: opsi askpass membaca frasa sandi dari baris pertama sebuah berkas. Untuk terowongan berbasis SSH padanannya adalah program askpass yang dijalankan klien, yang keluaran standarnya menjadi rahasianya.
Tak satu pun bentuk menaruh rahasia di daftar argumen, dan keduanya membiarkannya ada sebagai berkas atau sebagai program yang mencetaknya. Perlindungannya adalah izin berkas dan kepemilikan proses, bukan kesamaran. Pembantu yang menggemakan string tertanam di kode adalah rahasia dengan langkah tambahan.
Jalur tiga: CLI milik klien portal
Klien perusahaan biasanya menyertakan titik masuk baris perintah yang menyambung ke portal bernama tanpa jendela apa pun, dan itulah jalur yang didukung. Di Linux klien GlobalProtect menyediakan operasi sambung dan impor sertifikat lewat CLI-nya, dan portal yang memakai autentikasi sertifikat membutuhkan langkah impor sebelum sambungan otomatis bisa bekerja. Pilih itu daripada ketukan tombol sintetis: Anda mendapat status keluar sungguhan, tanpa ketergantungan pada fokus jendela, dan bertahan saat layar terkunci.
Jika sambungan pertama masih membutuhkan manusia untuk menerima sertifikat, otomatisasinya belum selesai. Lakukan impor saat penyiapan dan catat sebagai prasyarat.
Saat alurnya membutuhkan pseudo-terminal
Urutan yang meminta kata sandi lalu kode sekali pakai tidak punya satu berkas untuk dibaca. Penggerak terminal seperti Expect adalah alat yang tepat karena ia menunggu tiap pola bergiliran, dan ia membutuhkan proses yang sudah dimulai sebelum bisa mencocokkan apa pun.
Dua kegagalan mendominasi. Skrip yang menunggu perintah tanpa menjalankan klien menunggu selamanya, dan Tcl bukan shell, jadi aritmetika shell yang ditulis di dalam blok expect tidak dievaluasi seperti cara membacanya. Biarkan tanda debug menyala saat Anda membangun pola, lalu matikan.
Rahasia yang bocor, dan tempat bersembunyinya
Apa pun yang diberikan sebagai argumen terlihat di daftar proses, jadi kredensial tempatnya di berkas atau di balik pembantu, tidak pernah di baris perintah. Kode sekali pakai habis menurut desain dan harus dibuat untuk tiap percobaan. Log kegagalan sering membawa nama pengguna dan kadang lebih, jadi sunting sebelum dikirim ke mana pun, dan jauhkan rahasia dari profilnya sendiri, karena berkas konfigurasi dengan kata sandi tertanam ditempel ke tiket dan repositori. Memutar akun lalu berarti memburu setiap salinan, dan itulah tepatnya biaya yang dihindari tata letak ini.
Audit jalur yang Anda pilih, lalu pasang ke berkas unit atau penjadwal yang benar-benar akan menjalankan klien. Terowongan hidup persis selama proses itu hidup.