VPN-deemon vajab privilegeeritud võrgutoiminguid, kuigi tavalised rakendused avavad väljuvaid sokleid ilma igasuguse privileegita. Just selles lõhes algavad enamik võimekuste vigu: keegi näeb õigusetõrget, annab kogu komplekti ja teenus töötab põhjustel, mida hiljem keegi seletada ei oska. Alljärgnev ülevaade algab ebaõnnestunud toimingust, seob selle ühe volitusega ja kontrollib seejärel konteksti, milles protsess tegelikult töötab. Piiramatu rootina töötamine on mõne kasutuselevõtu jaoks kehtiv vastus, kuid see peaks olema otsus, mitte vaikeväärtus.

Alusta toimingust, mis ebaõnnestus

Loe viga enne, kui loed õpetust. „Toiming pole lubatud“ liidese muutmisel, keeldumine seadme sõlme avamast ja sidumise tõrge madalal pordil on kolm erinevat probleemi kolme erineva õigusega. Kui protsess käivitub ja ebaõnnestub alles esimesel marsruudi muutmisel, tähendab see ka seda, et liidese loomine õnnestus juba, mis kitsendab vastust märkimisväärselt.

Taasta tõrge teenuse peatatud olekus ja käivita see siis samas kasutajas esiplaanil, kui implementatsioon seda lubab. Viga, mida näed, on parem kui logirida, mida pead oletama, ja see teeb selgeks erinevuse võimekuse probleemi ning SELinuxi või AppArmori keeldumise vahel.

Seo iga toiming ühe volitusega

Tabel on algkaart, mitte implementatsiooni dokumentatsiooni asendaja:

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

Selle tabeli kaks rida on need, mida inimesed segamini ajavad. /dev/net/tun avamine on failiõiguste küsimus; tuumal paluda seadistada seda, mille avasid, on võimekuse küsimus. CAP_NET_ADMIN andmine ei paranda seadme sõlme, mida sinu teenusekasutaja lugeda ei saa, ja sõlme parandamine ei anna sulle marsruudi volitust. Kontrolli mõlemat enne, kui muudad kumbagi.

Tuumas olev WireGuard ja kasutajaruumi tunneliprogrammid ei ole samuti samade nõuetega. Tuumamooduli tee seadistab olemasolevat liidest netlinki kaudu, samas kui kasutajaruumi implementatsioon võib vajada ka seadet ja mõne transpordi puhul töötlemata sokleid.

Loe konteksti: teenus, konteiner või kest

Võimekus hosti võrgu nimeruumis võib mõjutada palju enamat kui sama toiming teadlikult isoleeritud virnas. Konteinerite käituskeskkond algab tavaliselt vähendatud piirikomplektiga; NET_ADMIN lisamine konteinerile, mis jagab hosti võrku, on palju suurem õigus kui selle lisamine konteinerile, millel on oma võrgu nimeruum ja hosti ühenduspunktid puuduvad.

Systemd-üksuste puhul loe, mida tegelikult rakendatakse, mitte seda, mida üksusefail näib ütlevat: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities teatab efektiivsed väärtused, mille võib olla seadnud drop-in, mille oled unustanud. Küsi efektiivset väärtust, mitte kunagi kavatsetud väärtust. Ambient-võimekused on olulised, sest mitte-root teenus kaotab võimekused üle exec ilma nendeta.

Võta aluseks paketi või kujutise toetatud seadistus. Ära lisa töötlemata sokli õigusi ega privilegeeritud režiimi sellepärast, et teine õpetus loetles need teise tööriista jaoks; see arutluskäik ei kanna midagi üle ja maksab sulle isolatsiooni, mille eest maksid. Kahtluse korral ära anna midagi ja loe implementatsiooni märkmeid täpselt selle toimingu kohta, mida vajad.

Jälgi, mis juhtub pärast privileegide langust

Paljud deemonid käivituvad privilegeeritult, seadistavad liidese, lähevad siis üle mitteprivilegeeritud kasutajale ja hoiavad tunnelit. Sellest hetkest ei saa protsess enam lisada marsruuti, ümber kirjutada tulemüüri reeglit ega avada uut privilegeeritud seadet, mis on korras seni, kuni taasühendus vajab täpselt seda. Hiljem failide lugemine ja konksude käivitamine võivad samal põhjusel ebaõnnestuda.

Testi kogu elutsüklit, mitte esimest sekundit: käivitamine, uuendamine või taasühendus ja peatamisel puhastamine. Esimene edukas liidese loomine ei tõesta, et iga hilisem privilegeeritud toiming ikka töötab, ja tõrge ilmneb tavaliselt tunde hiljem tootmises.

Implementatsioonid, mis hoiavad tunnelit avatuna üle kasutajavahetuse, seovad selle tavaliselt valikutega tunnelit ja võtmeid säilitada. Systemdi poolel on samaväärne küsimus, kas üksuse võimekuste komplekt elab üle sinu seadistatud kasutajavahetuse.

Kirjuta üles antud õigus ja selle põhjus

Kirjuta üles täpne õigus, toiming, mida see võimaldab, ja viga, mille see parandas. Üks rida juurutamise märkmetes — „CAP_NET_ADMIN üksuse võrgu nimeruumis, vajalik marsruudimuudatusteks pärast taasühendust“ — on küllaldane, et takistada järgmisel inimesel õigust uuesti laiendada.

Seejärel loe efektiivne komplekt uuesti pärast iga uuendust. Tootjad lisavad funktsioone, kujutised muudavad vaikeväärtusi ja võimekus, mis oli eelmisel aastal tarbetu, võib ilma kellegi märkamata muutuda kandvaks.

Seotud artiklid