User Namespace
Taarifa Msingi
User Namespace ni kipengele cha kernel ya Linux ambacho hutoa kujitenga kwa ramani za kitambulisho cha mtumiaji na kikundi, kuruhusu kila user namespace kuwa na seti yake ya kitambulisho cha mtumiaji na kikundi. Kujitenga huku kunawezesha michakato inayotumia user namespaces to kuwa na mamlaka na umiliki tofauti, hata kama wanashiriki kitambulisho cha mtumiaji na kikundi sawasawa kwa idadi.
User namespaces ni muhimu sana katika uwekaji wa kontena, ambapo kila kontena inapaswa kuwa na seti yake ya kujitegemea ya kitambulisho cha mtumiaji na kikundi, kuruhusu usalama na kujitenga bora kati ya kontena na mfumo mwenyeji.
Jinsi inavyofanya kazi:
Wakati user namespace mpya inaundwa, inaanza na seti tupu ya ramani za kitambulisho cha mtumiaji na kikundi. Hii inamaanisha kuwa mchakato wowote unaotumia user namespace mpya kwa kuanzia hautakuwa na mamlaka nje ya namespace.
Ramani za kitambulisho zinaweza kuwekwa kati ya kitambulisho cha mtumiaji na kikundi katika user namespace mpya na zile katika namespace ya mzazi (au mwenyeji). Hii inaruhusu michakato katika user namespace mpya kuwa na mamlaka na umiliki unaolingana na kitambulisho cha mtumiaji na kikundi katika namespace ya mzazi. Walakini, ramani za kitambulisho zinaweza kuzuiliwa kwa safu na subset maalum za kitambulisho, kuruhusu udhibiti wa kina juu ya mamlaka zinazotolewa kwa michakato katika user namespace mpya.
Ndani ya user namespace, michakato inaweza kuwa na mamlaka kamili ya mizizi (UID 0) kwa shughuli ndani ya namespace, wakati bado ina mamlaka mdogo nje ya namespace. Hii inaruhusu kontena kufanya kazi na uwezo kama mizizi ndani ya namespace yake bila kuwa na mamlaka kamili ya mizizi kwenye mfumo mwenyeji.
Michakato inaweza kuhamia kati ya namespaces kwa kutumia wito wa mfumo wa
setns()
au kuunda namespaces mpya kwa kutumia wito wa mfumo waunshare()
auclone()
na bendera yaCLONE_NEWUSER
. Wakati mchakato unahamia kwenye namespace mpya au kuunda moja, itaanza kutumia ramani za kitambulisho cha mtumiaji na kikundi zinazohusiana na namespace hiyo.
Maabara:
Unda Namespaces Tofauti
CLI
Kwa kusakinisha kipengele kipya cha mfumo wa faili ya /proc
ikiwa unatumia paramu --mount-proc
, unahakikisha kuwa kipengele kipya cha kufunga kinaona taarifa sahihi na iliyotengwa ya mchakato maalum kwa kipengele hicho.
Docker
Kutumia user namespace, kifaa cha Docker kinahitaji kuanzishwa na --userns-remap=default
(Katika ubuntu 14.04, hii inaweza kufanywa kwa kubadilisha /etc/default/docker
na kisha kutekeleza sudo service docker restart
)
Angalia ni namespace gani mchakato wako uko ndani yake
Inawezekana kuangalia ramani ya mtumiaji kutoka kwenye chombo cha docker kwa kutumia:
Au kutoka kwenye mwenyeji na:
Tafuta majina yote ya nafasi za mtumiaji
Pia, unaweza ingia kwenye namespace ya mchakato mwingine ikiwa wewe ni root. Na huwezi kuingia kwenye namespace nyingine bila kigeuzi kinachoelekeza kwake (kama vile /proc/self/ns/user
).
Unda namespace mpya ya mtumiaji (na ramani)
Kurejesha Uwezo
Katika kesi ya majina ya watumiaji, wakati jina jipya la mtumiaji linapoundwa, mchakato unaotumia jina hilo linapewa seti kamili ya uwezo ndani ya jina hilo. Uwezo huu unaruhusu mchakato kufanya operesheni za kihalali kama vile kufunga mfumo wa faili, kuunda vifaa, au kubadilisha umiliki wa faili, lakini tu ndani ya muktadha wa jina lake la mtumiaji.
Kwa mfano, wakati una uwezo wa CAP_SYS_ADMIN
ndani ya jina la mtumiaji, unaweza kufanya operesheni ambazo kwa kawaida zinahitaji uwezo huu, kama vile kufunga mfumo wa faili, lakini tu ndani ya muktadha wa jina lako la mtumiaji. Operesheni yoyote unayofanya na uwezo huu haitaathiri mfumo mwenyeji au majina mengine.
Kwa hiyo, hata kama kupata mchakato mpya ndani ya Jina jipya la Mtumiaji kutakupa uwezo wote tena (CapEff: 000001ffffffffff), kimsingi unaweza kutumia tu wale unaohusiana na jina la mtumiaji (kama vile kufunga) lakini sio wote. Kwa hiyo, hii pekee haitoshi kutoroka kutoka kwenye kontena ya Docker.
```bash # There are the syscalls that are filtered after changing User namespace with: unshare -UmCpf bash
Probando: 0x067 . . . Error Probando: 0x070 . . . Error Probando: 0x074 . . . Error Probando: 0x09b . . . Error Probando: 0x0a3 . . . Error Probando: 0x0a4 . . . Error Probando: 0x0a7 . . . Error Probando: 0x0a8 . . . Error Probando: 0x0aa . . . Error Probando: 0x0ab . . . Error Probando: 0x0af . . . Error Probando: 0x0b0 . . . Error Probando: 0x0f6 . . . Error Probando: 0x12c . . . Error Probando: 0x130 . . . Error Probando: 0x139 . . . Error Probando: 0x140 . . . Error Probando: 0x141 . . . Error Probando: 0x143 . . . Error
Last updated