Huduma inaanza, kumbukumbu inalalamika kuwa haiwezi kufungua kifaa cha tun, na njia hazionekani kamwe. Endesha capsh --print kwenye shell yako na cap_net_admin iko hapo hapo, jambo linalofanya hitilafu ionekane haiwezekani. Kinachotofautiana kati ya shell yako na kitengo ni mpito wa upendeleo, si utayari wa kerneli kutoa uwezo huo. Pitia ukaguzi nne hapa chini kwa mpangilio na simama kwenye ule wa kwanza unaoeleza pengo.

Tenganisha uwezo unaokosekana na kifaa kilichofichwa

Hitilafu mbili zinaonekana sawa kutoka mstari wa kumbukumbu. Mchakato usio na CAP_NET_ADMIN hauwezi kuunda au kusanidi kiolesura cha handaki, na mchakato ambao sandbox yake inaficha /dev/net/tun hauwezi kuifungua kabisa. Kuongeza uwezo hakutatengeneza kisa cha pili.

Kagua kama kifaa kipo ndani ya nafasi ya majina ya huduma kabla ya kuhariri chochote. PrivateDevices=yes ni mstari wa kawaida wa uimarishaji unaoondoa nodi ya tun kabisa, na ProtectSystem yenye vikwazo inaweza kufanya njia ya usanidi kuwa ya kusoma tu kwa namna inayosomeka kama hitilafu ya ruhusa. Zote mbili hutoa mistari ya kumbukumbu inayotaja handaki, ndiyo sababu uwezo huo hulaumiwa. Thibitisha kwanza kwamba nodi ipo na inaweza kufunguliwa, kisha endelea.

Jua ni seti ipi ya uwezo unayoiangalia

Linux huhifadhi seti zilizoruhusiwa, tendaji, za kurithi, za kuzuia na za mazingira, na seti ya mazingira ndiyo inayosalia baada ya exec ya mtumiaji asiye root. Uwezo wa faili kwenye binarja unaweza kuhamisha haki zilizoruhusiwa na tendaji wakati wa exec, lakini kwa muda tu ambao hakuna kitu kwenye mnyororo kinachozuia uhamisho huo.

Hapa ndipo sudo huwapotosha watu. Amri inayoendeshwa kupitia sudo -u inaanzisha mpito mpya wa upendeleo na seti ya mazingira inatoweka, kwa hivyo ukaguzi ule ule unaofanikiwa kama root unashindwa hapo. Msimamizi wa huduma ni mpito mwingine tena, na haitoi chochote cha mazingira isipokuwa kitengo kinasema hivyo.

Toa uwezo ndani ya kitengo, si kwenye kifuniko

Sehemu ndogo ya huduma kwa handaki inayohitaji kuunda kifaa na kufunga njia inaonekana hivi.

[Unit]
Description=OpenVPN client, office profile
After=network-online.target

[Service]
Type=notify
User=openvpn
Group=openvpn
NoNewPrivileges=yes
AmbientCapabilities=CAP_NET_ADMIN
CapabilityBoundingSet=CAP_NET_ADMIN
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/office.conf

AmbientCapabilities huweka haki kwenye seti ya mazingira kabla mchakato haujaanza, na CapabilityBoundingSet huzuia mchakato kushikilia chochote nje ya orodha hiyo. NoNewPrivileges=yes huzuia upatikanaji wa upendeleo kupitia setuid au uwezo wa faili, wakati uwezo ambao kitengo hutoa kwa uwazi bado unatumika. Ongeza CAP_NET_BIND_SERVICE tu wakati huduma inapaswa kufunga bandari ya chini, na kamwe usiongeze CAP_SYS_ADMIN kwa sababu tu uzi wa jukwaa ulifanya hivyo.

Ikiwa kitengo kinafunga binarja ndani ya sudo, ondoa kifuniko. systemd tayari inatumia User=, na tabaka hilo la ziada ndilo sababu inayowezekana zaidi ya seti ya mazingira kuwa tupu.

Thibitisha dhidi ya mchakato hai, si faili ya kitengo

Soma kile ambacho msimamizi alitumia kwa kweli, kisha soma mchakato aliouzaa.

unit=openvpn-client@office
systemctl show -p User -p AmbientCapabilities "$unit"
systemctl show -p MainPID --value "$unit" | xargs -r getpcaps
grep -E '^Cap(Eff|Amb)' /proc/$(systemctl show -p MainPID --value "$unit")/status

Ikiwa kitengo kinaorodhesha uwezo na CapEff bado haina, drop-in fulani inapuuza mpangilio au hatua ya ExecStartPre inabadilisha mazingira. Tafuta jina la kitengo kwenye saraka za drop-in kabla ya kudhani faili kuu ndiyo yenye mamlaka, kwa sababu faili ya baadaye hushinda kwa kimya. Ikiwa kitengo na mchakato vyote vinaonyesha uwezo na handaki bado inashindwa, rudi kwenye ukaguzi wa kifaa na njia badala ya kupanua seti ya kuzuia. Kuipanua huficha sababu halisi na kuiacha huduma ikiwa na upendeleo zaidi kuliko ilivyokuwa.

Pendelea kuachia upendeleo baada ya kuanza

OpenVPN inaweza kuanza ikiwa na upendeleo kisha ishuke kwenye akaunti isiyo na upendeleo kupitia chaguo zake user na group, huku persist-key na persist-tun zikiiweka handaki iweze kutumika baadaye. Mpangilio huo hupunguza dirisha ambalo mchakato unashikilia haki, na mara nyingi unafaa zaidi kuliko kuanzisha daemon yote bila upendeleo ikiwa na uwezo wa kudumu.

Chagua modeli yoyote, anzisha upya kitengo na urudie ukaguzi baada ya kuwasha upya, kwa sababu huduma inayofanya kazi kutoka shell ya root ya mwingiliano lakini inashindwa wakati wa kuwasha huwa ni tofauti ya uwezo, kifaa au ruhusa ya faili. Andika mipangilio ya kitengo kando ya matokeo ya uwezo wa mchakato ili mkaguzi anayefuata aone kama sasisho la kifurushi au drop-in imesogeza mpaka.

Makala zinazohusiana