Datoteka poverilnic ali krmilna vtičnica OpenVPN: kaj skriptirati
auth-user-pass pokriva poziv računa; krmilna vtičnica pokriva vse štiri. Primerjajte izpostavljenost, ceno skripta in kako vsak odpove v storitvi.
Skript, ki zažene OpenVPN in se nikoli ne poveže, običajno ni omrežna težava: odjemalec sedi pri pozivu brez terminala, na katerem bi ga izrisal. OpenVPN ima točno dva podprta načina, kako na ta poziv odgovoriti brez človeka, datoteko poverilnic za auth-user-pass in krmilno vtičnico, in nista zamenljiva. Datoteka stane eno direktivo in odgovori na en poziv; vtičnica odgovori na vsak poziv in vsemu, kar lahko odpre vrata loopback, da neavtentificiran krmilni kanal. Katera sodi v vašo namestitev, je odvisno od tega, kateri poziv dejansko blokira, in od tega, katero skrivnost si lahko privoščite pustiti pri miru.
Poziv poimenujte, preden izberete mehanizem
Štirje pozivi so na terminalu videti enako. Par za račun prihaja iz nastavitve PAM ali auth-user-pass-verify na strežniku in nanj odgovarja auth-user-pass. Geslo zasebnega ključa pripada datoteki ključa in se bere prek --askpass ali vpiše ročno. Paket PKCS#12 zahteva svoje geslo. Avtentikacija posrednika uporablja datoteko auth, ki jo prevzame --http-proxy, ne poverilnic računa.
Ko OpenVPN teče kot otrok sistema systemd, PHP ali Node, terminala ni, zato kateri koli od teh tiho blokira. Proces sedi tam, dnevnik se ustavi po vrstici šifre in enota na koncu poteče; ta tišina je razlog, da ljudje dodajo zanko ponovitev ali sleep, namesto da bi pogledali, kateri poziv čaka. Na vse štiri lahko odgovori samo krmilna vtičnica. Datoteka poverilnic odgovori na prvega in na nič drugega.
auth-user-pass: ena datoteka, en poziv
Datoteka vsebuje uporabniško ime v prvi vrstici in geslo v drugi, in nič drugega: brez narekovajev, brez imen ključev, brez komentarja. Nastavite način 600 in za lastnika določite račun, ki poganja openvpn, kar je pri storitvi pogosto namenski uporabnik in ne vaša prijava. Datoteka v lasti roota pod /root je razlika med ukazom, ki deluje v vaši lupini, in enoto, ki ob zagonu odpove.
Dve podrobnosti spremenita pravilno datoteko v poziv. Urejevalnik, ki shranjuje CRLF, pusti na geslo prilepljen povratek vozička, zato strežnik zavrne geslo, ki je v datoteki videti pravilno; preverite s cat -A ali od -c, ne z očesom. In auth-user-pass brez argumenta znotraj profila po zasnovi pomeni «vprašaj uporabnika», česar druga direktiva v ukazni vrstici morda ne preglasi, ker se profil razčleni tam, kjer je.
Vrstni red možnosti je tretja past in je odvisen od različice. Nekatere gradnje OpenVPN 2.4 ignorirajo --auth-user-pass, ko stoji pred --config, zato se isti dve možnosti v drugem vrstnem redu povežeta. Direktivo postavite v profil ali za --config v ukazni vrstici in pred kakršno koli drugo spremembo preglejte profil za vsako pojavitev.
auth-nocache pripada temu mehanizmu, a ne prinaša ničesar. Omejuje, kako dolgo odjemalec hrani poverilnice v pomnilniku, kar pomaga po sesutju in prav nič, ko datoteke ni. Ponovna povezava po poteku seje na strežniku znova prebere datoteko, zato lahko poverilnice, ki so delovale ob zagonu, vseeno potečejo sredi dneva.
Krmilna vtičnica: vsak poziv, več površine
Zaženite odjemalec s poslušalcem in izrecno navedite, da bodo pozivi poročani na njem, z direktivami, dokumentiranimi v priročniku OpenVPN 2.6:
management 127.0.0.1 3030
management-query-passwords
V bashu držite povezavo na prostem opisniku datoteke in odgovarjajte po imenu poziva, ne po položaju, ker lahko ponovna povezava vpraša v drugem vrstnem redu:
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
Meja je prenos. Krmilni protokol je golo besedilo prek TCP na loopbacku, zato poslušalca ne smete objaviti na naslovu LAN ali tunela, da bi ga dosegel oddaljeni krmilnik; oddaljeni krmilnik pomeni posredovanje SSH, ne širše vezave. Skupnostni demon sprejme tudi samo enega krmilnega odjemalca hkrati, zato si GUI ali monitor ne moreta deliti vtičnice z vašim skriptom. Druga povezava je zavrnjena, ne postavljena v vrsto, in napaka je videti kot skript, ki je oglušel.
Ta vtičnica je tudi krmilni kanal. Brez krmilnega gesla lahko vse, kar se lahko poveže na 127.0.0.1:3030, bere stanje, ubije tunel ali samo odgovori na poziv. Krmilno geslo in datoteka poverilnic sta skrivnosti istega razreda in obe si zaslužita enako skrb.
Katera ustreza namestitvi
Izberite datoteko poverilnic, ko je edini poziv par za račun, odjemalec teče kot storitev s stabilnim lastnikom in lahko datoteko 600 hranite zunaj varnostnih kopij, ki jih ne nadzorujete. Izberite krmilno vtičnico, ko gre za geslo ključa ali geslo PKCS#12, ko ovoj že nadzoruje proces, ali ko morate med razhroščevanjem ponovne povezave opazovati stanje in pozive.
Dva pogoja premakneta odločitev. Če je ovoj /bin/sh, enota systemd, ki kliče binarno datoteko neposredno, ali minimalni vsebnik, lepilo za vtičnico samo za bash ni na voljo in datoteka je cenejši odgovor. Če se skrivnost pogosto vrti, nobena datoteka zanjo ni dober dom: vprašajte za obesek za ključe iz majhnega ovoja in pustite enoti, da kliče ovoj, kar drži vrtenje na enem mestu in geslo zunaj zgodovine lupine.
Zamenjava procesov stoji med obema in ne pripada nobenemu. Spodnja enovrstičnica deluje, ker jo bash razširi, preden se openvpn zažene, ne zato, ker bi odjemalec razumel skladnjo:
openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")
Zlomi se pod /bin/sh, v enoti, ki obide lupino, in v podobah brez basha ali /dev/fd. Obdržite jo za interaktivno testiranje, nikoli kot pogodbo, od katere je odvisna storitev.
Zaščitite skrivnost, nato preverite iz dnevnika
Oba mehanizma pustita skrivnost, ki jo lahko prebere proces OpenVPN. Gesla nikoli ne postavljajte v ukazno vrstico ali v datoteko enote, kjer ga ps in systemctl pokažeta vsakemu lokalnemu uporabniku; posredujte pot do datoteke, ne vrednosti v njej. Kjer lahko potrdila nadomestijo par za račun, to odstrani kategorijo poziva, namesto da bi jo skrilo.
Pravilen zagon pokaže dokončanje zaporedja pozivov in sejo, ki doseže «Initialization Sequence Completed». Če se odjemalec ustavi pri istem pozivu, ujemanje ni uspelo: natisnite natančne vrstice, ki jih je poslala vtičnica, preverite narekovaje in ime poziva ter popravite vzorec, namesto da dodate sleep. Tunel, ki poroča o uspehu in ne prenaša ničesar, je težava usmerjanja ali push, ne poverilnic.
Nato preizkusite ponovno povezavo, ne le prvega zagona. Prekinite sejo na strani strežnika ali počakajte, da poteče; odjemalec vpraša znova in prav tam datoteka, ki je bila ob zagonu videti pravilna, pokaže, ali je še berljiva za račun, ki se znova povezuje.