Man page - user_namespaces(7)

Packages contains this manual

Available languages:

en fr sv ja de

Manual

user_namespaces

NAMN
BESKRIVNING
NĂ€stade namnrymder, medlemskap i namnrymder
FörmÄgor
Effekten av förmÄgor inom en anvÀndarnamnrymd
Interaktion mellan anvÀndarnamnrymder och andra typer av namnrymder
AnvÀndar- och grupp-ID-avbildningar: uid_map och gid_map
Att definiera anvÀndar- och grupp-ID-avbildningar: att skriva till uid_mapoch gid_map
Projekt-ID-avbildningar: projid_map
Interaktion med systemanrop som Àndrar process-AID:n eller -GID:n
Filen /proc/pid/setgroups
Oavbildade anvÀndar- och grupp-ID:n
Åtkomst av filer
ÅtgĂ€rder med filrelaterade förmĂ„gor
SÀtt-anvÀndar-ID- och sÀtt-grupp-ID-program
Diverse
STANDARDER
NOTERINGAR
Global root
TillgÀnglighet
EXEMPEL
ProgramkÀllkod
SE ÄVEN
ÖVERSÄTTNING

NAMN

user_namespaces — översikt över Linux anvĂ€ndarnamnrymder

BESKRIVNING

För en översikt över namnrymder, se namespaces (7).

AnvÀndarnamnrymder isolerar sÀkerhetsrelaterade identifierare och attribut, mer exakt, anvÀndar-ID:n och grupp-ID:n (se credentials (7)), rotkatalogen, nycklar (se keyring (7)) och förmÄgor (se capabilities (7)). En process anvÀndar- och grupp-ID:n kan vara olika inuti och utanför en anvÀndarnamnrymd. I synnerhet kan en process ha ett normalt oprivilegierat anvÀndar-ID utanför en anvÀndarnamnrymd medan den pÄ samma gÄng har anvÀndar-ID:t 0 inuti namnrymden; med andra ord, processen har fullstÀndiga rÀttigheter vid ÄtgÀrder inuti anvÀndarnamnrymden, men Àr oprivilegierad vid ÄtgÀrder utanför namnrymden.

NĂ€stade namnrymder, medlemskap i namnrymder

AnvĂ€ndarnamnrymder kan nĂ€stas; det vill sĂ€ga, varje anvĂ€ndarnamnrymd — utom den initiala (”rot-”)namnrymden — har en förĂ€ldraanvĂ€ndarnamnrymd, och kan ha noll eller flera barnanvĂ€ndarnamnrymder. FörĂ€ldraanvĂ€ndarnamnrymden Ă€r anvĂ€ndarnamnrymden för processen som skapar anvĂ€ndarnamnrymden via ett anrop av unshare (2) eller clone (2) med flaggan CLONE_NEWUSER .

KÀrnan lÀgger (frÄn Linux 3.11) en grÀns pÄ 32 nÀstade nivÄer med anvÀndarnamnrymder. Anrop av unshare (2) eller clone (2) som annars skulle orsaka att denna grÀns överskrids misslyckas med felet EUSERS .

Varje process Àr medlem i exakt en anvÀndarnamnrymd. En process som skapas via fork (2) eller clone (2) utan flaggan CLONE_NEWUSER Àr medlem av samma anvÀndarnamnrymd som sin förÀlder. En enkeltrÄdad process kan gÄ in i en annan anvÀndarnamnrymd med setns (2) om den har CAP_SYS_ADMIN i den namnrymden; nÀr den gör det fÄr den en fullstÀndig uppsÀttning av förmÄgor i den namnrymden.

Ett anrop av clone (2) eller unshare (2) med flaggan CLONE_NEWUSER gör den nya barnprocessen (för clone (2)) eller anroparen (för unshare (2)) medlem av den nya anvÀndarnamnrymden som skapas av anropet.

ÅtgĂ€rden NS_GET_PARENT till ioctl (2) kan anvĂ€ndas för att upptĂ€cka förĂ€ldrarelationen mellan anvĂ€ndarnamnrymder; se ioctl_nsfs (2).

En uppgift som Àndrar ett av sina effektiva ID:n kommer ha sin dumpbarhet ÄterstÀlld till vÀrdet i /proc/sys/fs/suid_dumpable . Detta kan pÄverka Àgandet av proc-filer för barnprocesser och kan alltsÄ orsaka att förÀldern kommer att sakna rÀttigheter att skriva till avbildningsfiler för barnprocesser som kör i en ny anvÀndarnamnrymd. I dessa fall kan man genom att göra processen dumpbar med PR_SET_DUMPABLE i ett anrop av prctl (2) före en barnprocess skapas i en ny anvÀndarnamnrymd ÄtgÀrda detta problem. Se prctl 82) och proc (5) för detaljer om hur Àgarskap pÄverkas.

FörmÄgor

Barnprocesserna som skapas med clone (2) med flaggan CLONE_NEWUSER börjar med en fullstĂ€ndig uppsĂ€ttning av förmĂ„gor i den nya anvĂ€ndarnamnrymden. Likadant fĂ„r en process som skapar en ny anvĂ€ndarnamnrymd med unshare (2) eller gĂ„r in i en befintlig anvĂ€ndarnamnrymd med setns (2) en fullstĂ€ndig uppsĂ€ttning rĂ€ttigheter i den namnrymden. Å andra sidan har den processen inga förmĂ„gor i förĂ€lderns (i fallet clone (2)) eller tidigare (i fallet unshare (2) och setns (2)) anvĂ€ndarnamnrymd, Ă€ven om root-anvĂ€daren skapade eller gick in i den nya namnrymden (d.v.s., en process med anvĂ€ndar-ID 0 i rotnamnrymden).

Observera att ett anrop av execve (2) kommer göra att processens förmÄgor rÀknas om pÄ det vanliga sÀttet (se capabilities (7)). AlltsÄ, om inte processen har anvÀndar-ID 0 inom namnrymden, eller den körbara filen har en Àrvbar förmÄgemask som inte Àr tom, kommer processen förlora alla förmÄgor. Se diskussionen om anvÀndar- och grupp-ID-avbildningar nedan.

