Hookovi prijavljuju uspjeh, a ista putanja i dalje izgleda prazna iz ljuske. Obje tvrdnje mogu biti istovremeno tačne, jer systemd servis može živjeti u svom vlastitom mount prostoru imena s privatnim privremenim direktorijem. Kad se to shvati, zanimljivo pitanje postaje je li upis uopće uspio.

Dva privremena direktorija, jedna putanja

Postavka izolacije daje unit-u privatan pogled na privremene direktorije umjesto da ih učini samo za čitanje. Procesi izvan unit-a ne mogu vidjeti što on tamo piše, a sve što ostavi za sobom odbacuje se kad se unit zaustavi. Putanja koju ispiše hook i putanja provjerena iz ljuske mogu stoga označavati različite objekte s istim imenom.

To je problem vidljivosti i izgleda kao problem gubitka podataka. Ništa nije izbrisano, jer je datoteka jednostavno u prostoru imena u kojem ljuska nije član. Ista naredba ponaša se drukčije kad se pokrene unutar unit-a, i to je zapažanje koje obično rješava raspravu. Pročitajte postavke unit-a prije nego što zaključite bilo što o upisu.

Odvojite nevidljivo od nezapisivog

Uspješan upis i neuspješno otvaranje daju različite dokaze, a razlika odlučuje popravku. Ako hook kaže da je datoteka stvorena ali vanjski čitatelj je ne može pronaći, imate pitanje prostora imena. Ako hook prijavi grešku dopuštenja ili neuspješno otvaranje, datoteka nikada nije zapisana i nikakva promjena prostora imena neće pomoći.

systemctl show [email protected] -p PrivateTmp -p User -p Group -p RuntimeDirectory
systemctl show [email protected] -p MainPID --value
sudo ls -l /proc/PID/root/tmp/client-state

Putanja korijena procesa otkriva vlastiti pogled servisa na datotečni sustav, podložno provjerama dopuštenja na tom procesu dok još radi. Čitajte dnevnik unit-a u istoj sesiji, jer se greška pri upisu i nedostajuća datoteka lako pomiješaju kad je netko već odlučio uzrok.

Dajte podijeljenim podacima izričito mjesto

Podaci koji trebaju samo servisu pripadaju u njegov privatni privremeni direktorij. Podaci koje drugi proces mora čitati trebaju putanju definiranu za oboje, s navedenim vlasnikom, načinom i rokom. Odlučite koji od ta dva slučaja imate prije uređivanja unit-a. Većina ovih incidenata dolazi iz toga da se privatna datoteka tretira kao podijeljena.

[Service]
RuntimeDirectory=openvpn-hook-office
RuntimeDirectoryMode=0750

Runtime direktorij stavlja mapu u sistemsko runtime područje, stvara je za konfiguriranog korisnika i grupu unit-a i uklanja je kad se unit zaustavi. Dodajte ga kroz drop-in da unit paketa ostane netaknut, zatim ponovno učitajte upravitelja i restartajte tu instancu, prihvativši da će se njezini klijenti ponovno povezati.

Zadržite svaki runtime direktorij koji instalirani unit već zahtijeva. Zamjena popisa umjesto dodavanja na njega čest je način da se pokvari nepovezana značajka koju nitko ne povezuje s promjenom.

Dva sloja privilegija mogu se ne slagati

Upravitelj servisa stvara direktorij za konfiguriranog korisnika unit-a, dok VPN daemon može zasebno sići na vlastiti račun prije pokretanja hooka za vezu. To su različiti slojevi i mogu imenovati različite identitete.

Direktorij u vlasništvu roota s restriktivnim načinom potpuno je vidljiv daemonu koji je već spustio privilegije, a ipak nezapisiv za njega. Greška se tada čita kao problem dopuštenja iako putanja postoji točno tamo gdje ste očekivali. Usporedite vlasnika direktorija s identitetom koji hook prijavljuje. Kad se razlikuju, način nikada nije bio pitanje.

Provjerite identitet pod kojim hook doista radi prije promjene vlasništva. Promjena korisnika za izvršavanje servisa da bi se popravio direktorij može promijeniti pristup uređajima i mrežne privilegije drugdje, što je velika cijena za mali problem.

Provjerite cijelu predaju

Potvrdite četiri stvari odjednom: hook piše pod svojim stvarnim identitetom, predviđeni čitatelj može konzumirati datoteku, nepovezani korisnici ne mogu, a zaustavljanje unit-a čisti kako je dizajnirano. Datoteka koja se pojavi u dijeljenom privremenom direktoriju hosta nije uvjet i obično je znak da razmjena nikad nije dobila vlastitu putanju. Testirajte čitatelja nakon restarta, ne samo tijekom prvog pokretanja. Ponašanje čišćenja dio je dizajna, pa ga promatrajte umjesto da ga pretpostavljate.

Trajno stanje pripada mjestu s odgovarajućim životnim vijekom, jer je runtime direktorij namijenjen nestanku. Odaberite mjesto prema životnom vijeku, a ne prema praktičnosti. Ta navika sprječava sljedeću verziju iste istrage.

Povezani članci