Ni uwezo gani wa Linux unaohitajika kwa mchakato wako wa VPN?
Usanidi wa kiolesura, njia, ufikiaji wa kifaa na soketi za kawaida ni haki tofauti. Taja operesheni iliyoshindikana kabla ya kutoa CAP_NET_ADMIN.
Daemon ya VPN inahitaji shughuli za mtandao zenye upendeleo ingawa programu za kawaida hufungua soketi zinazotoka bila upendeleo wowote. Katika pengo hilo ndipo makosa mengi ya uwezo huanza: mtu anaona kosa la ruhusa, anatoa seti nzima, na huduma inafanya kazi kwa sababu ambazo hakuna anayeweza kuzieleza baadaye. Mwongozo ulio hapa chini unaanza na operesheni iliyoshindikana, unaihusisha na mamlaka moja, kisha unakagua muktadha ambao mchakato unaendeshwa kwa kweli. Kuendeshwa kama root asiye na kikomo ni jibu halali kwa usambazaji fulani, lakini inapaswa kuwa uamuzi na sio thamani ya chaguo-msingi.
Anza na operesheni iliyoshindikana
Soma kosa kabla ya kusoma mwongozo. «Operesheni hairuhusiwa» kwenye mabadiliko ya kiolesura, kukataa kufungua nodi ya kifaa na kushindikana kwa bind kwenye bandari ya chini ni matatizo matatu tofauti yenye ruhusa tatu tofauti. Ikiwa mchakato unaanza na unashindikana tu kwenye mabadiliko ya kwanza ya njia, hiyo pia inaonyesha kuwa uundaji wa kiolesura umefanikiwa tayari, jambo ambalo hupunguza jibu kwa kiasi kikubwa.
Zalisha kosa wakati huduma imesimamishwa, kisha iianzishe mbele chini ya mtumiaji yule yule ikiwa utekelezaji unaruhusu. Kosa unaloliona ni bora kuliko mstari wa kumbukumbu unaopaswa kukisia, na hufanya tofauti kati ya tatizo la uwezo na kukataliwa na SELinux au AppArmor iwe wazi.
Husisha kila operesheni na mamlaka moja
Jedwali ni ramani ya kuanzia, sio mbadala wa nyaraka za utekelezaji:
| Operation | Usual authority | Watch for |
|---|---|---|
| Create or configure tun/tap | CAP_NET_ADMIN in the relevant namespace | Creating the device and opening it are separate steps |
| Add routes, rules, firewall entries | CAP_NET_ADMIN | Same capability, different namespace than you think |
| Open /dev/net/tun | Device permissions, not a capability | Group membership or a udev rule may be enough |
| Raw sockets | CAP_NET_RAW | Needed by some user-space tunnel implementations |
| Bind a port below 1024 | CAP_NET_BIND_SERVICE | Irrelevant for most modern tunnel ports |
Mistari miwili katika jedwali hilo ndiyo ambayo watu huichanganya. Kufungua /dev/net/tun ni suala la ruhusa za faili; kuomba kernel isanidi kile ulichofungua ni suala la uwezo. Kutoa CAP_NET_ADMIN hakurekebishi nodi ya kifaa ambayo mtumiaji wako wa huduma hawezi kuisoma, na kurekebisha nodi hakukupi mamlaka ya njia. Kagua vyote viwili kabla ya kubadilisha kimoja.
WireGuard ya kernel na programu za handaki katika nafasi ya mtumiaji pia hazina mahitaji yanayofanana. Njia ya moduli ya kernel husanidi kiolesura kilichopo kupitia netlink, wakati utekelezaji wa nafasi ya mtumiaji unaweza pia kuhitaji kifaa na, kwa usafirishaji fulani, soketi ghafi.
Soma muktadha: huduma, kontena au shell
Uwezo katika nafasi ya majina ya mtandao ya mwenyeji unaweza kuathiri mengi zaidi kuliko operesheni hiyo hiyo ndani ya rafu iliyotengwa kwa makusudi. Mazingira ya uendeshaji wa kontena kwa kawaida huanza na seti iliyopunguzwa ya mipaka; kuongeza NET_ADMIN kwa kontena linaloshiriki mtandao wa mwenyeji ni ruhusa kubwa zaidi kuliko kuiongeza kwa lile lenye nafasi yake ya majina ya mtandao na lisilo na mount za mwenyeji.
Kwa vitengo vya systemd soma kinachotumika kwa kweli na sio kinachoonekana kusema faili ya kitengo: systemctl show -p CapabilityBoundingSet -p AmbientCapabilities huripoti thamani bora, ambazo zinaweza kuwekwa na drop-in uliyoisahau. Omba thamani bora, kamwe sio ile iliyokusudiwa. Uwezo wa ambient ni muhimu kwa sababu huduma isiyo ya root hupoteza uwezo kupitia exec bila hizo.
Chukua usanidi unaotumika wa kifurushi au taswira kama msingi. Usiongeze ruhusa za soketi ghafi au hali ya upendeleo kwa sababu mwongozo mwingine uliziorodhesha kwa chombo kingine; hoja hiyo haihamishi chochote na inakugharimu utengaji uliolipia. Ukiwa na shaka, usitoe chochote na usome maelezo ya utekelezaji kwa operesheni kamili unayohitaji.
Angalia kinachotokea baada ya upendeleo kushuka
Daemon nyingi huanza na upendeleo, husanidi kiolesura, kisha huhamia mtumiaji asiye na upendeleo na kubaki na handaki. Kuanzia hatua hiyo mchakato hauwezi tena kuongeza njia, kuandika upya kanuni ya firewall au kufungua kifaa kipya cha upendeleo, jambo ambalo ni sawa hadi muunganisho upya unahitaji hasa hilo. Usomaji wa faili na utekelezaji wa ndoano baadaye unaweza kushindikana kwa sababu hiyo hiyo.
Jaribu mzunguko mzima wa maisha na sio sekunde ya kwanza: kuanza, kuhuisha au kuunganisha upya, na kusafisha wakati wa kusimama. Mafanikio ya kwanza ya kuunda kiolesura hayaonyeshi kuwa kila operesheni ya upendeleo baadaye itaendelea kufanya kazi, na kushindikana kwa kawaida huonekana saa kadhaa baadaye katika uzalishaji.
Utekelezaji unaobakiza handaki wazi wakati wa mabadiliko ya mtumiaji kwa kawaida huunganisha hilo na chaguo za kuhifadhi handaki na funguo. Kwa upande wa systemd, swali sawa ni kama seti ya uwezo ya kitengo inastahimili mabadiliko ya mtumiaji uliyosanidi.
Rekodi ruhusa iliyotolewa na sababu yake
Andika ruhusa kamili, operesheni inayoiwezesha na kosa lililorekebishwa. Mstari mmoja katika maelezo ya usambazaji — «CAP_NET_ADMIN katika nafasi ya majina ya mtandao ya kitengo, inahitajika kwa mabadiliko ya njia baada ya kuunganisha upya» — unatosha kumzuia mtu anayefuata kupanua ruhusa tena.
Kisha soma tena seti bora baada ya kila uboreshaji. Wauzaji huongeza vipengele, taswira hubadilisha thamani za chaguo-msingi, na uwezo ambao haukuwa wa lazima mwaka jana unaweza kuwa unaobeba bila mtu yeyote kugundua.