Ett anrop av clone (2) eller unshare (2) med flaggan CLONE_NEWUSER eller ett anrop av setns (2) som flyttar anroparen in i en annan anvĂ€ndarnamnrymd sĂ€tter flaggorna ”securebits” (se capabilities (7)) till sitt standardvĂ€rde (alla flaggor avslagna) i barnet (för clone (2)) eller anroparen (för unshare (2) eller setns (2)). Observera att eftersom anroparen inte lĂ€ngre har förmĂ„gor i sin originalanvĂ€ndarnamnrymd efter anropet av setns (2) Ă€r det inte möjligt för en process att Ă„terstĂ€lla sina flaggor ”securebits” medan den behĂ„ller sitt medlemskap i anvĂ€ndarnamnrymden genom att anvĂ€nda ett par av anrop av setns (2) för att flytta till en annan anvĂ€ndarnamnrymd och sedan Ă„tervĂ€nda till sin originalanvĂ€ndarnamnrymd.

Reglerna för att avgöra huruvida en process har en förmÄga eller inte i en viss anvÀndarnamnrymd Àr som följer:

‱

En process har en förmÄga inuti en anvÀndarnamnrymd om den Àr medlem av den namnrymden och den har förmÄgan i sin effektiva förmÄgemÀngd. En process kan fÄ förmÄgor i sin effektiva förmÄgemÀngd pÄ olika sÀtt. Till exempel kan den köra ett sÀtt-anvÀndar-ID-program eller en körbar fil associerad med filförmÄgor. Dessutom kan en process fÄ förmÄgor via effekten av clone (2), unshare (2) eller setns (2), som redan beskrivits.

‱

Om en process har en förmÄga i en anvÀndarnamnrymd, dÄ har den den förmÄgan i alla barn- (och mer avlÀgsna avkomme-)namnrymder ocksÄ.

‱

NĂ€r en anvĂ€ndarnamnrymd skapas sparar kĂ€rnan det effektiva anvĂ€ndar-ID:t för processen som skapar den som varandes â€Ă€garen” till namnrymden. En process som bor i förĂ€ldern till anvĂ€ndarnamnrymden och vars effektiva anvĂ€ndar-ID stĂ€mmer med Ă€garen till namnrymden har alla förmĂ„gor i namnrymden. Tack vare föregĂ„ende regel har processen alla förmĂ„gor i alla mer avlĂ€gsna avkommeanvĂ€ndarnamnrymder ocksĂ„. ÅtgĂ€rden NS_GET_OWNER_UID till ioctl (2) kan anvĂ€ndas för att upptĂ€cka anvĂ€ndar-ID för namnrymdens Ă€gare; se ioctl_nsfs (2).

Effekten av förmÄgor inom en anvÀndarnamnrymd

Att ha en förmÄga inuti en anvÀndarnamnrymd tillÄter en process att utföra ÄtgÀrder (som krÀver privilegier) endast pÄ resurser som styrs av den namnrymden. Med andra ord, att ha en förmÄga i en anvÀndarnamnrymd tillÄter en process att utföra privilegierade ÄtgÀrder pÄ resurser som styrs av (icke anvÀndar-)namnrymder som Àgs av (Àr associerade med) anvÀndarnamnrymden (se nÀsta underavdelning).

DÀremot finns det mÄnga privilegierade ÄtgÀrder som pÄverkar resurser som inte Àr associerade med nÄgon namnrymdstyp, till exempel, att Àndra systemtiden (d.v.s., kalendertiden) (som styrs av CAP_SYS_TIME ), att ladda kÀrnmoduler (som styrs av CAP_SYS_MODULE ) och att skapa en enhet (som styrs av CAP_MKNOD ). Endast en process med privilegier i den initiala anvÀndarnamnrymden kan utföra sÄdana ÄtgÀrder.

Att hÄlla CAP_SYS_ADMIN inom anvÀndarnamnrymden som Àger en process monteringsnamnrymd gör att den processen kan skapa bindmonteringar och montera följande typer av filsystem:

‱

/proc (frÄn Linux 3.8)

‱

/sys (frÄn Linux 3.8)

‱

devpts (frÄn Linux 3.9)

‱

tmpfs (5) (frÄn Linux 3.9)

‱

ramfs (frÄn Linux 3.9)

‱

mqueue (frÄn Linux 3.9)

‱

bpf (frÄn Linux 4.4)

‱

overlayfs (frÄn Linux 5.11)

Att hÄlla CAP_SYS_ADMIN inom anvÀndarnamnrymden som Àger en process cgroup-namnrymd gör (frÄn Linux 4.6) att den processen kan montera filsystemet cgroup version 2 och namngivna hierarkier av filsystemet cgroup verson 1 (d.v.s., cgroup-filsystem monterade med flaggan "none,name=" ).

Att hÄlla CAP_SYS_ADMIN inom anvÀndarnamnrymden som Àger en process PID-namnrymd gör (frÄn Linux 3.8) att den processen kan montera filsystemet /proc .

Observera dock att montering av blockbaserade filsystem endast kan göras av en process som hÄller CAP_SYS_ADMIN i den initiala anvÀndarnamnrymden.

Interaktion mellan anvÀndarnamnrymder och andra typer av namnrymder

Med början frÄn Linux 3.8 kan oprivilegierade processer skapa anvÀndarnamnrymder, och de andra typerna av namnrymder kan skapas med bara förmÄgan CAP_SYS_ADMIN i anroparens anvÀndarnamnrymd.

NÀr en annan namnrymd Àn en anvÀndarnamnrymd skapas Àgs den av anvÀndarnamnrymden processen som skapade den var en medlem i vid tidpunkten dÄ namnrymden skapades. Privilegierade ÄtgÀrder pÄ resurser som styrs av en icke-anvÀndarnamnrymd krÀver att processen har de nödvÀndiga förmÄgorna i anvÀndarnamnrymden som Àger den icke-anvÀndarnamnrymden.

Om CLONE_NEWUSER anges tillsammans med andra flaggor CLONE_NEW* i ett enskilt anrop av clone (2) eller unshare (2) garanteras det att anvÀndarnamnrymden skapas först vilket ger barnet ( clone (2)) eller anroparen ( unshare (2)) privilegier över de andra namnrymderna som skapas av anropet. Det Àr alltsÄ möjligt för en oprivilegierad anropare att ange denna kombination av flaggor.

