OpenVPN ne može pronaći ca.crt iako se profil učitava
Putanja profila nije osnova za datoteke unutar njega. Pogledajte zašto apsolutni --config ipak pada na ca.crt i kako pokretanje određuje odgovor.
Usluga se pokrene, pročita profil bez prigovora i zatim padne na liniji koja izgleda nepovezano: ne može otvoriti ca.crt. Ništa se na certifikatu nije promijenilo, a putanja profila u unit datoteci je apsolutna. Ta kombinacija je znak. Putanja koju ste predali locira jednu datoteku, a imena unutar te datoteke razrješavaju se sasvim drugdje, pa pokretanje koje izgleda potpuno kvalificirano ipak može čitati svoje ključeve iz direktorija koji nitko nije namjeravao.
Neuspjeh ima malo uzroka i vrijedi ih razdvojiti po redu: osnovni direktorij koji je proces stvarno imao, kontekst pokretanja usluge te dozvole ili sandbox oko datoteke kad putanja postane ispravna. Svaki ostavlja drugi trag — u unit datoteci, u procesu i na datotečnom sistemu.
Putanja profila nije osnovni direktorij
Zamislite proces koji starta u /tmp i dobije /etc/vpn/prod/tenant-a.ovpn. Unutar tog profila linija ca ca.crt imenuje relativnu putanju. Ništa u argumentu koji je locirao profil ne prepisuje to ime, pa proces traži /tmp/ca.crt i prijavljuje nedostajuću datoteku.
Zbunjuje redoslijed grešaka. OpenVPN prvo parsira konfiguraciju i otvara referencirane datoteke kako do njih dolazi, pa se tipfeler u profilu prijavi prije nego što se dotakne ijedan ključ, dok se nedostajući certifikat pojavi tek kad parsiranje dotle stigne. Profil koji se učita zato je dokaz da je sintaksa ispravna, a ne da su datoteke koje imenuje pronađene.
Šta priručnik razdvaja: --config i --cd
Priručnik za OpenVPN 2.6 opisuje dvije različite opcije. Jedna učitava konfiguracijsku datoteku. Druga mijenja direktorij procesa prije nego što se pročitaju konfiguracija, ključ, skripta i ostale datoteke, i zahtijeva apsolutni direktorij bez ikakvog osvrta na trenutni.
openvpn --cd /etc/vpn/prod --config tenant-a.ovpn
Taj poziv je oblik, ne uputa da pokrenete tuđi profil. Ono što vam daje jest determinizam: osnova za svako relativno ime u lancu navedena je u komandi umjesto da se naslijedi iz ljuske ili menadžera koji je pokrenuo proces. Alternativa je jednako valjana i često bolja za uslugu: ostavite radni direktorij na miru i učinite svaku referenciranu datoteku apsolutnom unutar profila.
Šta god odabrali, pregledajte cijeli lanac, a ne prvi neuspjeh. Profil može uvući drugu konfiguracijsku datoteku, a relativna imena uključene datoteke razrješavaju se prema istom direktoriju procesa, ne prema direktoriju datoteke koja ih je uključila. Putanje zapisa, datoteke provjere autentičnosti i pomoćne skripte slijede isto pravilo.
Usluga starta negdje drugo
Interaktivna ljuska u direktoriju profila ne dokazuje ništa o zapakiranom unit-u. Menadžeri postavljaju vlastiti radni direktorij, a omotna skripta ga može ponovno promijeniti prije nego što se binarna datoteka pokrene. Unit koji pada jedino je pokretanje o kojem vrijedi razmišljati.
systemctl show -p WorkingDirectory -p ExecStart --value openvpn@tenant-a
ls -l /proc/$(pgrep -n openvpn)/cwd
Druga komanda pokazuje direktorij koji živi proces stvarno drži, i to je pouzdanije od unit datoteke kad je uključen omotač. Ako se njih dvoje ne slažu, omotač je vaš odgovor, a unit je lažni trag.
Nakon traženja: dozvole, chroot i sandbox
Ispravan osnovni direktorij ipak može dati istu poruku, jer su razrješavanje i pristup odvojeni koraci. Procesu treba dozvola izvršavanja na svakom roditeljskom direktoriju i dozvola čitanja datoteke, a unit usluge koji skriva dio datotečnog sistema mijenja ono što proces uopće može vidjeti.
Tri uobičajene varijante daju identičnu grešku. Datoteka je čitljiva samo za root, a usluga odbaci privilegije prije nego što je otvori. Unit postavlja zaštitni pogled na datotečni sistem koji ne uključuje direktorij profila. Demon radi s chrootom, pa putanja koja postoji na hostu ne postoji unutar tog pogleda.
Dijagnosticirajte pomoću vlasništva datoteke i identiteta procesa, a ne popuštanjem dozvola. Učiniti privatni ključ čitljivim svima da ušutkate ovu grešku zamjenjuje glasan neuspjeh tihim, a ključ je dio direktorija koji najmanje želite izložiti.
Dokažite popravku vlastitim pokretanjem
Ponovno pokrenite pravi unit iz direktorija nepovezanog s profilom i promatrajte istu liniju pokretanja. Zatim potvrdite da proces tijekom rada drži namjeravani direktorij i da je certifikat koji je učitao onaj koji očekujete.
systemctl restart openvpn@tenant-a
systemctl status openvpn@tenant-a --no-pager
journalctl -u openvpn@tenant-a -n 20 --no-pager
Kad učitavanje putanja uspije, provjera autentičnosti i usmjeravanje i dalje su odvojene faze s vlastitim neuspjesima, a veza koja se uspostavi ali ne propušta promet druga je istraga. Popravka ovdje tiče se samo toga iz kojeg su direktorija došle datoteke i treba biti vidljiva u pozivu, umjesto da je pamti onaj ko je posljednji pokrenuo ručno.
Ako se profil postavlja konfiguracijskim menadžerom, stavite i tamo osnovni direktorij ili apsolutna imena datoteka. Ručna popravka na jednom hostu verzija je ovog problema koja se vraća nakon sljedeće izgradnje.