Pakalpojums startē, nolasa profilu bez sūdzībām un pēc tam nomirst rindā, kas izskatās nesaistīta: tas nevar atvērt ca.crt. Sertifikātā nekas nav mainījies, un profila ceļš unit failā ir absolūts. Tieši šī kombinācija ir pazīme. Jūsu norādītais ceļš atrod vienu failu, un šī faila iekšienē esošie nosaukumi tiek atrisināti pavisam citur, tāpēc palaišana, kas izskatās pilnībā kvalificēta, joprojām var lasīt savas atslēgas no mapes, ko neviens nebija domājis.

Neveiksmei ir maz iemeslu, un tos ir vērts atdalīt secībā: bāzes mape, kas procesam patiešām bija, pakalpojuma palaišanas konteksts un atļaujas vai sandbox ap failu, kad ceļš jau ir pareizs. Katrs atstāj citu pēdu — unit failā, procesā un failu sistēmā.

Profila ceļš nav bāzes mape

Iedomājieties procesu, kas sākas /tmp un saņem /etc/vpn/prod/tenant-a.ovpn. Šī profila iekšienē rinda ca ca.crt nosauc relatīvu ceļu. Nekas argumentā, kas atrada profilu, šo nosaukumu nepārraksta, tāpēc process meklē /tmp/ca.crt un ziņo par trūkstošu failu.

Mulsinošā daļa ir kļūdu secība. OpenVPN vispirms parsē konfigurāciju un atver norādītos failus, kad tos sasniedz, tāpēc drukas kļūda profilā tiek ziņota pirms jebkuras atslēgas aizskaršanas, savukārt trūkstošs sertifikāts parādās tikai tad, kad parsēšana tur nonāk. Tātad ielādēts profils ir pierādījums, ka sintakse ir kārtībā, nevis ka tā nosauktie faili tika atrasti.

Ko rokasgrāmata šķir: --config un --cd

OpenVPN 2.6 rokasgrāmata apraksta divas atšķirīgas opcijas. Viena ielādē konfigurācijas failu. Otra nomaina procesa mapi pirms konfigurācijas, atslēgas, skripta un citu failu lasīšanas, un prasa absolūtu mapi bez atsauces uz pašreizējo.

openvpn --cd /etc/vpn/prod --config tenant-a.ovpn

Šis izsaukums ir forma, nevis norādījums palaist kāda cita profilu. Ko tas dod, ir noteiktība: katra relatīvā nosaukuma bāze ķēdē tiek pateikta komandā, nevis mantota no čaulas vai pārvaldnieka, kas palaida procesu. Alternatīva ir tikpat derīga un pakalpojumam bieži labāka: atstājiet darba mapi mierā un padariet katru norādīto failu absolūtu profila iekšienē.

Ko vien izvēlaties, pārbaudiet visu ķēdi, nevis pirmo neveiksmi. Profils var iesaistīt citu konfigurācijas failu, un iekļautā faila relatīvie nosaukumi tiek atrisināti pret to pašu procesa mapi, nevis pret faila, kas tos iekļāva, mapi. Žurnālu ceļi, autentifikācijas faili un palīgskripti ievēro to pašu noteikumu.

Pakalpojums startē citur

Interaktīva čaula profila mapē neko nepierāda par iepakotu unit. Pārvaldnieki nosaka savu darba mapi, un iesaiņojošais skripts to var atkal mainīt pirms binārā faila palaišanas. Neizdevušais unit ir vienīgā palaišana, par ko ir vērts spriest.

systemctl show -p WorkingDirectory -p ExecStart --value openvpn@tenant-a
ls -l /proc/$(pgrep -n openvpn)/cwd

Otrā komanda parāda mapi, ko dzīvais process patiešām tur, un tas ir uzticamāk par unit failu, ja iesaistīts iesaiņojums. Ja abi nesakrīt, atbilde ir iesaiņojums un unit ir maldinoša pēda.

Pēc meklēšanas: atļaujas, chroot un sandbox

Pareiza bāzes mape joprojām var dot to pašu ziņojumu, jo atrisināšana un piekļuve ir atsevišķi soļi. Procesam vajag izpildes atļauju katrā vecākmappē un lasīšanas atļauju failā, un pakalpojuma unit, kas slēpj daļu failu sistēmas, maina to, ko process vispār var redzēt.

Trīs izplatīti varianti dod identisku kļūdu. Fails ir lasāms tikai root, kamēr pakalpojums pirms tā atvēršanas atsakās no privilēģijām. Unit iestata aizsargājošu failu sistēmas skatu, kas neietver profila mapi. Dēmons darbojas ar chroot, tāpēc ceļš, kas eksistē uz saimnieka, šajā skatā neeksistē.

Diagnosticējiet pēc faila īpašnieka un procesa identitātes, nevis atļauju atslābināšanas. Privātas atslēgas padarīšana lasāmu visiem, lai šo kļūdu apklusinātu, apmaina skaļu neveiksmi pret klusu, un atslēga ir tieši tā mapes daļa, ko vismazāk gribat atklāt.

Pierādiet labojumu ar savu paša palaišanu

Restartējiet īsto unit no mapes, kas nav saistīta ar profilu, un vērojiet to pašu starta rindu. Pēc tam apstipriniet, ka process darbības laikā tur paredzēto mapi un ka ielādētais sertifikāts ir tas, ko gaidāt.

systemctl restart openvpn@tenant-a
systemctl status openvpn@tenant-a --no-pager
journalctl -u openvpn@tenant-a -n 20 --no-pager

Kad ceļu ielāde izdodas, autentifikācija un maršrutēšana joprojām ir atsevišķi posmi ar savām neveiksmēm, un savienojums, kas paceļas, bet nelaiž cauri satiksmi, ir cita izmeklēšana. Labojums šeit attiecas tikai uz to, no kuras mapes nāca faili, un tam jābūt redzamam izsaukumā, nevis jāatceras tam, kas to pēdējo reizi palaida ar roku.

Ja profilu izvieto konfigurācijas pārvaldnieks, ielieciet tur arī bāzes mapi vai absolūtos failu nosaukumus. Manuāls labojums vienā saimniekā ir šīs problēmas versija, kas atgriežas pēc nākamās pārbūves.

Saistītie raksti