NÀr en ny namnrymd (annan Àn en anvÀndarnamnrymd) skapas via clone (2) eller unshare (2) registrerar kÀrnan anvÀndarnamnrymden för processen som skapar den som Àgare till den nya namnrymden. (Denna koppling kan inte Àndras.) NÀr en process i den nya namnrymden senare utför privilegierade ÄtgÀrder som verkar pÄ globala resurser isolerade av namnrymden utförs rÀttighetskontrollerna enligt processens förmÄgor i anvÀndarnamnrymden som kÀrnan associerade med den nya namnrymden. Till exempel, antag att en process försöker Àndra vÀrdnamnet ( sethostname (2)), en resurs som styrs av UTS-namnrymden. I detta fall kommer kÀrnan avgöra vilken anvÀndarnamnrymd som Àger processens UTS-namnrymd, och kontrollera huruvida processen har den nödvÀndiga förmÄgan ( CAP_SYS_ADMIN ) i den anvÀndarnamnrymden.

ioctl (2)-ÄtgÀrden NS_GET_USERNS kan anvÀndas för att hitta anvÀndarnamnrymden som Àger en icke-anvÀndarnamnrymd; se ioctl_nsfs (2).

AnvÀndar- och grupp-ID-avbildningar: uid_map och gid_map

NÀr en anvÀndarnamnrymd skapas börjar den utan nÄgon avbildning av anvÀndar-ID:n (grupp-ID:n) till förÀlderns anvÀndarnamnrymd. Filerna /proc/ pid /uid_map och /proc/ pid /gid_map (tillgÀngliga frÄn Linux 3.5) visar avbildningarna för anvÀndar- och grupp-ID:n inuti anvÀndarnamnrymden för processen pid . Dessa filer kan lÀsas för att visa avbildningarna i en anvÀndarnamnrymd och skrivas till (en gÄng) för att definiera avbildningarna.

Beskrivningen i följande stycken förklarar detaljerna för uid_map ; gid_map Ă€r exakt likadan, med varje förekomst av ”anvĂ€ndar-ID” ersatt med ”grupp-ID”.

Filen uid_map visar avbildningen av anvÀndar-ID:n frÄn anvÀndarnamnrymden för processen som öppnade uid_map (men se en avvikelse frÄn denna punkt nedan). Med andra ord kan potentiellt processer som finns i olika anvÀndarnamnrymder se olika vÀrden nÀr de lÀser frÄn en viss uid_map -fil, beroende pÄ anvÀndar-ID-avbildningarna för anvÀndarnamnrymderna för de lÀsande processerna.

Varje rad i filen uid_map anger en 1-till-1-avbildning av ett intervall av sammanhÀngande anvÀndar-ID:n mellan tvÄ anvÀndarnamnrymder. (NÀr en anvÀndarnamnrymd först skapas Àr denna fil tom.) Specifikationen pÄ varje rad har formen tre tal avgrÀnsade av mellanslag. De första tvÄ talen anger det första anvÀndar-ID:t i vardera av de tvÄ anvÀndarnamnrymderna. Det tredje talet anger lÀngden pÄ det avbildade intervallet. Mer exakt tolkas fÀlten som följer:

(1)

Början av intervallet av anvÀndar-ID:n i processen pid s anvÀndarnamnrymd.

(2)

Början pÄ intervallet av anvÀndar-ID:n till vilka anvÀndar-ID:n som anges av fÀlt ett avbildas. Hur fÀlt tvÄ tolkas beror pÄ huruvida processen som öppnade uid_map och processen pid finns i samma anvÀndarnamnrymd, som följer:

(a)

Om de tvÄ processerna finns i olika anvÀndarnamnrymder: fÀlt tvÄ Àr början pÄ ett intervall av anvÀndar-ID:n i anvÀndarnamnrymden för processen som öppnade uid_map .

(b)

Om de tvÄ processerna finns i samma anvÀndarnamnrymd: fÀlt tvÄ Àr början pÄ intervallet av anvÀndar-ID:n i process pid s förÀldraanvÀndarnamnrymd. Detta gör att den som öppnar uid_map (det vanliga fallet hÀr Àr att öppna /proc/self/uid_map ) kan se avbildningen av anvÀndar-ID:n in i anvÀndarnamnrymden för processen som skapade denna anvÀndarnamnrymd.

(3)

LÀngden pÄ intervallet av anvÀndar-ID:n som avbildas mellan de tvÄ anvÀndarnamnrymderna.

Systemanrop som returnerar anvĂ€ndar-ID:n (grupp-ID:n) — till exempel getuid (2), getgid (2), och kreditivfĂ€lten i posten som returneras av stat (2) — returnerar anvĂ€ndar-ID:t (grupp-ID:t) avbildat in i anroparens anvĂ€ndarnamnrymd.

NÀr en process begÀr tillgÄng till en fil avbildas dess anvÀndar- och grupp-ID:n in i den initiala anvÀndarnamnrymden i syfte att kontrollera rÀttigheterna och tilldela ID:n nÀr en fil skapas. NÀr en process hÀmtar filens anvÀndar- och grupp-ID:n via stat (2) avbildas ID:erna i den andra riktningen, för att skapa vÀrden relativt processens anvÀndar- och grupp-ID-avbildningar.

Den initiala anvÀndarnamnrymden har ingen förÀldranamnrymd, men för konsistensens skull tillhandahÄller kÀrnan tomfiler för anvÀndar- och grupp-ID-avbildningar för den namnrymden. Tittar man pÄ filen uid_map ( gid_map Àr likadan) frÄn ett skal i den initiala namnrymden ser man:

$ cat /proc/$$/uid_map
0 0 4294967295

Denna avbildning sĂ€ger oss att intervallet som startar med anvĂ€ndar-ID 0 i denna namnrymd översĂ€tts till ett intervall som startar med 0 i den (obefintliga) förĂ€ldranamnrymden, och att lĂ€ngden pĂ„ intervallet Ă€r det största 32-bitars teckenlösa heltalet. Detta lĂ€mnar 4294967295 (32-bitsvĂ€rdet -1) oavbildat. Detta Ă€r avsiktligt: (uid_t) -1 anvĂ€nds i flera grĂ€nssnitt (t.ex., setreuid (2)) som ett sĂ€tt att ange ”inget anvĂ€ndar-ID”. Genom att lĂ„ta (uid_t) -1 vara oavbildat och oanvĂ€ndbart garanteras att det inte kommer uppstĂ„ nĂ„gon förvirring vid anvĂ€ndning av dessa grĂ€nssnitt.

Att definiera anvÀndar- och grupp-ID-avbildningar: att skriva till uid_mapoch gid_map

Efter att en ny anvÀndarnamnrymd skapats kan filen uid_map för en av processerna i namnrymden skrivas till en gÄng för att definiera avbildningen av anvÀndar-ID:n i den nya anvÀndarnamnrymden. Ett försök att skriva mer Àn en gÄng till en uid_map -fil i en anvÀndarnamnrymd misslyckas med felet EPERM . Motsvarande regler gÀller för gid_map -filer.

