Nakon pada privilegija: koji OpenVPN fajlovi još rade?
Deskriptori otvoreni prije pada nastavljaju raditi; putevi koji se kasnije ponovo otvaraju ne. Odredite koji od tri fajla u vrijeme izvršavanja vaša postavka mora ponovo otvoriti.
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 klijent se povezuje, lista opoziva se zamjenjuje, pomoćna skripta treba da zapiše fajl. Svaki od njih je novo otvaranje koje izvodi račun bez privilegija, sa vlastitim pitanjem dozvola 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 fajla, a način pristupa je fiksiran kada je taj opis stvoren. Promjena korisnika procesa kasnije ne zatvara ručku, zato ključni fajl pročitan kao root nastavlja raditi nakon pada privilegija. Ni način se ne mijenja: ručka otvorena za čitanje ne postaje upisiva, a upisiva ručka se ne opoziva samo zato što je račun izgubio prava na putanju. Te dvije činjenice objašnjavaju većinu iznenađujućeg ponašanja u ovim izvještajima.
Druga polovina je memorija. Daemon može analizirati certifikat, zadržati analizirani materijal i zatvoriti fajl; u upotrebi ostaju podaci, a ne otvoreni fajl. Zato stalni saobraćaj ne dokazuje ni da je deskriptor otvoren ni da je ime putanje dostupno. Dokazuje samo da je materijal potreban za trenutnu sesiju pribavljen ranije.
Kasnije otvaranje je druga transakcija. Izvodi se pod trenutnim akreditivima, trenutnim sigurnosnim kontekstom i trenutnim prikazom montiranja, pa putanja koja je bila čitljiva pri pokretanju može biti odbijena pri sljedećoj vezi. Rotacija dodaje zamku: upis novog fajla preko istog imena putanje ostavlja postojeći deskriptor vezan za stari objekat, pa se ponovno učitavanje može činiti uspješnim dok daemon još koristi prethodni sadržaj. Uporedite inode koji proces drži s onim na disku prije nego što povjerujete da je rotacija stupila na snagu.
Imenujte tri čitanja u vrijeme izvršavanja i kada se svako dogodi
Tri resursa se obično otvaraju znatno nakon inicijalizacije i padaju u različitim trenucima. Konfiguracijski fajl 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 tokom autentifikacije partnera i ponovo kada se fajl zamijeni. Privremeni direktorij se dira samo kada skripta ili dodatak nešto zapiše.
Nijedan od tri ne pripada putu pokretanja, zato server koji je sedmicama zdrav može pasti pri sljedećoj vezi. Kategorija imenuje i vlasnika popravke: prva dva su dozvole čitanja konfiguracije pod računom daemona, a treći je upisiva lokacija uske namjene.
| Path reopened later | What triggers the open | First sign when it fails |
|---|---|---|
| Client configuration file | A connection for that client identity | One client rejected while others connect |
| Revocation data | Peer authentication, including after replacement | Revoked and valid peers both refused |
| Script or plugin temporary directory | A helper needs to create a file | The helper exits with a path error |
persist-key odgovara na uže pitanje nego što većina ljudi pretpostavlja. On drži ključni fajl otvorenim kroz dokumentirana resetovanja SIGUSR1 i ping-restart, i ne čini ništa za CCD fajlove, podatke o opozivu, pomoćne izvršne fajlove ili potpuno ponovno pokretanje procesa. Oni i dalje slijede vlastite putanje otvaranja, pod računom koji tada radi.
Potvrdite račun i prikaz koji zaista ima
Pitajte daemon koji radi koji račun koristi umjesto da vjerujete unit fajlu, pa uporedite odgovor s onim što unit postavlja. Nesklad je prvo što treba riješiti, jer svaka kasnija provjera dozvola radi kao onaj ko proces zaista jeste. Zatim prođite putanju komponentu po komponentu; prolaz se procjenjuje na svakom nivou, pa čitljiv fajl u direktoriju kroz koji se ne može proći ostaje nečitljiv. Konačni način fajla je posljednje pitanje, a ne prvo.
Imenični prostori i servisne pješčanike 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 chroot-a, imeničnog prostora montiranja ili unita koji skriva kućne direktorije. Sigurnosni moduli dodaju još jedan sloj, pa fajl koji izgleda čitljiv ipak može biti odbijen 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/aliceUspješno čitanje u ljusci administratora ne provjerava nijedan od tih spojenih uslova. Izvršite provjeru pod računom daemona, s istim imeničnim prostorom i pješčanikom, ili prihvatite da rezultat opisuje vašu ljusku, a ne server. Treća naredba je jeftina verzija tog testa: ispisuje način svake komponente i pada na prvoj kroz koju račun daemona ne može proći.
Dajte upis u vrijeme izvršavanja vlastiti direktorij
Čitanje je samo polovina inventara. Pomoćna skripta može trebati stvoriti statusni fajl, dodatak može trebati zapisati stanje pored svoje konfiguracije, a ti upisi nisu pokriveni time što se stablo konfiguracije čini upisivim. Dajte konkretnom direktoriju dozvolu upisa koju 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 dozvole privatnog ključa odvojeno od fajlova politike. Ključ koji se mora ponovo pročitati nakon resetovanja ima drugačiji zahtjev od klijentskog fajla koji se čita pri svakoj vezi, a jedan popustljiv način za oba daje više pristupa nego što problem traži. Posvećeni račun daemona s uskim vlasništvom lakše je revidirati od široke grupe. Kada ključ mora preživjeti resetovanja, persist-key uklanja ponovno čitanje umjesto da proširi direktorij.
Odlučite na osnovu događaja koji možete reproducirati
Živi tunel dokazuje jedan put kroz kod. Događaj kojem treba fajl jedini je test koji pokriva otvaranje koje vas zanima, bilo da je nova veza klijenta, zamijenjen fajl opoziva, dozvoljeno meko resetovanje ili planirano ponovno pokretanje. Odaberite događaj, izvršite ga i zadržite prvu grešku, a ne posljednju.
Za meko resetovanje jedan signal i dnevnik unita pokazuju je li ključ ponovo pročitan. Pošaljite signal, zatim pročitajte posljednje redove koje je unit zapisao:
systemctl kill -s SIGUSR1 [email protected]
journalctl -u [email protected] -n 40 --no-pagerNe zaključujte da kompromitirani daemon više ne može mijenjati fajlove samo zato što su privilegije spuštene. Šta još može zavisi od preostalih akreditiva, njegovih sposobnosti, direktorija u koje može pisati i svake upisive ručke koju još drži. Smanjenje privilegija sužava ovlaštenja, a inventar otvaranja u vrijeme izvršavanja pokazuje dokle. Zapišite tu granicu pored konfiguracije da je sljedeća osoba ne mora ponovo otkrivati.