OpenVPN:n valtuustiedosto vai hallintapistoke: mitä skriptata
auth-user-pass kattaa tilin kehotteen; hallintapistoke kattaa kaikki neljä. Vertaa näkyvyyttä, skriptauksen kustannusta ja sitä, miten kumpikin epäonnistuu palvelussa.
Skripti, joka käynnistää OpenVPN:n eikä koskaan yhdistä, ei yleensä ole verkko-ongelma: asiakas istuu kehotteessa ilman päätettä, jolle sen piirtäisi. OpenVPN:llä on täsmälleen kaksi tuettua tapaa vastata tuohon kehotteeseen ilman ihmistä, valtuustiedosto auth-user-pass:n takana ja hallintapistoke, eivätkä ne ole keskenään vaihdettavissa. Tiedosto maksaa yhden direktiivin ja vastaa yhteen kehotteeseen; pistoke vastaa jokaiseen kehotteeseen ja antaa mille tahansa loopback-portin avaavalle taholle autentikoimattoman ohjauskanavan. Kumpi kuuluu käyttöönottoosi, riippuu siitä, mikä kehote tosiasiassa estää, ja siitä, minkä salaisuuden voit jättää lepoon.
Nimeä kehote ennen kuin valitset mekanismin
Neljä kehotetta näyttävät päätteellä samalta. Tilin pari tulee palvelimen PAM- tai auth-user-pass-verify-asetuksesta ja siihen vastaa auth-user-pass. Yksityisen avaimen salalause kuuluu avaintiedostoon ja luetaan --askpass:n kautta tai kirjoitetaan käsin. PKCS#12-nippu kysyy oman salasanansa. Välityspalvelimen tunnistus käyttää auth-tiedostoa, jonka --http-proxy ottaa, ei tilin tunnuksia.
Kun OpenVPN toimii systemd:n, PHP:n tai Noden lapsena, päätettä ei ole, joten mikä tahansa näistä estyy äänettömästi. Prosessi istuu siinä, loki pysähtyy salausrivin jälkeen ja yksikkö lopulta aikakatkaistaan; se hiljaisuus on syy siihen, että ihmiset lisäävät uudelleenyrityssilmukan tai sleepin sen sijaan, että katsoisivat mikä kehote odottaa. Vain hallintapistoke voi vastata kaikkiin neljään. Valtuustiedosto vastaa ensimmäiseen eikä mihinkään muuhun.
auth-user-pass: yksi tiedosto, yksi kehote
Tiedostossa on käyttäjänimi ensimmäisellä rivillä ja salasana toisella, eikä mitään muuta: ei lainausmerkkejä, ei avainten nimiä, ei kommenttia. Aseta tilaksi 600 ja tee omistajaksi tili, joka ajaa openvpn:ää, mikä palvelulla on usein erillinen käyttäjä eikä kirjautumisesi. Rootin omistama tiedosto /rootin alla on ero komennon, joka toimii kuoressasi, ja yksikön, joka epäonnistuu käynnistyksessä, välillä.
Kaksi yksityiskohtaa muuttaa oikean tiedoston kehotteeksi. CRLF:n tallentava editori jättää salasanaan kiinni jäävän vaununpalautuksen, joten palvelin hylkää salasanan, joka näyttää tiedostossa oikealta; tarkista cat -A:lla tai od -c:llä silmän sijaan. Ja argumentiton auth-user-pass profiilin sisällä tarkoittaa suunnittelun mukaan «kysy käyttäjältä», mitä komentorivin toinen direktiivi ei välttämättä ohita, koska profiili jäsennetään siinä missä se on.
Valintojen järjestys on kolmas ansa, ja se riippuu versiosta. Jotkin OpenVPN 2.4 -koonnokset jättävät --auth-user-pass:n huomiotta, kun se on ennen --config:ia, joten samat kaksi valintaa toisessa järjestyksessä yhdistävät. Laita direktiivi profiiliin tai komentorivillä --config:in jälkeen ja greppaa profiili jokaisen esiintymän varalta ennen kuin muutat mitään muuta.
auth-nocache kuuluu tähän mekanismiin mutta ei tarjoa mitään. Se rajoittaa, kuinka kauan asiakas pitää valtuuden muistissa, mikä auttaa kaatumisen jälkeen eikä lainkaan silloin, kun tiedosto puuttuu. Uudelleenyhdistäminen palvelinpuolen istunnon aikakatkaisun jälkeen lukee tiedoston uudelleen, joten käynnistyksessä toiminut valtuus voi silti vanhentua keskellä päivää.
Hallintapistoke: jokainen kehote, enemmän pinta-alaa
Käynnistä asiakas kuuntelijalla ja ilmoita nimenomaisesti, että kehotteet raportoidaan sillä, käyttäen direktiivejä, jotka on dokumentoitu OpenVPN 2.6 -käsikirjassa:
management 127.0.0.1 3030
management-query-passwords
Bashista pidä yhteys varalla olevalla tiedostokuvaajalla ja vastaa kehotteen nimellä etkä sijainnilla, koska uudelleenyhdistäminen voi kysyä eri järjestyksessä:
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
Raja on kuljetus. Hallintaprotokolla on selkokieltä TCP:n päällä loopbackilla, joten kuuntelijaa ei saa julkaista LAN- tai tunneliosoitteessa, jotta etäohjain tavoittaisi sen; etäohjain tarkoittaa SSH-edelleenohjausta, ei leveämpää sidontaa. Yhteisön daemon hyväksyy myös vain yhden hallinta-asiakkaan kerrallaan, joten GUI tai monitori ei voi jakaa pistoketta skriptisi kanssa. Toinen yhteys hylätään, ei jonoteta, ja vika näyttää skriptiltä, joka on kuuroutunut.
Tuo pistoke on myös ohjauskanava. Ilman hallintasalasanaa mikä tahansa, joka voi yhdistää osoitteeseen 127.0.0.1:3030, voi lukea tilan, tappaa tunnelin tai vastata itse kehotteeseen. Hallintasalasana ja valtuustiedosto ovat samaa salaisuusluokkaa, ja molemmat ansaitsevat saman huolenpidon.
Mikä sopii käyttöönottoon
Valitse valtuustiedosto, kun ainoa kehote on tilin pari, asiakas toimii palveluna vakaalla omistajalla ja voit pitää 600-tiedoston poissa varmuuskopioista, joita et hallitse. Valitse hallintapistoke, kun pelissä on avaimen salalause tai PKCS#12-salasana, kun kääre jo valvoo prosessia, tai kun sinun on seurattava tilaa ja kehotteita uudelleenyhdistämistä korjatessasi.
Kaksi ehtoa siirtää päätöstä. Jos kääre on /bin/sh, systemd-yksikkö, joka kutsuu binaaria suoraan, tai minimaalinen kontti, vain bashille tarkoitettu pistokeliima ei ole käytettävissä ja tiedosto on halvempi vastaus. Jos salaisuus vaihtuu usein, kumpikaan tiedosto ei ole sille hyvä koti: kysy avainrengasta pienestä kääreestä ja anna yksikön kutsua käärettä, mikä pitää vaihdon yhdessä paikassa ja salasanan poissa kuoren historiasta.
Prosessin korvaaminen on kahden välissä eikä kuulu kummallekaan. Alla oleva yhden rivin komento toimii, koska bash laajentaa sen ennen kuin openvpn käynnistyy, ei siksi, että asiakas ymmärtäisi syntaksin:
openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")
Se hajoaa /bin/sh:n alla, kuoren ohittavassa yksikössä ja levykuvissa ilman bashia tai /dev/fd:tä. Pidä se interaktiiviseen testaukseen, älä koskaan sopimuksena, josta palvelu riippuu.
Suojaa salaisuus ja varmista sitten lokista
Molemmat mekanismit jättävät salaisuuden OpenVPN-prosessin luettavaksi. Älä koskaan laita salasanaa komentoriville tai yksikön tiedostoon, jossa ps ja systemctl näyttävät sen jokaiselle paikalliselle käyttäjälle; välitä polku tiedostoon, ei sen sisällä olevaa arvoa. Missä varmenteet voivat korvata tilin parin, se poistaa kehoteluokan sen sijaan, että piilottaisi sen.
Oikea ajo näyttää kehotteiden sarjan täyttyvän ja istunnon saavuttavan «Initialization Sequence Completed». Jos asiakas pysähtyy samaan kehotteeseen, täsmäytys epäonnistui: tulosta ne tarkat rivit, jotka pistoke lähetti, tarkista lainausmerkit ja kehotteen nimi ja korjaa kuvio sen sijaan, että lisäisit sleepin. Tunneli, joka ilmoittaa onnistumisesta eikä kuljeta mitään, on reititys- tai push-ongelma, ei valtuusongelma.
Testaa sitten uudelleenyhdistäminen, älä vain ensimmäistä käynnistystä. Katkaise palvelinpuolen istunto tai odota sen aikakatkaisu; asiakas kysyy uudelleen, ja juuri siinä käynnistyksessä oikealta näyttänyt tiedosto näyttää, onko se yhä uudelleen yhdistävän tilin luettavissa.