Raderna som skrivs till uid_map ( gid_map ) mÄste lyda följande giltighetsregler:

‱

De tre fÀlten mÄste vara giltiga tal, och det sista fÀltet mÄste vara större Àn 0.

‱

Rader avslutas av nyradstecken.

‱

Det finns en grÀns pÄ antalet rader i filen. I Linux 4.14 och tidigare sattes denna grÀns (godtyckligt) till 5 rader. FrÄn Linux 4.15 Àr grÀnsen 340 rader. Dessutom mÄste antalet byte som skrivs till filen vara mindre Àn systemets sidstorlek, och skrivningen mÄste göras frÄn början av filen (d.v.s., lseek (2) och pwrite (2) kan inte anvÀndas för att skriva till nollskilda avstÄnd in i filen).

‱

Intervallet av anvÀndar-ID:n (grupp-ID:n) som anges pÄ varje rad fÄr inte överlappa med intervallerna pÄ nÄgra andra rader. I den ursprungliga implementationen (Linux 3.8) uppfylldes detta krav av en enkel implementation som lade till det ytterligare kravet att vÀrdena i bÄde fÀlt 1 och fÀlt 2 av följande rader mÄste vara i stigande numerisk ordning, vilket förhindrade nÄgra eljest giltiga avbildningar frÄn att skapas. Linux 3.9 och senare fixar denna begrÀnsning, och tillÄter alla giltiga uppsÀttningar av avbildningar som inte överlappar.

‱

Åtminstone en rad mĂ„ste skrivas till filen.

Skrivningar som bryter mot ovanstÄende regler misslyckas med felet EINVAL .

För att en process skall kunna skriva till filen /proc pid /uid_map ( /proc pid /gid_map ) mÄste alla följande rÀttighetskrav vara uppfyllda:

‱

Den skrivande processen mÄste ha förmÄgan CAP_SETUID ( CAP_SETGID ) i processen pid s anvÀndarnamnrymd.

‱

Den skrivande processen mÄste antingen finnas i namnrymden för process pid eller finnas i förÀldraanvÀndarnamnrymden till process pid .

‱

De avbildade anvÀndar-ID:na (grupp-ID:na) mÄste i sin tur ha en avbildning i förÀldraanvÀndarnamnrymden.

‱

Om man uppdaterar /proc/ pid /uid_map för att skapa en avbildning som avbildar till UID 0 i förÀldranamnrymden mÄste en av de följande vara sann:

(a)

om den skrivande processen finns i förÀldraanvÀndarnamnrymden, dÄ mÄste den ha förmÄgan CAP_SETFCAP i den anvÀndarnamnrymden; eller

(b)

om den skrivande processen finns i barnanvÀndarnamnrymden, dÄ mÄste processen som skapade anvÀndarnamnrymden ha haft förmÄgan CAP_SETFCAP nÀr namnrymden skapades.

Denna regel har funnits frÄn Linux 5.12. Den eliminerar en tidigare sÀkerhetsbrist varigenom en UID 0-process som saknar förmÄgan CAP_SETFCAP vilken behövs för att skapa en binÀr med namnrymdsfilförmÄgor (sÄ som det beskrivs i capabilities (7)) ÀndÄ kunde skapa en sÄdan binÀr genom följande steg:

(1)

Skapa en ny anvÀndarnamnrymd med identitetsavbildningen (d.v.s., AID 0 i den nya anvÀndarnamnrymden avbildas pÄ AID 0 i förÀldranamnrymden), sÄ att AID 0 bÄda namnrymderna Àr ekvivalent med samma root-anvÀndar-ID.

(2)

Eftersom barnprocessen har förmÄgan CAP_SETFCAP kunde den skapa en binÀr med namnrymdsfilförmÄgor som sedan skulle vara verkningsfulla i förÀldranamnrymden (eftersom root-anvÀndar-ID:t Àr desamma i de tvÄ namnrymderna).

‱

En av följande tvÄ fall gÀller:

(a)

Antingen har den skrivande processen förmÄgan CAP_SETUID ( CAP_SETGID ) i förÀldra anvÀndarnamnrymden.

‱

Inga ytterligare begrÀnsningar gÀller: processen kan göra avbildningar till godtyckliga anvÀndar-ID:n (grupp-ID:n) i förÀldraanvÀndarnamnrymden.

(b)

Eller i annat fall gÀller alla följande beskrivningar:

‱

Data som skrivs till uid_map ( gid_map ) mÄste bestÄ av en enda rad som avbildar den skrivande processens effektiva anvÀndar-ID (grupp-ID) i förÀldraanvÀndarnamnrymden till ett anvÀndar-ID (grupp-ID) i anvÀndarnamnrymden.

‱

Den skrivande processen mÄste ha samma effektiva anvÀndar-ID som processen som skapade anvÀndarnamnrymden.

‱

NÀr det gÀller gid_map mÄste först anvÀndning av systemanropet setgroups (2) nekas genom att skriva " deny " till filen /proc/ pid /setgroups (se nedan) före nÄgon skrivning till gid_map .

Skrivningar som strider mot ovanstÄende regler misslyckas med felet EPERM .

Projekt-ID-avbildningar: projid_map

Liksom för anvÀndar- och grupp-ID-avbildningar Àr det möjligt att skapa projekt-ID-avbildningar för anvÀndarnamnrymder. (Projekt-ID:n anvÀnds för diskkvoter; se setquota (8) och quotactl (2).)

Projekt-ID-avbildningar definieras genom att skriva till filen /proc/ pid /projid_map (som finns frÄn Linux 3.7).

Giltighetsreglerna för att skriva till filen /proc/ pid /projid_map Àr som för att skriva till filen uid_map ; brott mot dessa regler fÄr write (2) att misslyckas med felet EINVAL .

RÀttighetsreglerna för att skriva till filen /proc/ pid /projid_map Àr som följer:

‱

Den skrivande processen mÄste antingen finnas i namnrymden för process pid eller finnas i förÀldraanvÀndarnamnrymden till process pid .

‱

De avbildade projekt-ID:na mÄste i sin tur ha en avbildning i förÀldraanvÀndarnamnrymden.

Brott mot dessa regler fÄr write (2) att misslyckas med felet EPERM .

Interaktion med systemanrop som Àndrar process-AID:n eller -GID:n

