Nakon pada privilegija: koji OpenVPN fajlovi još rade?
Deskriptori otvoreni prije pada nastavljaju raditi; putanje koje se kasnije ponovno otvaraju ne. Odredite koji od tri fajla u vrijeme izvršavanja vaša postavka mora ponovno 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 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 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č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/aliceUspješ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-pagerNe 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.