OpenVPN ei leia ca.crt-d, kuigi profiil laaditakse
Profiili tee ei ole selles olevate failide baas. Vaadake, miks absoluutne --config ikka ca.crt juures ebaõnnestub ja kuidas käivitamine otsuse teeb.
Teenus käivitub, loeb profiili nurisemata ja sureb seejärel real, mis tundub seosetu: ta ei saa avada ca.crt. Sertifikaadi juures pole midagi muutunud ja profiili tee unit-failis on absoluutne. Just see kombinatsioon on vihje. Edastatud tee paigutab ühe faili, ja selle faili sees olevad nimed lahendatakse hoopis mujal, nii et täiesti kvalifitseeritud näiv käivitus võib ikkagi lugeda oma võtmeid kataloogist, mida keegi ei kavatsenud.
Tõrkel on vähe põhjusi ja need tasub järjekorras eraldada: baaskataloog, mis protsessil tegelikult oli, teenuse käivituskontekst ning õigused või sandbox faili ümber, kui tee on juba õige. Igaüks jätab erineva jälje — unit-failis, protsessis ja failisüsteemis.
Profiili tee ei ole baaskataloog
Kujutage ette protsessi, mis algab /tmp ja saab /etc/vpn/prod/tenant-a.ovpn. Selle profiili sees nimetab rida ca ca.crt suhtelist teed. Miski profiili leidnud argumendis ei kirjuta seda nime ümber, seega otsib protsess /tmp/ca.crt ja teatab puuduvast failist.
Segadust tekitab vigade järjekord. OpenVPN sõelub kõigepealt konfiguratsiooni ja avab viidatud failid nendeni jõudes, nii et profiili kirjaviga teatatakse enne, kui ühtegi võtit puudutatakse, samas kui puuduv sertifikaat ilmub alles siis, kui sõelumine nii kaugele jõuab. Laadiv profiil on seega tõend süntaksi korrasolekust, mitte sellest, et selles nimetatud failid leiti.
Mida käsiraamat eristab: --config ja --cd
OpenVPN 2.6 käsiraamat kirjeldab kahte erinevat valikut. Üks laadib konfiguratsioonifaili. Teine muudab protsessi kataloogi enne, kui konfiguratsioon, võti, skript ja muud failid loetakse, ning nõuab absoluutset kataloogi ilma viiteta praegusele.
openvpn --cd /etc/vpn/prod --config tenant-a.ovpn
See kutse on vorm, mitte juhis käivitada kellegi teise profiil. Mida see annab, on determinism: iga suhtelise nime baas ahelas on öeldud käsus, mitte päritud kestast või haldurist, mis protsessi käivitas. Alternatiiv on sama kehtiv ja teenuse jaoks sageli parem: jätke töökataloog rahule ja tehke iga viidatud fail profiili sees absoluutseks.
Mida iganes te valite, kontrollige kogu ahelat, mitte esimest tõrget. Profiil võib kaasa tõmmata teise konfiguratsioonifaili ja kaasatud faili suhtelised nimed lahendatakse sama protsessi kataloogi, mitte neid kaasanud faili kataloogi suhtes. Logiteed, autentimisfailid ja abiskriptid järgivad sama reeglit.
Teenus algab mujal
Interaktiivne kest profiili kataloogis ei tõesta pakendatud unit-faili kohta midagi. Haldurid määravad oma töökataloogi ja mähiskript võib seda enne binaarfaili käivitumist uuesti muuta. Tõrkuv unit on ainus käivitus, mille üle on mõtet arutleda.
systemctl show -p WorkingDirectory -p ExecStart --value openvpn@tenant-a
ls -l /proc/$(pgrep -n openvpn)/cwd
Teine käsk näitab kataloogi, mida elav protsess tegelikult hoiab, ja see on usaldusväärsem kui unit-fail, kui mähis on mängus. Kui need kaks ei ühti, on vastus mähis ja unit-fail on eksitav jälg.
Pärast otsingut: õigused, chroot ja sandbox
Õige baaskataloog võib ikkagi anda sama teate, sest lahendamine ja juurdepääs on eraldi sammud. Protsess vajab täitmise õigust igas ülemkataloogis ja lugemisõigust failil, ning teenuse unit, mis peidab osa failisüsteemist, muudab seda, mida protsess üldse näha võib.
Kolm tavalist varianti annavad identse vea. Fail on loetav ainult rootile, samal ajal kui teenus loobub enne selle avamist privileegidest. Unit seab kaitseva failisüsteemi vaate, mis ei sisalda profiili kataloogi. Deemon töötab chrootiga, seega hostil olemas olev tee ei eksisteeri selle vaate sees.
Diagnoosige faili omandi ja protsessi identiteedi järgi, mitte õigusi lõdvendades. Privaatvõtme kõigile loetavaks tegemine selle vea vaigistamiseks vahetab valju tõrke vaikse vastu ja võti on just see kataloogi osa, mida te kõige vähem paljastada tahate.
Tõestage parandust omaenda käivitusega
Taaskäivitage tegelik unit profiiliga mitteseotud kataloogist ja jälgige sama käivitusrida. Seejärel kinnitage, et protsess hoiab töötades kavatsetud kataloogi ja et laaditud sertifikaat on see, mida ootate.
systemctl restart openvpn@tenant-a
systemctl status openvpn@tenant-a --no-pager
journalctl -u openvpn@tenant-a -n 20 --no-pager
Kui teede laadimine õnnestub, on autentimine ja marsruutimine endiselt eraldi etapid oma tõrgetega ning ühendus, mis tõuseb, aga liiklust läbi ei lase, on teine uurimine. Siinne parandus puudutab ainult seda, millisest kataloogist failid tulid, ja see peaks olema kutsest nähtav, mitte meeles sellel, kes selle viimati käsitsi käivitas.
Kui profiili juurutab konfiguratsioonihaldur, pange baaskataloog või absoluutsed failinimed ka sinna. Käsitsi parandus ühel hostil on selle probleemi versioon, mis naaseb pärast järgmist ülesehitust.