Dlhý čas behu dokazuje len to, že štart sa podaril s oprávneniami, ktoré mal démon v tom okamihu. Zlyhania, na ktorých tu záleží, prichádzajú neskôr: pripojí sa nový klient, vymení sa zoznam odvolaní, pomocný skript musí zapísať súbor. Každé z nich je nové otvorenie vykonané účtom bez oprávnení, s vlastnou otázkou o právach a vlastnou chybovou správou. Tri rozhodnutia oddeľujú konfiguráciu, ktorá funguje ďalej, od tej, ktorá zlyhá pri ďalšej udalosti.

Oddeľte to, čo sa načítalo skoro, od toho, čo sa otvára neskôr

Deskriptor je úchyt na otvorený popis súboru a režim prístupu bol pevne daný pri vytvorení tohto popisu. Neskoršia zmena používateľa procesu úchyt nezavrie, preto kľúčový súbor prečítaný ako root funguje aj po znížení. Ani režim sa nemení: úchyt otvorený na čítanie sa nestane zapisovateľným a zapisovateľný úchyt sa neodoberie len preto, že účet stratil práva na cestu. Tieto dve skutočnosti vysvetľujú väčšinu prekvapujúceho správania v týchto správach.

Druhá polovica je pamäť. Démon môže certifikát rozparsovať, rozparsovaný materiál podržať a súbor zavrieť; v použití zostávajú dáta, nie otvorený súbor. Preto trvajúca premávka nedokazuje ani že je deskriptor otvorený, ani že je názov cesty dosiahnuteľný. Dokazuje len, že materiál potrebný pre aktuálnu reláciu bol získaný skôr.

Neskoršie otvorenie je iná transakcia. Beží pod aktuálnymi povereniami, aktuálnym bezpečnostným kontextom a aktuálnym pohľadom na pripojenie, takže cesta čitateľná pri štarte môže byť pri ďalšom pripojení odmietnutá. Rotácia pridáva pascu: zápis nového súboru cez rovnaký názov cesty nechá existujúci deskriptor pripnutý k starému objektu, takže opätovné načítanie môže vyzerať úspešne, kým démon stále používa predchádzajúci obsah. Porovnajte inode, ktorý proces drží, s tým na disku, kým rotácii uveríte.

Pomenujte tri runtime čítania a kedy sa každé spustí

Tri zdroje sa zvyčajne otvárajú dávno po inicializácii a zlyhávajú v rôznych okamihoch. Konfiguračný súbor konkrétneho klienta sa číta, keď sa tento klient pripojí, takže sa môže pokaziť pre jedného používateľa, kým ostatní pokračujú. Údaje o odvolaní sa overujú pri autentifikácii partnera a znova pri výmene súboru. Dočasný adresár sa dotkne len vtedy, keď skript alebo doplnok niečo zapíše.

Žiadny z troch nepatrí do štartovej cesty, preto server zdravý týždne môže zlyhať pri ďalšom pripojení. Kategória pomenúva aj vlastníka opravy: prvé dva sú práva čítania konfigurácie pod účtom démona a tretí je zapisovateľné miesto s úzkym účelom.

Path reopened laterWhat triggers the openFirst sign when it fails
Client configuration fileA connection for that client identityOne client rejected while others connect
Revocation dataPeer authentication, including after replacementRevoked and valid peers both refused
Script or plugin temporary directoryA helper needs to create a fileThe helper exits with a path error

persist-key odpovedá na užšiu otázku, než väčšina predpokladá. Udržiava kľúčový súbor otvorený cez dokumentované resety SIGUSR1 a ping-restart, a nerobí nič pre súbory CCD, údaje o odvolaní, pomocné spustiteľné súbory ani úplný reštart procesu. Tie stále idú svojimi cestami otvorenia, pod tým účtom, ktorý práve beží.

Potvrďte účet a pohľad, ktorý skutočne má

