Dugo vrijeme rada dokazuje samo da je pokretanje uspjelo s privilegijama koje je daemon imao u tom trenutku. Kvarovi koji su ovdje važni dolaze kasnije: novi se klijent povezuje, lista opoziva se zamjenjuje, pomoćna skripta mora zapisati datoteku. Svaki od njih novo je otvaranje koje izvodi račun bez privilegija, s vlastitim pitanjem dopuštenja i vlastitom porukom o grešci. Tri odluke razdvajaju postavku koja nastavlja raditi od one koja pada na sljedećem događaju.

Odvojite ono što je učitano rano od onoga što se otvara kasnije

Deskriptor je ručka na otvorenom opisu datoteke, a način pristupa utvrđen je pri stvaranju tog opisa. Kasnija promjena korisnika procesa ne zatvara ručku, zato ključna datoteka pročitana kao root nastavlja raditi nakon pada. Ni način se ne mijenja: ručka otvorena za čitanje ne postaje zapisiva, a zapisiva ručka ne opoziva se samo zato što je račun izgubio prava na putanju. Te dvije činjenice objašnjavaju većinu neočekivanog ponašanja u ovim izvještajima.

Druga polovica je memorija. Daemon može raščlaniti certifikat, zadržati raščlanjeni materijal i zatvoriti datoteku; u uporabi ostaju podaci, a ne otvorena datoteka. Zato stalni promet ne dokazuje ni da je deskriptor otvoren ni da je naziv putanje dosežan. Dokazuje samo da je materijal potreban za trenutačnu sesiju pribavljen ranije.

Kasnije otvaranje druga je transakcija. Izvodi se pod trenutačnim vjerodajnicama, trenutačnim sigurnosnim kontekstom i trenutačnim pogledom montiranja, pa putanja koja je bila čitljiva pri pokretanju može biti odbijena pri sljedećoj vezi. Rotacija dodaje zamku: upis nove datoteke preko istog naziva putanje ostavlja postojeći deskriptor vezan uz stari objekt, pa se ponovno učitavanje može činiti uspješnim dok daemon još rabi prethodni sadržaj. Usporedite inode koji proces drži s onim na disku prije nego povjerujete da je rotacija stupila na snagu.

Imenujte tri čitanja u vrijeme izvršavanja i kada se svako dogodi

Tri se izvora obično otvaraju znatno nakon inicijalizacije i padaju u različitim trenucima. Konfiguracijska datoteka određenog klijenta čita se kada se taj klijent poveže, pa se može slomiti za jednog korisnika dok ostali nastavljaju. Podaci o opozivu provjeravaju se tijekom autentikacije partnera i ponovno kada se datoteka zamijeni. Privremeni direktorij dira se samo kada skripta ili dodatak nešto zapiše.

Nijedan od tri ne pripada putu pokretanja, zato poslužitelj koji je tjednima zdrav može pasti pri sljedećoj vezi. Kategorija imenuje i vlasnika ispravka: prva su dva dopuštenja čitanja konfiguracije pod računom daemona, a treći je zapisivo mjesto uske namjene.

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 odgovara na uže pitanje nego što većina ljudi pretpostavlja. On drži ključnu datoteku otvorenom kroz dokumentirana resetiranja SIGUSR1 i ping-restart, i ne čini ništa za CCD datoteke, podatke o opozivu, pomoćne izvršne datoteke ili potpuno ponovno pokretanje procesa. Oni i dalje slijede vlastite putanje otvaranja, pod računom koji tada radi.

Potvrdite račun i pogled koji zaista ima

Pitajte daemon koji radi koji račun rabi umjesto da vjerujete datoteci unit, pa usporedite odgovor s onim što unit postavlja. Nesklad je prvo što treba riješiti, jer svaka kasnija provjera dopuštenja radi kao onaj koji proces zaista jest. Zatim prođite putanju komponentu po komponentu; prolazak se procjenjuje na svakoj razini, pa čitljiva datoteka u direktoriju kroz koji se ne može proći ostaje nečitljiva. Konačni način datoteke posljednje je pitanje, a ne prvo.

Imenski prostori i servisne pješčanice dodaju granice koje vlasništvo i bitovi načina ne opisuju. Putanja vidljiva u vašoj ljusci može biti odsutna ili samo za čitanje unutar chroota, imenskog prostora montiranja ili unita koji skriva kućne direktorije. Sigurnosni moduli dodaju još jedan sloj, pa datoteka koja izgleda čitljivo ipak može biti odbijena kada se otvori.

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

Uspješno čitanje u ljusci administratora ne provjerava nijedan od tih spojenih uvjeta. Izvedite provjeru pod računom daemona, s istim imenskim prostorom i pješčanicom, ili prihvatite da rezultat opisuje vašu ljusku, a ne poslužitelj. Treća naredba jeftina je inačica tog testa: ispisuje način svake komponente i pada na prvoj kroz koju račun daemona ne može proći.

Dajte zapisivanje u vrijeme izvršavanja vlastiti direktorij

Čitanje je samo polovica popisa. Pomoćna skripta može trebati stvoriti statusnu datoteku, dodatak može trebati zapisati stanje uz svoju konfiguraciju, a ti upisi nisu pokriveni time što se stablo konfiguracije čini zapisivim. Dajte konkretnom direktoriju dopuštenje upisa koje njegova funkcija traži, s vlasnikom i načinom koje možete objasniti. Preferirajte pristup samo za čitanje za sve što se samo čita.

Držite dopuštenja privatnog ključa odvojeno od datoteka politike. Ključ koji se mora ponovno pročitati nakon resetiranja ima drukčiji zahtjev od klijentske datoteke koja se čita pri svakoj vezi, a jedan popustljiv način za oboje daje više pristupa nego što problem traži. Namjenski račun daemona s uskim vlasništvom lakše je revidirati od široke grupe. Kada ključ mora preživjeti resetiranja, persist-key uklanja ponovno čitanje umjesto da proširi direktorij.

Odlučite na temelju događaja koji možete reproducirati

Živi tunel dokazuje jedan put kroz kod. Događaj kojem treba datoteka jedini je test koji pokriva otvaranje koje vas zanima, bilo da je nova veza klijenta, zamijenjena datoteka opoziva, dopušteno meko resetiranje ili planirano ponovno pokretanje. Odaberite događaj, izvedite ga i zadržite prvu grešku, a ne posljednju.

Za meko resetiranje jedan signal i dnevnik unita pokazuju je li ključ ponovno pročitan. Pošaljite signal, zatim pročitajte posljednje retke koje je unit zapisao:

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

Ne zaključujte da kompromitirani daemon više ne može mijenjati datoteke samo zato što su privilegije spuštene. Što još može ovisi o preostalim vjerodajnicama, njegovim sposobnostima, direktorijima u koje može pisati i svakoj zapisivoj ručki koju još drži. Smanjenje privilegija sužava ovlasti, a popis otvaranja u vrijeme izvršavanja pokazuje dokle. Zapišite tu granicu uz konfiguraciju da je sljedeća osoba ne mora ponovno otkrivati.

Povezani članci