I en anvÀndarnamnrymd dÀr filen uid_map inte har skrivits kommer systemanrop som Àndrar anvÀndar-ID:n att misslyckas. PÄ liknande sÀtt, om filen gid_map inte har skrivits kommer systemanrop som Àndrar grupp-ID:n att misslyckas. Efter att filerna uid_map och gid_map har skrivits kan endast de avbildade vÀrdena anvÀndas i systemanrop som Àndrar anvÀndar- och grupp-ID:n.

För anvÀndar-ID:n inkluderar de relevanta systemanropen setuid (2), setfsuid (2), setreuid (2) och setresuid (2). För grupp-ID:n inkluderar de relevanta systemanropen setgid (2), setfsgid (2), setregid (2), setresgid (2) och setgroups (2).

Att skriva " deny " till filen /proc/ pid /setgroups före man skriver till /proc/ pid /gid_map kommer permanent avaktivera setgroups (2) i en anvÀndarnamnrymd och tillÄta att man skriver till /proc/ pid /gid_map utan att ha förmÄgan CAP_SETGID i förÀldraanvÀndarnamnrymden.

Filen /proc/pid/setgroups

Filen /proc/ pid /setgroups visar strÀngen " allow " om processer i anvÀndarnamnrymden som innehÄller process pid fÄr lov att anvÀnda systemanropet setgroups (2); den visar " deny " om setgroups (2) inte tillÄts i den anvÀndarnamnrymden. Observera att oavsett vÀrdet i filen /proc/ pid /setgroups (och oavsett processens förmÄgor) Àr inte heller setgroups (2) tillÄtet om inte /proc/ pid /gid_map har satts Ànnu.

En privilegierad process (en med förmÄgan CAP_SYS_ADMIN i namnrymden) kan skriva endera av strÀngarna " allow " eller " deny " till denna fil före den skriver en grupp-ID-avbildning för denna anvÀndarnamnrymd till filen /proc/ pid /gid_map . Att skriva strÀngen " deny " förhindrar alla processer i anvÀndarnamnrymden frÄn att anvÀnda setgroups (2).

Essensen av begrÀnsningarna som beskrivs i föregÄende stycke Àr att det Àr tillÄtet att skriva till /proc/ pid /setgroups endast sÄ lÀnge som anrop av setgroups (2) Àr otillÄtet för att /proc/ pid /gid_map inte har satts. Detta sÀkerstÀller att en process inte kan gÄ över frÄn ett tillstÄnd dÀr setgroups (2) Àr tillÄtet till ett tillstÄnd dÀr setgroups (2) nekas; en process kan gÄ över endast frÄn att setgroups (2) Àr otillÄtet till att setgroups (2) Àr tillÄtet.

StandardvÀrdet i denna fil i den initiala anvÀndarnamnrymden Àr " allow ".

NÀr /proc/ pid /gid_map har skrivits till (vilket har effekten av att aktivera setgroups (2) i anvÀndarnamnrymden), Àr det inte lÀngre möjligt att göra setgroups (2) otillÄtet genom att skriva " deny " till /proc/ pid /setgroups (skrivningen misslyckas med felet EPERM ).

En barnnamnrymd Àrver instÀllningen av /proc/ pid /setgroups frÄn sin förÀlder.

Om filen setgroups har vÀrdet " deny ", dÄ kan inte senare systemanropet setgroups (2) Äteraktiveras (genom att skriva " allow " till filen) i den anvÀndarnamnrymden. (Försök att göra sÄ misslyckas med felet EPERM .) Denna begrÀnsning propagerar ner till alla barnanvÀndarnamnrymder till denna anvÀndarnamnrymd.

Filen /proc/ pid /setgroups lades till i Linux 3.19, men bakĂ„tporterades till mĂ„nga tidigare stabila kĂ€rnserier, eftersom den Ă„tgĂ€rdar ett sĂ€kerhetsproblem. Problemet rörde filer med rĂ€ttigheter sĂ„som ”rwx---rwx”. SĂ„dana filer ger fĂ€rre rĂ€ttigheter till ”gruppen” Ă€n de gör till â€Ă¶vriga”. Detta betyder att genom att slĂ€ppa grupper med setgroups (2) kan en process tillĂ„tas filĂ„tkomst som den inte tidigare hade. Före det fanns anvĂ€ndarnamnrymder var detta inte ett bekymmer, eftersom endast en privilegierad process (en med förmĂ„gan CAP_SETGID ) kunde anropa setgroups (2). Dock, med introduktionen av anvĂ€ndarnamnrymder blev det möjligt för en oprivilegierad process att skapa en ny namnrymd i vilken anvĂ€ndaren har alla privilegier. Detta tillĂ€t sedan tidigare oprivilegierade anvĂ€ndare att slĂ€ppa grupprivilegier och dĂ€rmed fĂ„ filĂ„tkomst som de inte tidigare hade. Filen /proc/ pid /setgroups lades till för att Ă„tgĂ€rda detta sĂ€kerhetsproblem, genom att neka alla vĂ€gar för en oprivilegierad process att slĂ€ppa grupper med setgroups (2).

Oavbildade anvÀndar- och grupp-ID:n

Det finns olika platser dÀr ett oavbildat anvÀndar-ID (grupp-ID) kan exponeras för anvÀndarrymden. Till exempel kan den första processen i en ny anvÀndarnamnrymd anropa getuid (2) innan en anvÀndar-ID-avbildning har definierats för namnrymden. I de flesta sÄdana fall konverteras ett oavbildat anvÀndar-ID till spillanvÀndar-ID:t (grupp-ID:t); standardvÀrdet pÄ spillanvÀndar-ID:t (grupp-ID:t) 65534). Se beskrivningarna av /proc/sys/kernel/overflowuid och /proc/sys/kernel/overflowgid i proc (5).

