File kredensial atau soket manajemen OpenVPN: mana yang perlu diskrip
auth-user-pass menutup prompt akun; soket manajemen menutup keempatnya. Bandingkan paparan, biaya skrip, dan bagaimana masing-masing gagal di layanan.
Skrip yang menjalankan OpenVPN dan tidak pernah terhubung biasanya bukan masalah jaringan: klien sedang menunggu prompt tanpa terminal untuk menggambarnya. OpenVPN punya tepat dua cara yang didukung untuk menjawab prompt itu tanpa manusia, file kredensial di balik auth-user-pass dan soket manajemen, dan keduanya tidak bisa saling menggantikan. File itu berbiaya satu direktif dan menjawab satu prompt; soket menjawab setiap prompt dan memberi apa pun yang bisa membuka port loopback sebuah kanal kendali tanpa autentikasi. Mana yang cocok untuk penerapan Anda bergantung pada prompt mana yang benar-benar menghalangi, dan rahasia mana yang sanggup Anda biarkan diam.
Namai prompt-nya sebelum memilih mekanisme
Empat prompt tampak sama di terminal. Pasangan akun datang dari pengaturan PAM atau auth-user-pass-verify server dan dijawab oleh auth-user-pass. Frasa sandi kunci privat milik file kunci dan dibaca lewat --askpass atau diketik manual. Bundel PKCS#12 meminta kata sandinya sendiri. Autentikasi proxy memakai file auth yang diambil --http-proxy, bukan kredensial akun.
Saat OpenVPN berjalan sebagai anak systemd, PHP, atau Node tidak ada terminal, jadi salah satu dari ini memblokir diam-diam. Prosesnya diam di sana, log berhenti setelah baris cipher, dan unit akhirnya kehabisan waktu; keheningan itulah sebabnya orang menambahkan loop ulang atau sleep alih-alih melihat prompt mana yang tertunda. Hanya soket manajemen yang bisa menjawab keempatnya. File kredensial menjawab yang pertama dan tidak yang lain.
auth-user-pass: satu file, satu prompt
File itu menyimpan nama pengguna di baris satu dan kata sandi di baris dua, dan tidak ada yang lain: tanpa tanda kutip, tanpa nama kunci, tanpa komentar. Setel mode 600 dan jadikan pemiliknya akun yang menjalankan openvpn, yang untuk layanan sering kali pengguna khusus, bukan login Anda. File milik root di bawah /root adalah perbedaan antara perintah yang bekerja di shell Anda dan unit yang gagal saat boot.
Dua detail mengubah file yang benar menjadi prompt. Editor yang menyimpan CRLF meninggalkan carriage return yang menempel pada kata sandi, sehingga server menolak kata sandi yang di file tampak benar; periksa dengan cat -A atau od -c, bukan dengan mata. Dan auth-user-pass tanpa argumen di dalam profil berarti «tanyakan pengguna» menurut desain, yang mungkin tidak bisa ditimpa direktif kedua di baris perintah, karena profil diurai di tempat ia berada.
Urutan opsi adalah jebakan ketiga, dan bergantung versi. Beberapa build OpenVPN 2.4 mengabaikan --auth-user-pass saat muncul sebelum --config, sehingga dua opsi yang sama dalam urutan lain bisa terhubung. Letakkan direktif di dalam profil, atau setelah --config di baris perintah, dan grep profil untuk setiap kemunculan sebelum mengubah apa pun.
auth-nocache termasuk mekanisme ini tetapi tidak memasok apa pun. Ia membatasi berapa lama klien menyimpan kredensial di memori, yang membantu setelah crash dan sama sekali tidak membantu saat file hilang. Sambung ulang setelah timeout sesi di sisi server membaca ulang file, sehingga kredensial yang bekerja saat boot masih bisa kedaluwarsa di tengah hari.
Soket manajemen: setiap prompt, lebih banyak permukaan
Jalankan klien dengan listener dan nyatakan secara eksplisit bahwa prompt akan dilaporkan padanya, memakai direktif yang didokumentasikan di manual OpenVPN 2.6:
management 127.0.0.1 3030
management-query-passwords
Dari bash, tahan koneksi pada deskriptor file cadangan dan jawab berdasarkan nama prompt, bukan posisi, karena sambung ulang bisa bertanya dalam urutan berbeda:
exec 3<>/dev/tcp/127.0.0.1/3030
while read -r -u 3 line; do
case "$line" in
*"Need 'Auth' username/password"*)
echo 'username "Auth" alice' >&3
echo 'password "Auth" secret' >&3 ;;
*"Need 'Private Key' password"*)
echo 'password "Private Key" secret' >&3 ;;
esac
done
Batasnya adalah transport. Protokol manajemen adalah teks polos lewat TCP di loopback, jadi listener tidak boleh dipublikasikan pada alamat LAN atau tunnel agar pengendali jarak jauh bisa mencapainya; pengendali jarak jauh berarti penerusan SSH, bukan pengikatan yang lebih luas. Daemon komunitas juga menerima satu klien manajemen sekaligus, sehingga GUI atau monitor tidak bisa berbagi soket dengan skrip Anda. Koneksi kedua ditolak, bukan diantrekan, dan kegagalannya tampak seperti skrip yang tuli.
Soket itu juga kanal kendali. Tanpa kata sandi manajemen, apa pun yang bisa terhubung ke 127.0.0.1:3030 dapat membaca status, mematikan tunnel, atau menjawab prompt sendiri. Kata sandi manajemen dan file kredensial adalah rahasia kelas yang sama, dan keduanya pantas mendapat perhatian yang sama.
Mana yang cocok untuk penerapan
Pilih file kredensial bila satu-satunya prompt adalah pasangan akun, klien berjalan sebagai layanan dengan pemilik stabil, dan Anda bisa menjaga file 600 di luar cadangan yang tidak Anda kendalikan. Pilih soket manajemen bila frasa sandi kunci atau kata sandi PKCS#12 terlibat, bila pembungkus sudah mengawasi proses, atau bila Anda perlu memantau status dan prompt saat men-debug sambung ulang.
Dua kondisi menggeser keputusan. Jika pembungkusnya /bin/sh, unit systemd yang memanggil biner secara langsung, atau kontainer minimal, perekat soket khusus bash tidak tersedia dan file adalah jawaban yang lebih murah. Jika rahasianya sering berotasi, tidak ada file yang menjadi rumah baik untuknya: tanyakan keyring dari pembungkus kecil dan biarkan unit memanggil pembungkus itu, yang menjaga rotasi di satu tempat dan kata sandi di luar riwayat shell.
Substitusi proses berada di antara keduanya dan bukan milik keduanya. Satu baris di bawah bekerja karena bash mengembangkannya sebelum openvpn mulai, bukan karena klien memahami sintaksnya:
openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")
Ia rusak di bawah /bin/sh, dalam unit yang melewati shell, dan pada image tanpa bash atau /dev/fd. Simpan untuk pengujian interaktif, jangan pernah sebagai kontrak yang diandalkan layanan.
Lindungi rahasianya, lalu verifikasi dari log
Kedua mekanisme meninggalkan rahasia yang bisa dibaca proses OpenVPN. Jangan pernah menaruh kata sandi di baris perintah atau di file unit, tempat ps dan systemctl menunjukkannya ke setiap pengguna lokal; berikan path ke file, bukan nilai di dalamnya. Di tempat sertifikat dapat menggantikan pasangan akun, itu menghapus kategori prompt alih-alih menyembunyikannya.
Jalan yang benar memperlihatkan urutan prompt selesai dan sesi mencapai «Initialization Sequence Completed». Jika klien berhenti pada prompt yang sama, pencocokan gagal: cetak baris tepat yang dikirim soket, periksa kutipan dan nama prompt, dan perbaiki polanya alih-alih menambahkan sleep. Tunnel yang melaporkan sukses dan tidak membawa apa pun adalah masalah routing atau push, bukan kredensial.
Lalu uji sambung ulang, bukan hanya start pertama. Putuskan sesi di sisi server atau tunggu timeout-nya; klien bertanya lagi, dan di situlah file yang tampak benar saat boot menunjukkan apakah masih bisa dibaca oleh akun yang menyambung ulang.