Skript, mis käivitab OpenVPN-i ja ei ühendu kunagi, ei ole tavaliselt võrguprobleem: klient istub viiba juures, ilma terminali, millele seda joonistada. OpenVPN-il on täpselt kaks toetatud viisi sellele viibale ilma inimeseta vastata: volitusfail auth-user-pass-i taga ja haldussokkel, ning need ei ole omavahel vahetatavad. Fail maksab ühe direktiivi ja vastab ühele viibale; sokkel vastab igale viibale ja annab kõigele, mis suudab loopback-porti avada, autentimata juhtkanali. Kumb sinu juurutusse kuulub, sõltub sellest, milline viip tegelikult blokeerib, ja sellest, millist saladust saad endale lubada puhkeolekus jätta.

Nimeta viip enne mehhanismi valimist

Neli viipa näevad terminalis ühesugused välja. Konto paar tuleb serveri PAM-i või auth-user-pass-verify seadistusest ja sellele vastab auth-user-pass. Privaatvõtme paroolifraas kuulub võtmefaili juurde ja loetakse --askpass-i kaudu või trükitakse käsitsi. PKCS#12-pakett küsib oma parooli. Puhverserveri autentimine kasutab auth-faili, mille võtab --http-proxy, mitte konto volitusi.

Kui OpenVPN töötab systemd, PHP või Node'i lapsprotsessina, terminali pole, seega blokeerib igaüks neist vaikselt. Protsess istub seal, logi peatub pärast šifri rida ja üksus läheb lõpuks aegumisele; see vaikus on põhjus, miks inimesed lisavad korduskatse tsükli või sleepi, selle asemel et vaadata, milline viip ootab. Ainult haldussokkel suudab vastata kõigile neljale. Volitusfail vastab esimesele ja mitte millelegi muule.

auth-user-pass: üks fail, üks viip

Fail sisaldab kasutajanime esimesel real ja parooli teisel, ja mitte midagi muud: ilma jutumärkideta, ilma võtmenimede, ilma kommentaarita. Sea režiim 600 ja tee omanikuks konto, mis openvpn-i käivitab, mis teenuse puhul on sageli eraldi kasutaja, mitte sinu sisselogimine. Rootile kuuluv fail /rooti all on vahe käsul, mis töötab sinu shellis, ja üksusel, mis käivitamisel ebaõnnestub.

Kaks detaili muudavad korrektse faili viibaks. Redaktor, mis salvestab CRLF-i, jätab parooli külge kleepunud reavahetuse, nii et server lükkab tagasi parooli, mis failis õige välja näeb; kontrolli cat -A või od -c abil, mitte silmaga. Ja argumentideta auth-user-pass profiili sees tähendab disaini järgi «küsi kasutajalt», mida teine direktiiv käsureal ei pruugi üle kirjutada, sest profiili parsitakse seal, kus see asub.

Valikute järjekord on kolmas lõks ja see sõltub versioonist. Mõned OpenVPN 2.4 buildid eiravad --auth-user-pass-i, kui see on enne --config-i, nii et samad kaks valikut teises järjekorras ühenduvad. Pane direktiiv profiili sisse või käsureal --config-i järele ja grep-i profiilist iga esinemist enne, kui midagi muud muudad.

auth-nocache kuulub selle mehhanismi juurde, kuid ei anna midagi. See piirab, kui kaua klient volitusi mälus hoiab, mis aitab pärast krahhi ja üldse mitte siis, kui fail puudub. Ümberühendus pärast serveripoolset sessiooni aegumist loeb faili uuesti, nii et käivitamisel töötanud volitus võib keskpäeval aeguda.

Haldussokkel: iga viip, rohkem pinda

Käivita klient kuulajaga ja ütle selgesõnaliselt, et viibadest teatatakse sellel, kasutades direktiive, mis on dokumenteeritud OpenVPN 2.6 käsiraamatus:

management 127.0.0.1 3030
management-query-passwords

Bashist hoia ühendust varupõhisel failideskriptoril ja vasta viiba nime, mitte asukoha järgi, sest ümberühendus võib küsida teises järjekorras:

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

Piir on transport. Haldusprotokoll on tavatekst TCP peal loopbackil, seega ei tohi kuulajat avaldada LAN- ega tunneliaadressil, et kaugjuht saaks selleni; kaugjuht tähendab SSH edasisaatmist, mitte laiemat sidumist. Kogukonna deemon võtab vastu ka ühe halduskliendi korraga, seega GUI ega monitor ei saa sokklit sinu skriptiga jagada. Teine ühendus lükatakse tagasi, mitte järjekorda, ja rike näeb välja nagu kurdiks jäänud skript.

See sokkel on ka juhtkanal. Ilma haldusparoolita saab kõik, mis suudab ühenduda aadressile 127.0.0.1:3030, lugeda olekut, tappa tunnelit või ise viibale vastata. Haldusparool ja volitusfail on sama klassi saladus ja mõlemad väärib sama hoolt.

Milline juurutusele sobib

Vali volitusfail, kui ainus viip on konto paar, klient töötab teenusena stabiilse omanikuga ja saad hoida 600-faili väljaspool varukoopiaid, mida sa ei kontrolli. Vali haldussokkel, kui mängus on võtme paroolifraas või PKCS#12 parool, kui ümbris juba jälgib protsessi, või kui pead ümberühenduse silumise ajal jälgima olekut ja viipu.

Kaks tingimust liigutavad otsust. Kui ümbris on /bin/sh, systemd üksus, mis kutsub binaari otse, või minimaalne konteiner, siis bash-only sokli liim pole saadaval ja fail on odavam vastus. Kui saladus pöörleb sageli, ei ole kumbki fail sellele hea kodu: küsi väikesest ümbrisest võtmerõngast ja lase üksusel ümbrist kutsuda, mis hoiab pöörlemise ühes kohas ja parooli shelli ajaloost väljas.

Protsessi asendus seisab kahe vahel ja ei kuulu kummalelegi. Allolev üherealine töötab, sest bash laiendab seda enne, kui openvpn käivitub, mitte sellepärast, et klient süntaksist aru saab:

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

See katkeb /bin/sh all, shelli väldivas üksuses ja piltides, kus pole bash-i ega /dev/fd-d. Hoia seda interaktiivseks testimiseks, mitte kunagi lepinguks, millest teenus sõltub.

Kaitse saladust, seejärel kontrolli logist

Mõlemad mehhanismid jätavad saladuse OpenVPN-i protsessile loetavaks. Ära pane parooli kunagi käsureale ega üksuse faili, kus ps ja systemctl näitavad seda igale kohalikule kasutajale; edasta faili tee, mitte väärtus selle sees. Kus sertifikaadid saavad konto paari asendada, eemaldab see viiba kategooria, selle asemel et seda peita.

Korrektne käivitus näitab viipade jada lõppemist ja sessiooni jõudmist «Initialization Sequence Completed»-ini. Kui klient peatub sama viiba juures, siis vastendus ebaõnnestus: trüki täpsed read, mille sokkel saatis, kontrolli jutumärke ja viiba nime ning paranda muster, selle asemel et sleepi lisada. Tunnel, mis teatab edust ega kanna midagi, on marsruutimise või push-i probleem, mitte volituste oma.

Seejärel testi ümberühendust, mitte ainult esimest käivitust. Katkesta serveripoolne sessioon või oota selle aegumine; klient küsib uuesti ja just seal näitab käivitamisel korrektne tundunud fail, kas see on ümberühenduva konto jaoks veel loetav.

Seotud artiklid