In skript dat OpenVPN start en nea ferbynt is meastentiids gjin netwurkprobleem: de klant sit by in fraach sûnder terminal om dy op te tekenjen. OpenVPN hat krekt twa stipe manieren om dy fraach sûnder minske te beantwurdzjen, in oanmeldbestân efter auth-user-pass en de behearsokkel, en dy binne net útwikselber. It bestân kostet ien rjochtline en beantwurdet ien fraach; de sokkel beantwurdet elke fraach en jout alles wat in loopback-poarte iepenje kin in net-autentisearre kontrôlekanaal. Hokker fan de twa by jo útrulling heart, hinget ôf fan hokker fraach eins blokket, en fan hokker geheim jo it jo oanfiere kinne om rêstich te litten.

Nammje de fraach foardat jo in meganisme kieze

Fjouwer fragen sjogge der op in terminal itselde út. It akkountpear komt fan 'e PAM- of auth-user-pass-verify-ynstelling fan 'e tsjinner en wurdt beantwurde troch auth-user-pass. In wachtwurdsin fan in priveekaaien heart by it kaaibestân en wurdt lêzen fia --askpass of mei de hân yntype. In PKCS#12-bondel freget in eigen wachtwurd. Proxy-autentikaasje brûkt it auth-bestân dat --http-proxy nimt, net de akkountgegevens.

As OpenVPN as bern fan systemd, PHP of Node draait is der gjin terminal, dus elk fan dizze blokkearret stil. It proses sit dêr, it log stopet nei de sjifreregel en de ienheid rint úteinlik yn in tiidferrin; dy stilte is de reden dat minsken in werprobearloop of in sleep tafoegje ynstee fan te sjen hokker fraach wachtet. Allinnich de behearsokkel kin alle fjouwer beantwurdzje. It oanmeldbestân beantwurdet de earste en fierder neat.

auth-user-pass: ien bestân, ien fraach

It bestân hâldt de brûkersnamme op rigel ien en it wachtwurd op rigel twa, en fierder neat: gjin oanheltekens, gjin kaaibenen, gjin kommentaar. Set modus 600 en meitsje de eigner it akkount dat openvpn draait, wat foar in tsjinst faak in eigen brûker is ynstee fan jo oanmelding. In bestân dat fan root is ûnder /root is it ferskil tusken in opdracht dy't yn jo shell wurket en in ienheid dy't by it opstarten mislearret.

Twa details meitsje fan in korrekt bestân in fraach. In bewurker dy't CRLF bewarret lit in weromrin fan 'e wein oan it wachtwurd plakke, sadat de tsjinner in wachtwurd wegeret dat yn it bestân korrekt liket; kontrolearje mei cat -A of od -c ynstee fan mei it each. En in auth-user-pass sûnder argumint yn it profyl betsjut neffens ûntwerp «freegje de brûker», wat in twadde rjochtline op 'e opdrachtregel miskien net oerhearsket, om't it profyl dêr't it stiet parsed wurdt.

De folchoarder fan opsjes is de tredde falstrik, en dy is ferzje-ôfhinklik. Guon OpenVPN 2.4-builds negearje --auth-user-pass as it foar --config stiet, sadat deselde twa opsjes yn 'e oare folchoarder ferbine. Set de rjochtline yn it profyl, of nei --config op 'e opdrachtregel, en grep it profyl foar elk foarkommen foardat jo eat oars feroarje.

auth-nocache heart by dit meganisme mar leveret neat. It beheindet hoe lang't de klant de gegevens yn it ûnthâld hâldt, wat helpt nei in crash en hielendal net as it bestân mist. In werferbining nei in sesjetiidferrin oan 'e tsjinnerkant lêst it bestân wer, sadat gegevens dy't by it opstarten wurken noch midsdeis ferrinne kinne.

De behearsokkel: elke fraach, mear oerflak

Start de klant mei in lústerder en ferklearje eksplisyt dat fragen dêrop rapportearre wurde, mei de rjochtlinen dokumintearre yn it OpenVPN 2.6-hânboek:

