OpenVPN auth-user-pass: fajl, stdin jew talba? Kif tagħżel
Agħżel bejn it-talba tal-console, fajl ta’ kredenzjali, fluss u l-interfaċċa tal-ġestjoni, imbagħad sewwi l-iżbalji li jidhru biss bħala password ħażina.
Tliet affarijiet jiddeċiedu liema sors ta’ kredenzjali għandek tuża: jekk hemmx persuna bilqiegħda fil-console, jekk is-sigriet jistax jgħix fuq id-diska, u jekk proċess ieħor għandux iwieġeb it-talba. Jekk tagħżel ħażin, il-klijent jirrapporta problema ta’ stdin waqt li l-password hija perfettament valida, u dan jibgħat lil ħafna nies lejn is-server mingħajr raġuni. Agħżel it-triq l-ewwel; il-messaġġi tal-iżball jagħmlu sens biss meta tkun taf liema triq ġenerathom.
It-tliet kundizzjonijiet li jiddeċiedu dan
It-talba tal-console hija l-unika triq li teħtieġ persuna, għalhekk hija l-unika waħda li tfalli bil-kwiet f’unit systemd jew f’kontejner. Jekk persuna tibda l-klijent u tiddaħħal il-password, l-ebda fajl mhu involut u xejn sensittiv ma jiġi fuq id-diska. Jekk il-klijent jinbeda waqt il-boot, dik l-istess talba ssir sospensjoni, u l-timeout normalment jidher bħala falliment ġenerali tal-konnessjoni u mhux bħala żball tal-kredenzjali.
Fajl ta’ kredenzjali hija t-tweġiba t-tajba meta l-proċess jinbeda mingħajr sorveljanza u s-sigriet jista’ jgħix fuq id-diska taħt sett ta’ permessi kkontrollat. Meta s-sigriet ma jistax jinkiteb xejn - politika tal-kaxxafort biss, token ta’ żmien qasir - għandek bżonn fluss li l-klijent jista’ jiftaħ, li fil-prattika jfisser sostituzzjoni tal-proċess jew assistent li jikteb f’deskrittur tal-fajl. L-interfaċċa tal-ġestjoni tkopri r-raba’ każ: kontrollur li diġà jamministra ċ-ċiklu tal-ħajja tat-tunnel u jista’ jwieġeb mistoqsijiet permezz ta’ socket.
- Persuna fil-console, l-ebda awtomazzjoni: talba interattiva.
- Bidu mingħajr sorveljanza, is-sigriet jista’ jinħażen: fajl ta’ kredenzjali b’mod 0600.
- Bidu mingħajr sorveljanza, is-sigriet ma jistax jinħażen: sostituzzjoni tal-proċess jew fd li jinkiteb minn aġent tas-sigrieti.
- Proċess ieħor jippossjedi l-klijent: interfaċċa tal-ġestjoni.
Meta jaqblu żewġ tweġibiet, agħżel dik li żżomm is-sigriet barra minn argv u barra mill-istorja tas-shell. Password mgħoddi bħala argument tal-programm jista’ jinqara minn kull utent lokali permezz tal-lista tal-proċessi, u dik l-espożizzjoni hija diffiċli titħassar.
X’jagħmel fil-fatt kull triq tal-input
--auth-user-pass waħdu jitlob isem l-utent u password fil-console. Meta jingħata isem ta’ fajl, il-klijent jieħu l-ewwel linja bħala isem l-utent u t-tieni linja bħala password; xejn ma jappoġġja kwotazzjonijiet, kummenti jew sintassi ċavetta-valur. Dan huwa l-format kollu, għalhekk kull min jeditah bl-istennija ta’ fajl INI jkissru. Blokk <auth-user-pass> fil-linja jżomm l-istess żewġ linji fil-profil, li jġiegħel il-profil innifsu jsir sigriet u jqiegħdu fl-istess klassi ta’ trattament bħal ċavetta privata.
Iż-żewġt triqiet l-oħra huma fluss u socket. OpenVPN għandha bżonn biss deskrittur tal-fajl li jinqara, għalhekk taċċetta sostituzzjoni tal-proċess, entrata /dev/fd appoġġjata mill-pipe jew isem ta’ fajl li fil-verità huwa FIFO. L-interfaċċa tal-ġestjoni hija differenti fin-natura tagħha: il-klijent jitlob il-valuri mingħand proċess superviżur minflok ma jaqrahom hu. Dik id-differenza tgħodd meta terġa’ tikkonnettja: fajl ta’ kredenzjali, FIFO li assistent tas-sigrieti jista’ jerġa’ jikteb fih, u l-interfaċċa tal-ġestjoni jistgħu jerġgħu jfornu mingħajr persuna; is-sostituzzjoni tal-proċess ma tistax, għax id-deskrittur jiġi kkunsmat fl-ewwel qari.
Il-fajl irid ikun eżattament żewġ linji
Żewġ modi ta’ falliment ikopru ħafna mill-fajls tal-kredenzjali miksurin. Editur tal-Windows iħalli tmiem CRLF, ir-ritorn tal-carriage isir parti mill-password, u s-server jirrifjuta valur li jidher tajjeb fuq l-iskrin. It-tieni linja vojta - linja vojta fejn suppost tkun il-password - tħalli lill-klijent b’password vojta, li s-server jirrifjuta għalkemm il-valur fuq l-iskrin jidher tajjeb. Linja ġdida żejda wara l-password ma tagħmilx ħsara. Ikteb il-fajl mis-shell, mhux minn editur, u iċċekkja l-bytes:
install -m 600 /dev/null /etc/openvpn/client.creds
printf '%s\n%s\n' "$VPN_USER" "$VPN_PASS" > /etc/openvpn/client.creds
od -c /etc/openvpn/client.creds | head -3It-triq hija importanti daqs il-kontenut. Triq relattiva tiġi riżolta kontra d-direttorju tax-xogħol tal-proċess, li għal servizz rari jkun id-direttorju fejn ittestjajt. Uża triq assoluta, għamel il-fajl proprjetà tal-kont li jmexxi l-klijent, u żomm il-mod 0600 sabiex il-grupp u oħrajn ma jistgħux jaqrawh. Il-manwal tal-OpenVPN 2.6 jelenka l-forom aċċettati tad-direttiva; iċċekkjah qabel ma tivvinta t-tielet waħda.
Ittestja l-fajl qabel ma tagħti t-tort lis-server. Tmexxija ta’ openvpn --config client.ovpn --auth-user-pass /etc/openvpn/client.creds --verb 4 tipprintja jekk il-fajl infetaħx u, aktar tard, jekk il-kredenzjali ġewx aċċettati, li jgħidlek liema saff tbiddel wara.
Flussi, stdin u l-iżbalji li jipproduċu
L-għoti tal-password permezz ta’ pipe hija l-ewwel ħaġa li jippruvaw ħafna nies u t-triq bl-aktar sorpriżi. Is-sostituzzjoni tal-proċess taħdem għax il-klijent għandu bżonn biss deskrittur li jinqara: openvpn --config client.ovpn --verb 3 --auth-user-pass <(printf '%s\n%s\n' "$VPN_USER" "$VPN_PASS"). L-għoti ta’ /dev/stdin jaħdem biss meta stdin tkun għadha miftuħa u tinqara fil-mument li l-klijent jistaqsi, li mhux veru f’pipeline li diġà kkunsmatha.
ERROR: could not read Auth username from stdin għandha żewġ kawżi differenti. Fuq xi klijenti 2.3.x il-messaġġ ġie minn difett fit-trattament ta’ stdin li r-rilaxxi 2.3 aktar tard sewwew, għalhekk klijent daqshekk antik jitjieb biss billi jaġġorna. Fuq klijent kurrenti l-istess kliem ifisser li l-klijent talab input mill-console u stdin ma kinitx terminal - eżattament is-sitwazzjoni f’unit systemd, f’xogħol cron jew f’kontejner li nbeda mingħajr -t.
auth-nocache iżżid it-tielet linja li tidher bħal password miksur. Tarmi l-kredenzjali mill-memorja wara l-użu, għalhekk konnessjoni mill-ġdid ikkawżata minn bidla fin-netwerk ma jkollha xejn x’terġa’ tindaqq u t-talba terġa’ tidher. Dik hija d-direttiva li taħdem kif iddisinjata. auth-nocache tbiddel dak li l-klijent iżomm fil-memorja, mhux dak li s-server jew il-fornitur tal-identità jaħsbu dwar il-kont, għalhekk il-fejqan kollu huwa li jerġa’ jiġi fornut l-istess fajl, li jerġa’ jinqara mal-bidu mill-ġdid - u għal konnessjoni mmaniġġjata dak il-forniment għandu jiġi mill-maħżen tas-sigrieti approvat, mhux password fi skript.
L-interfaċċa tal-ġestjoni meta proċess ieħor jippossjedi t-talba
Kontrollur li diġà jissorvelja t-tunnel jista’ wkoll iwieġeb il-mistoqsijiet tiegħu. Ibda l-klijent b’--management 127.0.0.1 7505, aqra l-linji tal-istat, u oqgħod attent għal >PASSWORD:Need 'Auth' username/password. Il-kontrollur iwieġeb b’username "Auth" alice segwit minn password "Auth" ... fuq linji tal-kmand separati. It-token 'Auth' jirrepeti l-identifikatur mit-talba u jrid jaqbel, inkella t-tweġiba tiġi injorata u l-klijent jistenna.
L-ispiża hija magna tal-istat li issa hija tiegħek: ordni tal-konnessjonijiet, bidu mill-ġdid tal-klijent, u socket lokali li utenti oħra fuq il-host m’għandhomx jilħqu. Dak li tixtri huwa kredenzjali fornuta fil-ħin tal-eżekuzzjoni, mingħajr fajl fuq id-diska u mingħajr talba li tista’ tisospendi. Jekk xejn ieħor fl-istakk tiegħek diġà jitkellem dan il-protokoll, din it-triq iżżid komponent li jrid jiġi miżmum.
Fallimenti li jidhru bħal problemi tal-kredenzjali
Handshake TLS li qatt ma jitlesta, jew VERIFY ERROR: depth=0, error=certificate signature failure, hija problema ta’ fiduċja u sseħħ qabel ma jinqara kwalunkwe isem tal-utent. Klijent proto tcp indirizzat lejn listener UDP ifalli fl-istess post: il-pakketti qatt ma jaslu għall-fażi tal-awtentikazzjoni, għalhekk kull password tidher ħażina minħabba assoċjazzjoni. Żomm il-verifikazzjoni taċ-ċertifikat mixgħula qabel ma tintbagħat il-kredenzjali; talba familjari ma tgħid xejn dwar min jirċievi l-password. Iċċekkja l-katina taċ-ċertifikati, l-isem komuni u t-trasport qabel ma tmiss il-kredenzjali.
Bugs tas-shell fl-iskript li jassembla l-profil huma l-falsa traċċa l-oħra. Spazju nieqes ġewwa [ ! -f "$file" ] jipproduċi command not found, l-iskript jieqaf kmieni, il-profil qatt ma jerġa’ jinbena, u l-klijent jibda b’dak preċedenti. Dak l-iżball jappartjeni lis-shell, mhux lill-awtentikazzjoni, u kemm-il darba terġa’ tittajpja l-password ma jitħassar qatt.
Mhux kull talba f’dan il-fluss hija din il-kredenzjali. Frażi sigrieta taċ-ċavetta privata, login tal-proxy HTTP u password tas-servizz huma tliet sigrieti differenti mitluba fi fażijiet differenti, u frażi sigrieta taċ-ċavetta normalment tiġi trattata mill-klijent jew aġent u mhux minn auth-user-pass. Jekk it-talba tidher qabel ma s-sessjoni TLS tkun stabbilita, qed twieġeb il-mistoqsija żbaljata u l-ebda reset tal-kont ma jgħin. Ladarba t-talba żbaljata tiġi eskluża, il-verifiki li jifdal jibdew mill-aktar saff bikri:
- Aqra l-ewwel żball tal-protokoll, mhux l-aħħar linja tal-kredenzjali: TLS, imbagħad awtentikazzjoni, imbagħad push.
- Ikkonferma li l-fajl huwa żewġ linji, m’għandux ritorni tal-carriage u huwa referenzjat b’triq assoluta.
- Ikkonferma li l-profil u l-linja tal-kmand ma jaqblux dwar id-direttiva.
- Issepara "kredenzjali aċċettati" minn "it-traffiku jgħaddi" - ir-routing u d-DNS huma saff aktar tard.
Meta l-klijent jilħaq il-fażi push, waqaf milli tħares lejn il-kredenzjali u ibda aqra r-rotot u s-servers DNS li bagħat is-server. Dak hija l-problema li jmiss, u m’għandha x’taqsam xejn mal-password li għadek kemm sewwijt.