VPN dēmonam ir vajadzīgas priviliģētas tīkla darbības, lai gan parastas lietotnes atver izejošās ligzdas bez jebkādām privilēģijām. Tieši šajā plaisā sākas lielākā daļa iespēju kļūdu: kāds ierauga atļauju kļūdu, piešķir visu kopumu, un pakalpojums darbojas tādu iemeslu dēļ, kurus vēlāk neviens nevar izskaidrot. Tālāk sniegtais ceļvedis sākas ar neizdevušos darbību, saista to ar vienu pilnvaru un pēc tam pārbauda kontekstu, kurā process faktiski darbojas. Darbošanās kā neierobežotam root ir derīga atbilde dažiem izvietojumiem, bet tam jābūt lēmumam, nevis noklusējuma vērtībai.

Sāciet ar neizdevušos darbību

Izlasiet kļūdu, pirms lasāt pamācību. «Darbība nav atļauta» saskarnes maiņas laikā, atteikšanās atvērt ierīces mezglu un bind kļūda zemā portā ir trīs dažādas problēmas ar trim dažādām atļaujām. Ja process startē un neizdodas tikai pirmajā maršruta maiņā, tas arī nozīmē, ka saskarnes izveide jau ir izdevusies, kas ievērojami sašaurina atbildi.

Atkārtojiet kļūdu ar apturētu pakalpojumu, pēc tam palaidiet to priekšplānā ar to pašu lietotāju, ja ieviešana to atļauj. Kļūda, ko redzat, ir labāka par žurnāla rindu, kas jāuzmin, un tā skaidri parāda atšķirību starp iespēju problēmu un SELinux vai AppArmor atteikumu.

Saistiet katru darbību ar vienu pilnvaru

Tabula ir sākuma karte, nevis ieviešanas dokumentācijas aizstājējs:

OperationUsual authorityWatch for
Create or configure tun/tapCAP_NET_ADMIN in the relevant namespaceCreating the device and opening it are separate steps
Add routes, rules, firewall entriesCAP_NET_ADMINSame capability, different namespace than you think
Open /dev/net/tunDevice permissions, not a capabilityGroup membership or a udev rule may be enough
Raw socketsCAP_NET_RAWNeeded by some user-space tunnel implementations
Bind a port below 1024CAP_NET_BIND_SERVICEIrrelevant for most modern tunnel ports

Divas rindas šajā tabulā ir tās, ko cilvēki sajauc. /dev/net/tun atvēršana ir faila atļauju jautājums; lūgšana kodolam konfigurēt to, ko atvērāt, ir iespēju jautājums. CAP_NET_ADMIN piešķiršana nesalabo ierīces mezglu, ko jūsu pakalpojuma lietotājs nevar nolasīt, un mezgla salabošana nedod jums maršruta pilnvaru. Pārbaudiet abus, pirms maināt jebkuru.

Kodola WireGuard un lietotāja telpas tuneļu programmām arī nav identisku prasību. Kodola moduļa ceļš konfigurē esošu saskarni caur netlink, savukārt lietotāja telpas ieviešanai var būt vajadzīga arī ierīce un dažiem transportiem neapstrādātas ligzdas.

Izlasiet kontekstu: pakalpojums, konteiners vai čaula

Iespēja resursdatora tīkla nosaukumtelpā var ietekmēt daudz vairāk nekā tā pati darbība apzināti izolētā steksā. Konteineru izpildes vide parasti sākas ar samazinātu robežu kopumu; NET_ADMIN pievienošana konteineram, kas dala resursdatora tīklu, ir daudz lielāka atļauja nekā pievienošana konteineram ar savu tīkla nosaukumtelpu un bez resursdatora montējumiem.

Systemd vienībām lasiet, kas faktiski tiek piemērots, nevis ko vienības fails šķietami saka: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities ziņo efektīvās vērtības, ko var būt iestatījis aizmirsts drop-in. Prasiet efektīvo vērtību, nekad — paredzēto. Ambient iespējas ir svarīgas, jo pakalpojums, kas nav root, tās zaudē caur exec bez tām.

Par pamatu ņemiet pakotnes vai attēla atbalstīto iestatījumu. Nepievienojiet neapstrādātu ligzdu atļaujas vai priviliģētu režīmu tikai tāpēc, ka cita pamācība tās uzskaitīja citam rīkam; šī argumentācija neko nepārnes un izmaksā jums samaksāto izolāciju. Šaubu gadījumā nepiešķiriet neko un izlasiet ieviešanas piezīmes par precīzo darbību, kas jums nepieciešama.

Vērojiet, kas notiek pēc privilēģiju krituma

Daudzi dēmoni sāk ar privilēģijām, konfigurē saskarni, pēc tam pāriet uz lietotāju bez privilēģijām un saglabā tuneli. No šī brīža process vairs nevar pievienot maršrutu, pārrakstīt ugunsmūra noteikumu vai atvērt jaunu priviliģētu ierīci, kas ir kārtībā, līdz atkārtots savienojums pieprasa tieši to. Vēlāka failu lasīšana un āķu izpilde var neizdoties tā paša iemesla dēļ.

Pārbaudiet visu dzīves ciklu, nevis pirmo sekundi: palaišanu, atjaunošanu vai atkārtotu savienojumu un tīrīšanu apturot. Pirmā veiksmīgā saskarnes izveide nepierāda, ka katra vēlākā priviliģētā darbība joprojām strādās, un kļūda parasti parādās stundas vēlāk produkcijā.

Ieviešanas, kas saglabā tuneli atvērtu lietotāja maiņas laikā, to parasti apvieno ar iespējām saglabāt tuneli un atslēgas. Systemd pusē līdzvērtīgs jautājums ir, vai vienības iespēju kopa pārdzīvo jūsu konfigurēto lietotāja maiņu.

Pierakstiet piešķirto atļauju un tās iemeslu

Pierakstiet precīzo atļauju, darbību, ko tā ļauj, un kļūdu, ko tā novērsa. Viena rinda izvietošanas piezīmēs — «CAP_NET_ADMIN vienības tīkla nosaukumtelpā, nepieciešams maršrutu izmaiņām pēc atkārtota savienojuma» — ir pietiekama, lai nākamais cilvēks atkal nepaplašinātu atļauju.

Pēc tam pēc katra jauninājuma vēlreiz izlasiet efektīvo kopu. Piegādātāji pievieno funkcijas, attēli maina noklusējuma vērtības, un iespēja, kas pērn bija lieka, var kļūt nesoša, nevienam nepamanot.

Saistītie raksti