management 127.0.0.1 3030
management-query-passwords

Hâld fanút bash de ferbining op in frije bestânbeskriuwer en beäntwurdzje op fraachnamme ynstee fan op posysje, om't in werferbining yn in oare folchoarder freegje kin:

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

De grins is it ferfier. It behearprotokol is iepen tekst oer TCP op loopback, dus de lústerder mei net op in LAN- of tunneladres publisearre wurde om in ôfstânsbestjoerder berikke te litten; in ôfstânsbestjoerder betsjut in SSH-oerstjoering, net in bredere bining. De mienskipdaemon akseptearret ek mar ien behearclient tagelyk, dus in GUI of in monitor kin de sokkel net diele mei jo skript. De twadde ferbining wurdt wegere, net yn 'e wachtrige set, en de flater liket op in skript dat dôf wurden is.

Dy sokkel is ek in kontrôlekanaal. Sûnder behearwachtwurd kin alles dat ferbine kin mei 127.0.0.1:3030 status lêze, de tunnel deadzje of sels in fraach beäntwurdzje. It behearwachtwurd en it oanmeldbestân binne deselde klasse geheim, en beide fertsjinje deselde soarch.

Hokker past by de útrulling

Kies it oanmeldbestân as de iennichste fraach it akkountpear is, de klant as tsjinst mei in stabile eigner draait, en jo in 600-bestân bûten backups hâlde kinne dy't jo net beheare. Kies de behearsokkel as in kaaipasfrase of in PKCS#12-wachtwurd yn it spul is, as de wrapper it proses al begeliedt, of as jo status en fragen besjen moatte by it debuggen fan in werferbining.

Twa betingsten ferpleatse it beslút. As de wrapper /bin/sh is, in systemd-ienheid dy't it binêre bestân direkt oanropt, of in minimale container, dan is de sokkel-lijm allinnich foar bash net beskikber en is it bestân it goedkeuriger antwurd. As it geheim faak rotearret, is gjin fan 'e bestannen in goed thús dêrfoar: freegje in kaaiering fan in lytse wrapper en lit de ienheid de wrapper oanroppe, wat rotaasje op ien plak hâldt en it wachtwurd bûten de shell-skiednis.

Prosesferfanging stiet tusken de twa en heart by gjinien. De ienrigel hjirûnder wurket om't bash it útwreidet foardat openvpn start, net om't de klant de syntaksis begrypt:

openvpn --config client.ovpn --auth-user-pass <(printf "%s
%s
" "$USER" "$PASS")

It brekt ûnder /bin/sh, yn in ienheid dy't de shell omslút, en yn bylden sûnder bash of /dev/fd. Hâld it foar ynteraktyf testen, nea as it kontrakt dêr't in tsjinst fan ôfhinklik is.

Beskermje it geheim, en ferifiearje dan út it log

Beide meganismen litte in geheim lêsber foar it OpenVPN-proses. Set it wachtwurd nea op 'e opdrachtregel of yn it ienheidsbestân, dêr't ps en systemctl it oan elke lokale brûker sjen litte; jout it paad nei it bestân, net de wearde der yn. Dêr't sertifikaten it akkountpear ferfange kinne, hellet dat de kategory fraach fuort ynstee fan dy te ferbergjen.

In korrekte run lit de fragensekwinsje foltôgje en de sesje «Initialization Sequence Completed» berikke. As de klant by deselde fraach stopet, is de oerienkomst mislearre: printsje de krekte rigels dy't de sokkel stjoerde, kontrolearje de oanheltekens en de fraachnamme, en reparearje it patroan ynstee fan in sleep ta te foegjen. In tunnel dy't sukses rapportearret en neat ferfiert is in routerings- of push-probleem, net in gegevensprobleem.

Test dan de werferbining, net allinnich it earste opstarten. Smyt de sesje oan 'e tsjinnerkant fuort of wachtje it tiidferrin ôf; de klant freget wer, en dêr lit in bestân dat by it opstarten korrekt like sjen oft it noch lêsber is foar it akkount dat wer ferbynt.

Relatearre artikelen