Hook inafanya kazi unapoiendesha kwa mkono kama root na hurudisha Operation not permitted wakati ambapo huduma inaisababisha. Faili haikubadilika kati ya uendeshaji huo; mazingira yalibadilika. systemd inaipa mchakato ulimwengu mdogo: uwezo mdogo, /dev tofauti, njia za mfumo wa faili za kusoma tu na kikomo cha kazi. Soma kushindwa kama mpaka uliokataa operesheni moja mahususi, si kama script iliyovunjika.

Anza na operesheni iliyokataliwa

Mstari wa kumbukumbu unaosema unit ilishindwa haukuambii karibu chochote. Mstari muhimu unataja wito uliokataliwa: nodi ya kifaa ambayo haikuweza kufunguliwa, saraka ambayo haikuweza kuandikwa, nafasi ya majina ambayo haikuweza kuundwa. Tafuta wito huo kabla ya kugusa agizo moja, kwa sababu kila moja linaendana na kizuizi tofauti. Kisha soma unit iliyoendeshwa kweli, ikiwa ni pamoja na drop-in, badala ya faili iliyowasilishwa na kifurushi.

Swali lililo hapa chini linachapisha njia ya kipande, saraka za drop-in na sifa zinazojali kukataliwa kwa kifaa au mfumo wa faili. Zisome zote kabla ya kuamua ni mpaka upi unaohusika:

systemctl show "[email protected]" -p FragmentPath -p DropInPaths -p PrivateDevices -p DevicePolicy -p DeviceAllow -p ProtectHome -p ProtectSystem -p TasksMax
journalctl -u "[email protected]" -b --no-pager | grep -iE 'operation not permitted|permission denied|cannot open|failed'

Hakuna kinachoandika katika kizuizi hicho. Ikiwa wito uliokataliwa haupo kwenye jarida, ongeza ukweli wa mteja kwa uendeshaji mmoja badala ya kubahatisha maagizo. Mchakato unaoendelea unathibitisha kwamba unit ilianza, si kwamba hook iliendeshwa na haki zilizohitajika.

Nafasi ya majina inahitaji haki za mount ambazo kifaa cha TUN hakitumii kamwe

Operesheni mbili zinazofanana ndani ya hook moja zina maelezo tofauti ya ruhusa. Kufungua /dev/net/tun na kuunda kiolesura kunahitaji utawala wa mtandao pamoja na ufikiaji wa nodi hiyo. Kuunda nafasi ya majina ya mtandao iliyotajwa kunahitaji pia kazi inayohusiana na mount, kwa sababu zana ya nafasi ya majina inapachika mwonekano mpya wa /sys na inafunga saraka ya hali mahali pake. Unit ya mteja ya juu kwa makusudi inaacha utawala wa mount nje ya seti yake ya mipaka, kwa hiyo hatua ya nafasi ya majina inakataliwa wakati handaki yenyewe ingefanya kazi.

Ndiyo sababu kutoa nodi ya kifaa hakuokoi script. Ruhusa ya kifaa inajibu swali moja, kama mchakato huu unaweza kufungua nodi hii, na swali la nafasi ya majina ni lingine. Linganisha wito unaoshindwa na uwezo wake kabla ya kupanua chochote.

Jaribio katika shell yako hurithi kila uwezo ambao root asiye na kizuizi anao, na unit hurithi kile seti yake ya mipaka ilichobaki nacho. Uendeshaji huo mbili ni majaribio tofauti hata wakati binary ni sawa.

Vifaa, njia zilizolindwa na vikomo vya kazi

Mara operesheni iliyokataliwa inapojulikana, makundi matatu ya maagizo yanaelezea kushindwa nyingi. Ufikiaji wa kifaa unasimamiwa na PrivateDevices, inayobadilisha /dev na seti ndogo ya vifaa bandia, na kwa DevicePolicy pamoja na DeviceAllow, zinazoamua kile cgroup inaruhusu. /dev/net/tun si sehemu ya seti hiyo ndogo, kwa hiyo unit iliyo na PrivateDevices=yes haiwezi kuifungua bila kujali sera ya kifaa inasema nini.