Fallen dĂ€r oavbildade ID:n avbildas pĂ„ detta sĂ€tt inkluderar systemanrop som returnerar anvĂ€ndar-ID:n ( getuid (2), getgid (2) och liknande), kreditiv som skickas över ett UNIX-domĂ€nsuttag, kreditiv som returneras av stat (2), waitid (2) och System V IPC ”ctl”-Ă„tgĂ€rder IPC_STAT , kreditiv som exponeras av /proc/ pid /status och filerna i /proc/sysvipc/* , kreditiv som returneras via fĂ€ltet si_uid i den siginfo_t som tas emot med en signal (se sigaction (2)), kreditiv som skrivs till processbokföringsfilen (se acct (5)) och kreditiv som returneras via POSIX notifieringar i meddelandeköer (se mq_notify (3)).

Det finns ett nÀmnvÀrt fall dÀr oavbildade anvÀndar- och grupp-ID:n inte konverteras till motsvarande spill-ID-vÀrde. NÀr man betraktar en fil uid_map eller gid_map i vilken det inte finns nÄgon avbildning för det andra fÀltet visas det fÀltet som 4294967295 (-1 som ett teckenlöst heltal).

Åtkomst av filer

För att avgöra rÀttigheterna nÀr en oprivilegierad process söker tillgÄng till en fil avbildas processkreditiven (AID, GID) och de aktiva filkreditiven tillbaka till vad de skulle vara i den initiala anvÀndarnamnrymden och jÀmförs sedan för att avgöra rÀttigheterna som processen har till filen. Detsamma Àr ocksÄ sant för andra objekt som anvÀnder Ätkomstmodellen med kreditiv plus rÀttighetsmasker, sÄsom System V IPC-objekt.

ÅtgĂ€rder med filrelaterade förmĂ„gor

Vissa förmÄgor tillÄter en process att kringgÄ olika begrÀnsningar som kÀrnan upprÀtthÄller nÀr den utför ÄtgÀrder pÄ filer som Àgs av andra anvÀndare eller grupper. Dessa förmÄgor Àr: CAP_CHOWN , CAP_DAC_OVERRIDE , CAP_DAC_READ_SEARCH , CAP_FOWNER och CAP_FSETID .

Inom en anvÀndarnamnrymd tillÄter dessa förmÄgor en process att kringgÄ reglerna om processen har den relevanta förmÄgan över filen, vilket betyder:

‱

processen har den relevanta effektiva förmÄgan i sin anvÀndarnamnrymd; och

‱

filens anvÀndar-ID och grupp-ID bÄda har giltiga avbildningar i anvÀndarnamnrymden.

FörmÄgan CAP_FOWNER behandlas nÄgot speciellt: den tillÄter en process att kringgÄ motsvarande regler sÄ lÀnge som Ätminstone filens anvÀndar-ID har en avbildning i anvÀndarnamnrymden (d.v.s., filens grupp-ID behöver inte ha en giltig avbildning).

SÀtt-anvÀndar-ID- och sÀtt-grupp-ID-program

NÀr en process inuti en anvÀndarnamnrymd kör ett program som Àr sÀtt-anvÀndar-ID (sÀtt-grupp-ID) Àndras processens effektiva anvÀndar- (grupp-)ID inuti namnrymden till det vÀrde som Àr avbildat för filens anvÀndar- (grupp-)ID. Dock, om antingen filens anvÀndar- eller grupp-ID inte har nÄgon avbildning inuti namnrymden ignoreras tyst biten sÀtt-anvÀndar-ID (sÀtt-grupp-ID): det nya programmet körs, men processens effektiva anvÀndar- (grupp-)ID lÀmnas orört. (Detta avspeglar semantiken hos att köra ett program med sÀtt-anvÀndar-ID eller sÀtt-grupp-ID som bor pÄ ett filsystem som monterades med flaggan MS_NOSUID , sÄsom beskrivs i mount (2).)

Diverse

NÀr en process anvÀndar- och grupp-ID:n skickas över ett UNIX-domÀnsuttag till en process i en annan anvÀndarnamnrymd (se beskrivningen av SCM_CREDENTIALS i unix (7)) översÀtts de till de motsvarande vÀrdena i enlighet med den mottagande processens anvÀndar- och grupp-ID-avbildningar.

STANDARDER

Linux.

NOTERINGAR

Under Ären har det funnits mÄnga funktioner som har lagts till till LinuxkÀrnan som har gjorts tillgÀngliga endast till privilegierade anvÀndare pÄ grund av deras potential att förvirra sÀtt-anvÀndar-ID-root-program. I allmÀnhet blir det sÀkert att tillÄta root-anvÀndaren i en anvÀndarnamnrymd att anvÀnda dessa funktioner eftersom det Àr omöjligt, sÄ lÀnge man finns i en anvÀndarnamnrymd, att fÄ fler privilegier Àn de som en anvÀndarnamnrymds root-anvÀndare har.

Global root

Termen ”global root” anvĂ€nds ibland som en kortform för anvĂ€ndar-ID 0 i den initiala anvĂ€ndarnamnrymden.

TillgÀnglighet

AnvÀndning av anvÀndarnamnrymder krÀver en kÀrna som Àr konfigurerad med alternativet CONFIG_USER_NS . AnvÀndarnamnrymder krÀver stöd i ett antal undersystem i hela kÀrnan. NÀr ett undersystem som inte stödjs konfigureras i kÀrnan Àr det inte möjligt att konfigurera stöd för anvÀndarnamnrymder.

Fram till Linux 3.8 stödde de mest relevanta subsystemen anvÀndarnamnrymder, men ett antal filsystem hade inte den nödvÀndiga infrastrukturen för att avbilda anvÀndar- och grupp-ID:n mellan anvÀndarnamnrymder. Linux 3.9 lade till det nödvÀndiga infrastrukturstödet till mÄnga av de ÄterstÄende ej stödda filsystemen (Plan 9 (9P), Andrew File System (AFS), Ceph, CIFS, CODA, NFS och OCFS2). Linux 3.12 lade till stöd till det sista av de ej stödda större filsystemen, XFS.

EXEMPEL

NedanstÄende program Àr skapat för att möjliggöra experimenterande med anvÀndarnamnrymder, liksom Àven andra typer av namnrymder. Det skapar namnrymder enligt specifikationen frÄn kommandoradsflaggor och kör sedan ett kommando inuti dessa namnrymder. Kommentarerna och funktionen usage () inuti programmet ger den fullstÀndiga förklaringen av programmet. Följande skalsession demonstrerar dess anvÀndning.

Först betraktar vi körtidsmiljön:

$ uname -rs # FörutsÀtter Linux 3.8 eller senare
Linux 3.8.0
$ id -u # Kör som en oprivilegierad anvÀndare
1000
$ id -g
1000

Starta nu ett skal i en ny anvÀndar- ( -U ), monterings- ( -m ) och PID- ( -p ) namnrymd, med anvÀndar-ID ( -M ) och grupp-ID ( -G ) 1000 avbildade pÄ 0 inuti anvÀndarnamnrymden:

$ ./userns_child_exec -p -m -U -M '0 1000 1' -G '0 1000 1' bash

Skalet har PID 1, för att det Àr den första processen i den nya PID-namnrymden.

bash$ echo $$
1

Att montera ett nytt /proc -filsystem och lista alla processerna som Àr synliga i den nya PID-namnrymden visar att skalet inte kan se nÄgra processer utanför PID-namnrymden:

bash$ mount -t proc proc /proc
bash$ ps ax
PID TTY STAT TIME COMMAND
1 pts/3 S 0:00 bash
22 pts/3 R+ 0:00 ps ax

Inuti anvÀndarnamnrymden har skalet anvÀndar- och grupp-ID 0, och den kompletta uppsÀttningen av tillÄtna och effektiva förmÄgor:

bash$ cat /proc/$$/status | egrep '^[UG]id'

Uid:

0

0

0

0

Gid:

0

0

0

0

bash$ cat /proc/$$/status | egrep '^Cap(Prm|Inh|Eff)'

CapInh:

0000000000000000

CapPrm:

0000001fffffffff

CapEff:

0000001fffffffff

ProgramkÀllkod

/* userns_child_exec.c
Licensed under GNU General Public License v2 or later
Skapa en barnprocess som kör ett skalkommando i nya namnrymder;
lÄt UID- och GID-avbildningar anges nÀr en anvÀndarnamnrymd
skapas.
*/
#define _GNU_SOURCE
#include <err.h>
#include <sched.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <signal.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <errno.h>
struct child_args {
char **argv; /* Kommando att köras av barnet, med argument */
int pipe_fd[2]; /* Rör anvÀnt för att synkronisera förÀlder och barn */
};
static int verbose;
static void
usage(char *pname)
{
fprintf(stderr, "AnvÀndning: %s [flaggor] kmd [arg
]\n\n", pname);
fprintf(stderr, "Skapa en barnprocess som kör ett skalkommando i "
"en ny anvÀndarnamnrymd,\n"
"och eventuellt Àven andra nya namnrymder.\n\n");
fprintf(stderr, "Flaggor kan vara:\n\n");
#define fpe(str) fprintf(stderr, " %s", str);
fpe("-i Ny IPC-namnrymd\n");
fpe("-m Ny monteringsnamnrymd\n");
fpe("-n Ny nÀtverksnamnrymd\n");
fpe("-p Ny PID-namnrymd\n");
fpe("-u Ny UTS-namnrymd\n");
fpe("-U Ny anvÀndarnamnrymd\n");
fpe("-M uid_map Ange AID-avbildning för anvÀndarnamnrymden\n");
fpe("-G gid_map Ange GID-avbildning för anvÀndarnamnrymden\n");
fpe("-z Avbilda anvÀndar-AID och -GID till 0 i anvÀndarnamnrymden\n");
fpe(" (ekvivalent med: -M '0 <aid> 1' -G '0 <gid> 1')\n");
fpe("-v Visa utförliga meddelanden\n");
fpe("\n");
fpe("Om -z, -M eller -G anges Àr -U nödvÀndigt.\n");
fpe("Det Àr inte tillÄtet att ange bÄde -z och nÄgon av -M eller -G.\n");
fpe("\n");
fpe("AvbildningsstrÀngar för -M och -G bestÄr av poster pÄ formen:\n");
fpe("\n");
fpe(" ID-inuti-nr ID-utanför-nr lÀngd\n");
fpe("\n");
fpe("En avbildningsstrÀng kan innehÄlla flera poster, separerade"
" av komman;\n");
fpe("kommatecknen ersÀtts med nyrader före skrivning"
" till avbildningsfiler.\n");
exit(EXIT_FAILURE);
}
/* Uppdatera avbildningsfilen 'map_fil', med vÀrdena som ges i
'avbildning', en strÀng som definierar en AID- eller GID-avbildning.
En AID- eller GID-avbildning bestÄr av en eller flera nyradsavgrÀnsade poster
pÄ formen:
ID_inuti-nr ID-utanför-nr lÀngd
Att begÀra att anvÀndaren skall ge en strÀng som innehÄller nyrader Àr
naturligtvis opraktiskt för kommandoradsanvÀndning. DÀrför tillÄter vi
anvÀndningen av komman för att avgrÀnsa poster i denna strÀng, och
ersÀtter dem med nyrader före vi skriver strÀngen till filen. */"
static void
update_map(char *mapping, char *map_file)
{
int fd;
size_t map_len; /* LÀngden pÄ \[aq]avbildning\[aq] */
/* ErsÀtt kommatecken i avbildningsstrÀngar med nyrader. */
map_len = strlen(mapping);
for (size_t j = 0; j < map_len; j++)
if (mapping[j] == ',')
mapping[j] = '\n';
fd = open(map_file, O_RDWR);
if (fd == -1) {
fprintf(stderr, "FEL: open %s: %s\n", map_file,
strerror(errno));
exit(EXIT_FAILURE);
}
if (write(fd, mapping, map_len) != map_len) {
fprintf(stderr, "FEL: write %s: %s\n", map_file,
strerror(errno));
exit(EXIT_FAILURE);
}
close(fd);
}
/* Linux 3.19 gjorde en Àndring av hanteringen av setgroups(2) och filen
'gid_map' för att ÄtgÀrda ett sÀkerhetsproblem. Problemet tillÀt
*oprivilegierade* anvÀndare att nyttja anvÀndarnamnrymder för att slÀppa
grupper. Följden av Àndringarna i 3.19 Àr att för att uppdatera filen
'gid_maps' mÄste först anvÀndning av systemanropet setgroups()
i denna anvÀndarnamnrymd avaktiveras genom att skriva "deny" till en
av filerna /proc/PID/setgroups för denna namnrymd. Det Àr syftet med
följande funktion. */
static void
proc_setgroups_write(pid_t child_pid, char *str)
{
char setgroups_path[PATH_MAX];
int fd;
snprintf(setgroups_path, PATH_MAX, "/proc/%jd/setgroups",
(intmax_t) child_pid);
fd = open(setgroups_path, O_RDWR);
if (fd == -1) {
/* Vi kan vara pÄ ett system som inte stödjer /proc/PID/setgroups.
I det fallet kommer filen inte att finnas, och systemet kommer
inte att pÄtvinga begrÀnsningarna som Linux 3.19 lade till. Det
Àr bra sÄ: vi behöver inte göra nÄgot för att tillÄta att
'gid_map' uppdateras.
Dock, om felet frÄn open() var nÄgot annat Àn felet ENOENT
som förvÀntas i det fallet, tala om det för anvÀndaren. */
if (errno != ENOENT)
fprintf(stderr, "FEL: open %s: %s\n", setgroups_path,
strerror(errno));
return;
}
if (write(fd, str, strlen(str)) == -1)
fprintf(stderr, "FEL: write %s: %s\n", setgroups_path,
strerror(errno));
close(fd);
}
static int /* Startfunktion för klonat barn */
childFunc(void *arg)
{
struct child_args *args = arg;
char ch;
/* VÀnta tills förÀldern har uppdaterat AID- och GID-avbildningarna.
Se kommentaren i main(). Vi vÀntar pÄ filslut frÄn ett rör som
kommer stÀngas av förÀldraprocessen nÀr den har uppdaterat
avbildningarna. */
close(args->pipe_fd[1]); /* StÀng vÄr beskrivare för skrivÀnden
av röret sÄ att vi ser EOF nÀr förÀldern
stÀnger sin beskrivare. */
if (read(args->pipe_fd[0], &ch, 1) != 0) {
fprintf(stderr,
"Fel i barnet: lĂ€sning frĂ„n röret returnerade ≠ 0\n");
exit(EXIT_FAILURE);
}
close(args->pipe_fd[0]);
/* Kör ett skalkommando. */
printf("I begrepp att göra exec %s\n", args->argv[0]);
execvp(args->argv[0], args->argv);
err(EXIT_FAILURE, "execvp");
}
#define STACK_SIZE (1024 * 1024)
static char child_stack[STACK_SIZE]; /* Utrymme för barnets stack */
int
main(int argc, char *argv[])
{
int flags, opt, map_zero;
pid_t child_pid;
struct child_args args;
char *uid_map, *gid_map;
const int MAP_BUF_SIZE = 100;
char map_buf[MAP_BUF_SIZE];
char map_path[PATH_MAX];
/* Tolka kommandoradsflaggor. Det inledande tecknet '+' i det
sista argumentet till getopt() förhindrar permutationer av
kommandoradsflaggor enligt GNU-stil. Det Àr anvÀndbart, eftersom
ibland 'kommandot' som skall köras av detta program sjÀlvt
har kommandoradsflaggor. Vi vill inte att getopt() skall hantera
dessa som flaggor till detta program. */
flags = 0;
verbose = 0;
gid_map = NULL;
uid_map = NULL;
map_zero = 0;
while ((opt = getopt(argc, argv, "+imnpuUM:G:zv")) != -1) {
switch (opt) {
case 'i': flags |= CLONE_NEWIPC; break;
case 'm': flags |= CLONE_NEWNS; break;
case 'n': flags |= CLONE_NEWNET; break;
case 'p': flags |= CLONE_NEWPID; break;
case 'u': flags |= CLONE_NEWUTS; break;
case 'v': verbose = 1; break;
case 'z': map_zero = 1; break;
case 'M': uid_map = optarg; break;
case 'G': gid_map = optarg; break;
case 'U': flags |= CLONE_NEWUSER; break;
default: usage(argv[0]);
}
}
/* -M eller -G utan -U Àr meningslöst */
if (((uid_map != NULL || gid_map != NULL || map_zero) &&
!(flags & CLONE_NEWUSER)) ||
(map_zero && (uid_map != NULL || gid_map != NULL)))
usage(argv[0]);
args.argv = &argv[optind];
/* Vi anvÀnder ett rör för att synkronisera förÀlder och barn, för
att sÀkerstÀlla att förÀldern stÀller in UID- och GID-avbildningarna
före barnet anropar execve(). Detta ser till att barnet behÄller
sina förmÄgor under execve() i det vanliga fallet dÄ vi vill avbilda
barnets effektiva anvÀndar-ID pÄ 0 i den nya anvÀndarnamnrymden.
Utan denna synkronisering skulle barnet tappa sina förmÄgor om det
utförde en execve() med anvÀndar-ID:n skilda frÄn noll (se
manualsidan capabilities(7) för detaljer om transformationen av en
process förmÄgor under execve()). */
if (pipe(args.pipe_fd) == -1)
err(EXIT_FAILURE, "pipe");
/* Skapa barnet i nya namnrymder. */
child_pid = clone(childFunc, child_stack + STACK_SIZE,
flags | SIGCHLD, &args);
if (child_pid == -1)
err(EXIT_FAILURE, "clone");
/* FörÀldern faller igenom hit. */
if (verbose)
printf("%s: PID för barnet som skapades av clone() Àr %jd\n",
argv[0], (intmax_t) child_pid);
/* Uppdatera UID- och GID-avbildningarna i barnet. */
if (uid_map != NULL || map_zero) {
snprintf(map_path, PATH_MAX, "/proc/%jd/uid_map",
(intmax_t) child_pid);
if (map_zero) {
snprintf(map_buf, MAP_BUF_SIZE, "0 %jd 1",
(intmax_t) getuid());
uid_map = map_buf;
}
update_map(uid_map, map_path);
}
if (gid_map != NULL || map_zero) {
proc_setgroups_write(child_pid, "deny");
snprintf(map_path, PATH_MAX, "/proc/%jd/gid_map",
(intmax_t) child_pid);
if (map_zero) {
snprintf(map_buf, MAP_BUF_SIZE, "0 %ld 1",
(intmax_t) getgid());
gid_map = map_buf;
}
update_map(gid_map, map_path);
}
/* StÀng skrivÀnden av röret för att signalera till barnet att vi
har uppdaterat UID- och GID-avbildningarna. */
close(args.pipe_fd[1]);
if (waitpid(child_pid, NULL, 0) == -1) /* Wait for child */
err(EXIT_FAILURE, "waitpid");
if (verbose)
printf("%s: avslutar\n", argv[0]);
exit(EXIT_SUCCESS);
}

SE ÄVEN

newgidmap (1), newuidmap (1), clone (2), ptrace (2), setns (2), unshare (2), proc (5), subgid (5), subuid (5), capabilities (7), cgroup_namespaces (7), credentials (7), namespaces (7), pid_namespaces (7)

KÀrnans kÀllfil Documentation/admin-guide/namespaces/resource-control.rst .

ÖVERSÄTTNING

Den svenska översÀttningen av denna manualsida skapades av Göran Uddeborg <goeran@uddeborg.se>

Denna översÀttning Àr fri dokumentation; lÀs GNU General Public License Version 3 eller senare för upphovsrÀttsvillkor. Vi tar INGET ANSVAR.

Om du hittar fel i översÀttningen av denna manualsida, skicka ett mail till Tp-sv@listor.tp-sv.se .