Fail kelayakan atau soket pengurusan OpenVPN: yang mana untuk diskrip
auth-user-pass meliputi gesaan akaun; soket pengurusan meliputi keempat-empatnya. Bandingkan pendedahan, kos skrip dan cara setiap satu gagal dalam perkhidmatan.
Skrip yang memulakan OpenVPN dan tidak pernah bersambung biasanya bukan masalah rangkaian: klien sedang menunggu gesaan tanpa terminal untuk melukisnya. OpenVPN mempunyai tepat dua cara yang disokong untuk menjawab gesaan itu tanpa manusia, fail kelayakan di sebalik auth-user-pass dan soket pengurusan, dan kedua-duanya tidak boleh saling menggantikan. Fail itu berharga satu arahan dan menjawab satu gesaan; soket menjawab setiap gesaan dan memberikan apa-apa yang boleh membuka port loopback saluran kawalan tanpa pengesahan. Yang mana sesuai dengan penggunaan anda bergantung pada gesaan mana yang benar-benar menghalang, dan rahsia mana yang anda mampu biarkan diam.
Namakan gesaan itu sebelum memilih mekanisme
Empat gesaan kelihatan sama pada terminal. Pasangan akaun datang dari tetapan PAM atau auth-user-pass-verify pelayan dan dijawab oleh auth-user-pass. Frasa laluan kunci persendirian milik fail kunci dan dibaca melalui --askpass atau ditaip dengan tangan. Ikatan PKCS#12 meminta kata laluannya sendiri. Pengesahan proksi menggunakan fail auth yang diambil --http-proxy, bukan kelayakan akaun.
Apabila OpenVPN berjalan sebagai anak systemd, PHP atau Node tiada terminal, jadi mana-mana daripada ini menyekat secara senyap. Proses itu duduk di situ, log berhenti selepas baris sifer, dan unit akhirnya tamat masa; kesenyapan itulah sebabnya orang menambah gelung cuba semula atau sleep bukannya melihat gesaan mana yang tertunda. Hanya soket pengurusan boleh menjawab keempat-empatnya. Fail kelayakan menjawab yang pertama dan tidak yang lain.
auth-user-pass: satu fail, satu gesaan
Fail itu menyimpan nama pengguna pada baris satu dan kata laluan pada baris dua, dan tiada yang lain: tanpa petikan, tanpa nama kunci, tanpa komen. Tetapkan mod 600 dan jadikan pemilik akaun yang menjalankan openvpn, yang bagi perkhidmatan selalunya pengguna khusus dan bukan log masuk anda. Fail milik root di bawah /root ialah perbezaan antara arahan yang berfungsi dalam shell anda dan unit yang gagal semasa but.
Dua butiran menjadikan fail yang betul sebagai gesaan. Editor yang menyimpan CRLF meninggalkan pemulangan kereta yang melekat pada kata laluan, jadi pelayan menolak kata laluan yang kelihatan betul dalam fail; semak dengan cat -A atau od -c, bukan dengan mata. Dan auth-user-pass tanpa argumen di dalam profil bermaksud «tanya pengguna» mengikut reka bentuk, yang mungkin tidak dapat diatasi oleh arahan kedua pada baris arahan, kerana profil dihuraikan di tempat ia berada.
Susunan pilihan ialah perangkap ketiga, dan ia bergantung pada versi. Sesetengah binaan OpenVPN 2.4 mengabaikan --auth-user-pass apabila ia muncul sebelum --config, jadi dua pilihan yang sama dalam susunan lain boleh bersambung. Letakkan arahan itu di dalam profil, atau selepas --config pada baris arahan, dan grep profil untuk setiap kemunculan sebelum mengubah apa-apa lagi.
auth-nocache tergolong dalam mekanisme ini tetapi tidak membekalkan apa-apa. Ia mengehadkan berapa lama klien menyimpan kelayakan dalam ingatan, yang membantu selepas ranap dan sama sekali tidak membantu apabila fail tiada. Sambungan semula selepas tamat masa sesi di sebelah pelayan membaca semula fail itu, jadi kelayakan yang berfungsi semasa but masih boleh luput di tengah hari.
Soket pengurusan: setiap gesaan, lebih banyak permukaan
Mulakan klien dengan pendengar dan nyatakan secara jelas bahawa gesaan akan dilaporkan padanya, menggunakan arahan yang didokumenkan dalam manual OpenVPN 2.6:
management 127.0.0.1 3030
management-query-passwords
Dari bash, pegang sambungan pada deskriptor fail simpanan dan jawab mengikut nama gesaan bukan kedudukan, kerana sambungan semula boleh bertanya dalam susunan yang berbeza:
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
Sempadan ialah pengangkutan. Protokol pengurusan ialah teks biasa melalui TCP pada loopback, jadi pendengar tidak boleh diterbitkan pada alamat LAN atau terowong supaya pengawal jauh dapat mencapainya; pengawal jauh bermaksud pemajuan SSH, bukan pengikatan yang lebih luas. Daemon komuniti juga menerima satu klien pengurusan pada satu masa, jadi GUI atau pemantau tidak boleh berkongsi soket dengan skrip anda. Sambungan kedua ditolak, bukan diletakkan dalam baris gilir, dan kegagalannya kelihatan seperti skrip yang menjadi pekak.
Soket itu juga saluran kawalan. Tanpa kata laluan pengurusan, apa-apa yang boleh bersambung ke 127.0.0.1:3030 boleh membaca status, membunuh terowong atau menjawab gesaan itu sendiri. Kata laluan pengurusan dan fail kelayakan ialah rahsia kelas yang sama, dan kedua-duanya wajar mendapat penjagaan yang sama.
Yang mana sesuai dengan penggunaan
Pilih fail kelayakan apabila satu-satunya gesaan ialah pasangan akaun, klien berjalan sebagai perkhidmatan dengan pemilik yang stabil, dan anda boleh menyimpan fail 600 di luar sandaran yang tidak anda kawal. Pilih soket pengurusan apabila frasa laluan kunci atau kata laluan PKCS#12 terlibat, apabila pembalut sudah menyelia proses itu, atau apabila anda perlu memerhati status dan gesaan semasa menyahpepijat sambungan semula.
Dua syarat menggerakkan keputusan. Jika pembalut ialah /bin/sh, unit systemd yang memanggil binari secara langsung, atau kontena minimum, gam soket khusus bash tidak tersedia dan fail itu ialah jawapan yang lebih murah. Jika rahsia kerap berputar, tiada fail menjadi rumah yang baik untuknya: tanyakan cincin kunci daripada pembalut kecil dan biarkan unit memanggil pembalut itu, yang menyimpan putaran di satu tempat dan kata laluan di luar sejarah shell.
Penggantian proses terletak di antara kedua-duanya dan bukan milik mana-mana. Satu baris di bawah berfungsi kerana bash mengembangkannya sebelum openvpn bermula, bukan kerana klien memahami sintaksnya:
openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")
Ia rosak di bawah /bin/sh, dalam unit yang memintas shell, dan dalam imej tanpa bash atau /dev/fd. Simpan untuk ujian interaktif, jangan sekali-kali sebagai kontrak yang bergantung pada perkhidmatan.
Lindungi rahsia itu, kemudian sahkan dari log
Kedua-dua mekanisme meninggalkan rahsia yang boleh dibaca oleh proses OpenVPN. Jangan sekali-kali meletakkan kata laluan pada baris arahan atau dalam fail unit, di mana ps dan systemctl menunjukkannya kepada setiap pengguna tempatan; berikan laluan ke fail, bukan nilai di dalamnya. Di tempat sijil boleh menggantikan pasangan akaun, itu menghapuskan kategori gesaan dan bukannya menyembunyikannya.
Larian yang betul menunjukkan urutan gesaan selesai dan sesi mencapai «Initialization Sequence Completed». Jika klien berhenti pada gesaan yang sama, padanan gagal: cetak baris tepat yang dihantar oleh soket, semak petikan dan nama gesaan, dan betulkan corak itu dan bukannya menambah sleep. Terowong yang melaporkan kejayaan dan tidak membawa apa-apa ialah masalah penghalaan atau push, bukan kelayakan.
Kemudian uji sambungan semula, bukan hanya permulaan pertama. Putuskan sesi di sebelah pelayan atau tunggu tamat masanya; klien bertanya lagi, dan di situlah fail yang kelihatan betul semasa but menunjukkan sama ada ia masih boleh dibaca oleh akaun yang bersambung semula.