Kroken fungerer når du køyrer han for hand som root, og returnerer Operation not permitted i det augeblikket tenesta startar han. Fila endra seg ikkje mellom desse køyringane; miljøet gjorde det. systemd gir prosessen ei mindre verd: færre evner, ein annan /dev, skriveverna filsystemstigar og eit tak på talet på oppgåver. Les feilen som ei grense som avviste éin bestemd operasjon, ikkje som eit skript som gjekk i stykker.

Start ved operasjonen som vart avvist

Ei loggline som seier at eininga feila, fortel deg nesten ingenting. Den nyttige lina namngir kallet som vart avvist: ein einingknute som ikkje kunne opnast, ein mappe det ikkje kunne skrivast i, eit namnerom som ikkje kunne opprettast. Finn det kallet før du rører ein einaste direktiv, fordi kvar av dei svarar til ei anna avgrensing. Les deretter eininga som faktisk køyrde, inkludert drop-ins, i staden for fila pakken leverte.

Spørjinga nedanfor skriv ut fragmentstigen, drop-in-mappene og eigenskapane som tel for ei avvising av eining eller filsystem. Les alle før du avgjer kva grense som er relevant:

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'

Ingenting i den blokka skriv. Viss det avviste kallet manglar i journalen, auk detaljnivået til klienten for éi køyring i staden for å gissa på direktiv. Ein køyrande prosess beviser at eininga starta, ikkje at kroken køyrde med privilegia han trong.

Eit namnerom treng mount-rettar som ei TUN-eining aldri brukar

To operasjonar som ser like ut inne i éin krok, har ulike løyveprofilar. Det å opne /dev/net/tun og opprette grensesnittet krev nettverksadministrasjon pluss tilgang til den knuten. Å opprette eit namngitt nettverksnamnerom krev òg mount-arbeid, fordi namneromsverktøyet monterer ein fersk /sys vising og bind ein tilstandsmappe på plass. oppstraums klient-eining lèt medvite mount-administrasjonen liggje utanfor sitt bounding set, så namneromstrinnet vert avvist medan tunnelen sjølv ville ha fungert.

Difor bergar det ikkje skriptet å gi einingknuten. Ei einingløyve svarar på eitt spørsmål, om denne prosessen kan opne denne knuten, og namneromsspørsmålet er eit anna. Match det feilande kallet med evna før du utvidar noko.

Ein test i skalet ditt arvar alle evner ein ubunden root har, og eininga arvar det bounding setet heldt på. Dei to køyringane er ulike eksperiment sjølv når binærfila er identisk.

Einingar, verna stigar og tak for oppgåver

Når den avviste operasjonen er kjend, forklarar tre grupper med direktiv dei fleste feila. Einingstilgang vert styrt av PrivateDevices, som byter ut /dev med eit minimalt sett pseudoeiningar, og av DevicePolicy med DeviceAllow, som avgjer kva cgroupen tillèt. /dev/net/tun er ikkje ein del av det minimale settet, så ei eining med PrivateDevices=yes kan ikkje opne han, kva einingpolitikken enn seier.

Filsystemvern svarar på eit andre spørsmål. ProtectHome=yes gjer /home, /root og /run/user utilgjengelege, og ProtectSystem=full gjer /usr, /boot og /etc skriveverna. Difor fungerer ein krok som skriv ved sida av si eiga konfigurasjonsfil i skalet ditt og feilar under eininga, med same løyveform som ei manglande evne. Flytt det skrivbare innhaldet til ein stig politikken tillèt, eller legg til ein smal ReadWritePaths= oppføring.

Ressursgrenser er den tredje gruppa, og den minst openberre. TasksMax= avgrensar kor mange oppgåver eininga kan opprette, og eit tak på fildeskriptorar oppfører seg likt for sockets og handtak. Ei utrulling som har vakse forbi taket, feilar med ein ressursfeil i staden for ein løyvefeil, og difor tel den nøyaktige meldinga framleis.

Flytt namneromstrinnet ut av kroken

Førebuing som krev eit privilegium klienten ikkje skal ha, høyrer heime i si eiga eining. Ein oneshot som køyrer før klienten, held på resultatet sitt og er ordna før tilkoplinga, gir namneromstrinnet det det treng utan å overlate rettane til tunnelprosessen. Klienten viser deretter til den eininga i staden for å kalle skriptet frå sin up-krok.

Malen nedanfor er ein startform, ikkje noko ein brukar ulest. Han held førebuinga der privilegiet bur og lèt tunneleininga vere urørt:

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

Legg til rekkjefølgja med ein drop-in i staden for å redigere den pakka eininga, slik at ei oppgradering ikkje stille kan mista endringa di. Mappa er nøkla til instansnamnet, så ein andre profil treng si eiga fil:

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

Gjenta det same kallet etter endringa

Ein reparasjon vert stadfesta berre når det same kallet gir eit anna resultat. Start båe einingane på nytt, køyr operasjonen som feila, og samanlikn resultatet med logglina du lagra før endringa. Ei eining som startar medan kroken aldri køyrer igjen, er ikkje ein reparasjon.

Sekvensen nedanfor held samanlikninga ærleg, fordi han kontrollerer det avviste kallet og ikkje fargen på eininga. Lagre utdata hans ved sida av logglina du fanga før endringa:

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

Tel avvisingane i staden for å lese den siste lina, fordi ein krok kan feile, prøve på nytt og lukkast, og berre talet viser om grensa flytta seg. Legg att ei kommentar i drop-in-en som namngir direktivet du løyste på og grunnen, sidan neste oppgradering samanliknar konfigurasjonen din med den pakka standarden. Ei eining som berre startar når all vern er slått av, er ikkje reparert.

Relaterte artiklar