Kakoak funtzionatzen du root gisa eskuz exekutatzen duzunean, eta itzultzen du Operation not permitted zerbitzuak abiarazten duen unean. Fitxategia ez zen aldatu exekuzio horien artean; ingurunea bai. systemd-k mundu txikiagoa ematen dio prozesuari: gaitasun gutxiago, beste /devbat, irakurtzeko soilik diren fitxategi-sistemako bideak eta zereginen sabaia. Irakurri hutsegitea eragiketa zehatz bat ukatu zuen muga gisa, hautsi zen script gisa beharrean.

Hasi ukatutako eragiketatik

Unitatea huts egin duela dioen log-lerro batek ia ezer ez dizu esaten. Lerro erabilgarriak ukatutako deia izendatzen du: ireki ezin izan zen gailu-nodo bat, idatzi ezin izan zen direktorio bat, sortu ezin izan zen izen-espazio bat. Aurkitu dei hori direktiba bakarra ukitu aurretik, bakoitza murrizketa desberdin bati dagokiolako. Gero irakurri benetan exekutatu zen unitatea, drop-in-ak barne, paketeak bidalitako fitxategiaren ordez.

Beheko kontsultak fragmentuaren bidea, drop-in direktorioak eta gailu edo fitxategi-sistema baten ukapenarako garrantzitsuak diren propietateak inprimatzen ditu. Irakurri guztiak muga zein den garrantzitsua erabaki aurretik:

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'

Bloke horretan ezerk ez du idazten. Ukatutako deia egunkarian falta bada, igo bezeroaren xehetasuna exekuzio bakarrerako, direktibak asmatu beharrean. Martxan dagoen prozesu batek unitatea abiarazi zela frogatzen du, ez kakoak behar zituen pribilegioekin funtzionatu zuela.

Izen-espazio batek TUN gailu batek inoiz erabiltzen ez dituen muntatze-eskubiak behar ditu

Kako beraren barruan berdinak diruditen bi eragiketek baimen-profil desberdinak dituzte. /dev/net/tun Irekitzeak eta interfazea sortzeak sare-administrazioa eta nodo horretarako sarbidea behar dituzte. Izen-espazio sare bat sortzeak ere muntatze-lana behar du, izen-espazio tresnak /sys bista berri bat muntatzen baitu eta egoera-direktorioa bere lekuan lotzen baitu. upstream bezero-unitateak muntatze-administrazioa nahita uzten du bere muga-multzoetatik kanpo, beraz izen-espazioaren pausua ukatzen da tunela bera funtzionatuko zukeen bitartean.

Horregatik gailu-nodoa emateak ez du scripta salbatzen. Gailu-baimenak galdera bakarrari erantzuten dio, prozesu honek nodo hau ireki dezakeen, eta izen-espazioaren galdera bestelakoa da. Lotu huts egiten duen deia bere gaitasunarekin ezer zabaldu aurretik.

Zure shell-eko proba batek root mugagabe batek dituen gaitasun guztiak heredatzen ditu, eta unitateak bere muga-multzoek gordetakoa heredatzen du. Bi exekuzioak esperimentu desberdinak dira bitarra bera izan arren.

Gailuak, babestutako bideak eta zeregin-sabaiak

Ukatutako eragiketa ezagututa, hiru direktiba-taldek azaltzen dituzte huts egite gehienak. Gailuetarako sarbidea honek arautzen du: PrivateDevices, honek ordezkatzen du /dev pseudo-gailuen multzo minimo batekin, eta DevicePolicy honekin DeviceAllow, cgroup-ak zer baimentzen duen erabakitzen dutenak. /dev/net/tun ez da multzo minimo horren parte, beraz PrivateDevices=yes duen unitate batek ezin du ireki, gailu-politikak zer esan ere.

Fitxategi-sistemaren babesak bigarren galdera bati erantzuten dio. ProtectHome=yes honek /home, /root eta /run/user eskuraezin egiten ditu, eta ProtectSystem=full honek /usr, /boot eta /etc irakurtzeko soilik egiten ditu. Beraz, bere konfigurazio-fitxategiaren ondoan idazten duen kako bat zure shell-ean funtzionatzen du eta unitatearen pean huts egiten du, gaitasun falta baten baimen-forma berarekin. Eraman idazteko sarrera politikak baimentzen duen bide batera, edo gehitu ReadWritePaths= sarrera estu bat.

Baliabide-mugak hirugarren taldea dira, eta begien bistakoena ez dena. TasksMax= honek unitateak zenbat zeregin sor ditzakeen mugatzen du, eta fitxategi-deskriptoreen sabaiak berdin jokatzen du socket eta heldulekuentzat. Sabaia gainditu duen inplementazio batek baliabide-errore batekin egiten du huts, baimen-errore batekin beharrean, eta horregatik mezu zehatzak oraindik axola du.

Atera izen-espazioaren pausua kakotik

Bezeroak izan behar ez duen pribilegio bat behar duen prestaketak bere unitate propioa behar du. Bezeroaren aurretik exekutatzen den, bere emaitza gordetzen duen eta konexioaren aurretik ordenatuta dagoen oneshot batek izen-espazioaren pausuari behar duena ematen dio, eskubide horiek tunel-prozesuari eman gabe. Ondoren bezeroak unitate horri erreferentzia egiten dio, script bere up kakotik deitu beharrean.

Beheko txantiloia hasierako forma bat da, ez irakurri gabe aplikatzeko zerbait. Prestaketa pribilegioa bizi den lekuan mantentzen du eta tunel-unitatea ukitu gabe uzten du:

# /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

Gehitu ordena drop-in batekin unitate paketatua editatu beharrean, beraz eguneraketak ezin du zure aldaketa isilean galdu. Direktorioa instantziaren izenari lotuta dago, beraz bigarren profilek bere fitxategia behar du:

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

Errepikatu deialdi bera aldaketaren ondoren

Konponketa deialdi berak emaitza desberdina ematen duenean baino ez da baieztatzen. Abiarazi berriro bi unitateak, exekutatu huts egin zuen eragiketa, eta alderatu bere emaitza aldaketaren aurretik gordetako log-lerroarekin. Kakoa berriro inoiz exekutatzen ez den bitartean abiarazten den unitatea ez da konponketa.

Beheko sekuentziak alderaketa zintzo mantentzen du, ukatu zen deia egiaztatzen duelako, unitatearen kolorea ez. Gorde bere irteera aldaketaren aurretik harrapatu zenuen log-lerroaren ondoan:

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

Zenbatu ukapenak azken lerroa irakurri beharrean, kakoak huts egin, berriro saiatu eta arrakasta dezakeelako, eta zenbaketa bakarrik erakusten du mugak mugitu diren. Utzi iruzkin bat drop-in-ean lasaitu zenuen direktibaren izenarekin eta arrazoiarekin, hurrengo eguneraketak zure konfigurazioa paketearen lehenespenarekin alderatzen baitu. Babes guztiak desaktibatu ondoren soilik abiarazten den unitatea ez da konpondu.

Erlazionatutako artikuluak