Spýtajte sa bežiaceho démona, ktorý účet používa, namiesto dôvery v unit súbor, a potom porovnajte odpoveď s tým, čo unit nastavuje. Nesúlad je prvá vec na riešenie, pretože každá ďalšia kontrola práv beží ako ten, kým proces skutočne je. Potom prejdite cestu komponent po komponente; priechod sa vyhodnocuje na každej úrovni, takže čitateľný súbor v nepriechodnom adresári zostáva nečitateľný. Konečný režim súboru je posledná otázka, nie prvá.

Menové priestory a servisné pieskoviská pridávajú hranice, ktoré vlastníctvo a bity režimu neopisujú. Cesta viditeľná vo vašom shelli môže chýbať alebo byť len na čítanie vnútri chroot, menového priestoru pripojenia alebo unitu, ktorý skrýva domovské adresáre. Bezpečnostné moduly pridávajú ďalšiu vrstvu, takže súbor, ktorý vyzerá čitateľne, môže byť pri otvorení predsa odmietnutý.

ps -o user:12,pid,args -C openvpn
systemctl show -p User -p Group -p ProtectHome -p RootDirectory [email protected]
sudo -u openvpn namei -l /etc/openvpn/ccd/alice

Úspešné čítanie v shelli správcu netestuje žiadnu z týchto kombinovaných podmienok. Spustite kontrolu pod účtom démona, s rovnakým menovým priestorom a pieskoviskom, alebo prijmite, že výsledok opisuje váš shell, nie server. Tretí príkaz je lacná verzia tohto testu: vypíše režim každého komponentu a zlyhá na prvom, ktorým účet démona neprejde.

Dajte runtime zápisu vlastný adresár

Čítanie je len polovica inventára. Pomocný skript môže potrebovať vytvoriť stavový súbor, doplnok môže potrebovať zapísať stav vedľa svojej konfigurácie, a tieto zápisy nie sú pokryté tým, že strom konfigurácie sa stane zapisovateľným. Dajte konkrétnemu adresáru právo zápisu, ktoré jeho funkcia potrebuje, s vlastníkom a režimom, ktoré viete vysvetliť. Pre všetko, čo sa len číta, preferujte prístup len na čítanie.

Držte práva súkromného kľúča oddelene od politických súborov. Kľúč, ktorý treba po resete znova prečítať, má inú požiadavku ako klientský súbor čítaný pri každom pripojení, a jeden zhovievavý režim pre oba dáva viac prístupu, než problém žiada. Vyhradený účet démona s úzkym vlastníctvom sa audituje ľahšie než široká skupina. Keď má kľúč prežiť resety, persist-key odstráni opakované čítanie namiesto rozšírenia adresára.

Rozhodujte podľa udalosti, ktorú viete zopakovať

Živý tunel dokazuje jednu cestu kódom. Udalosť, ktorá potrebuje súbor, je jediný test, ktorý pokrýva otvorenie, na ktorom vám záleží, či už je to nové klientske pripojenie, vymenený súbor odvolania, povolený mäkký reset alebo plánovaný reštart. Vyberte udalosť, spustite ju a podržte prvú chybu, nie poslednú.

Pri mäkkom resete jeden signál a log unitu ukážu, či bol kľúč prečítaný znova. Pošlite signál a potom prečítajte posledné riadky, ktoré unit zapísal:

systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pager

Nevyvodzujte, že kompromitovaný démon už nemôže meniť súbory len preto, že boli oprávnenia znížené. Čo ešte dokáže, závisí od zostávajúcich poverení, jeho schopností, adresárov, do ktorých môže písať, a každého dosiaľ držaného zapisovateľného deskriptora. Zníženie oprávnení zužuje právomoc a inventár runtime otvorení ukazuje, ako veľmi. Napíšte tú hranicu vedľa konfigurácie, aby ju ďalší človek nemusel znova objavovať.

Súvisiace články