Ulinzi wa mfumo wa faili unajibu swali la pili. ProtectHome=yes hufanya /home, /root na /run/user zisizofikika, na ProtectSystem=full hufanya /usr, /boot na /etc ziwe za kusoma tu. Hook inayoandika kando ya faili yake ya usanidi inafanya kazi katika shell yako na inashindwa chini ya unit, kwa umbo lile lile la ruhusa kama uwezo unaokosekana. Hamisha ingizo linaloweza kuandikwa kwenye njia ambayo sera inaruhusu, au ongeza ReadWritePaths= kiingilio chembamba.

Vikomo vya rasilimali ni kundi la tatu, na lisilodhihirika zaidi. TasksMax= huweka kikomo cha kazi ngapi unit inaweza kuunda, na kikomo cha vifaa vya kuelezea faili hufanya vivyo hivyo kwa soketi na vipini. Usambazaji uliokua kupita kikomo unashindwa na hitilafu ya rasilimali badala ya hitilafu ya ruhusa, ndiyo sababu ujumbe kamili bado ni muhimu.

Hamisha hatua ya nafasi ya majina kutoka kwenye hook

Maandalizi yanayohitaji haki ambayo mteja haipaswi kuwa nayo yanapaswa kuwa katika unit yake mwenyewe. Oneshot inayoendesha kabla ya mteja, inahifadhi matokeo yake na imepangwa mbele ya muunganisho inaipa hatua ya nafasi ya majina kile inachohitaji bila kukabidhi haki hizo kwa mchakato wa handaki. Mteja kisha hurejelea unit hiyo badala ya kuita script kutoka kwenye hook yake ya up.

Kiolezo kilicho hapa chini ni umbo la kuanzia, si kitu cha kutumia bila kukisoma. Kinahifadhi maandalizi mahali ambapo haki inaishi na kinaacha unit ya handaki bila kuguswa:

# /etc/systemd/system/[email protected]
[Unit]
Description=Namespace preparation for %i
Before=openvpn-client@%i.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/sbin/netns-up.sh %i
CapabilityBoundingSet=CAP_NET_ADMIN CAP_SYS_ADMIN
[Install]
WantedBy=multi-user.target

Ongeza mpangilio kwa drop-in badala ya kuhariri unit iliyofungashwa, ili uboreshaji usiweze kuondoa mabadiliko yako kimya kimya. Saraka imefungwa kwa jina la mfano, kwa hiyo wasifu wa pili unahitaji faili yake mwenyewe:

sudo mkdir -p /etc/systemd/system/[email protected]
sudo tee /etc/systemd/system/[email protected]/10-namespace.conf >/dev/null <<'CONF'
[Unit]
[email protected]
[email protected]
CONF
sudo systemctl daemon-reload

Rudia wito ule ule baada ya mabadiliko

Ukarabati unathibitishwa tu wakati wito ule ule unatoa matokeo tofauti. Anzisha upya unit zote mbili, endesha operesheni iliyoshindwa, na linganisha matokeo yake na mstari wa jarida uliouhifadhi kabla ya mabadiliko. Unit inayoanza wakati hook haendi tena kamwe si ukarabati.

Mfululizo ulio hapa chini unaweka ulinganisho uwe wa kweli, kwa sababu unakagua wito uliokataliwa badala ya rangi ya unit. Hifadhi matokeo yake kando ya mstari wa jarida ulioukamata kabla ya mabadiliko:

sudo systemctl restart "[email protected]" "[email protected]"
systemctl status "[email protected]" --no-pager
journalctl -u "[email protected]" -b --no-pager | grep -c 'Operation not permitted'
ip -brief addr show tun0

Hesabu kukataliwa badala ya kusoma mstari wa mwisho, kwa sababu hook inaweza kushindwa, kujaribu tena na kufanikiwa, na hesabu pekee inaonyesha kama mpaka ulisogea. Acha maoni katika drop-in yakitaja agizo ulilolegeza na sababu, kwa kuwa uboreshaji unaofuata unalinganisha usanidi wako na chaguo-msingi lililofungashwa. Unit inayoanza tu pale ulinzi wote umezimwa haijarekebishwa.

Makala zinazohusiana