User Namespace
Basiese Inligting
'n Gebruikersnaamruimte is 'n Linux-kernelkenmerk wat afsondering van gebruikers- en groep-ID-toewysings bied, wat elke gebruikersnaamruimte in staat stel om sy eie stel gebruikers- en groep-ID's te hê. Hierdie afsondering maak dit moontlik dat prosesse wat in verskillende gebruikersnaamruimtes loop, verskillende voorregte en eienaarskap het, selfs as hulle dieselfde gebruikers- en groep-ID's numeries deel.
Gebruikersnaamruimtes is veral nuttig in konteinering, waar elke kontainer sy eie onafhanklike stel gebruikers- en groep-ID's moet hê, wat beter sekuriteit en afsondering tussen konteinere en die gasheerstelsel moontlik maak.
Hoe dit werk:
Wanneer 'n nuwe gebruikersnaamruimte geskep word, begin dit met 'n leë stel gebruikers- en groep-ID-toewysings. Dit beteken dat enige proses wat in die nuwe gebruikersnaamruimte loop, aanvanklik geen voorregte buite die naamruimte het nie.
ID-toewysings kan tot stand gebring word tussen die gebruikers- en groep-ID's in die nuwe naamruimte en dié in die ouer (of gasheer) naamruimte. Dit maak dit moontlik dat prosesse in die nuwe naamruimte voorregte en eienaarskap het wat ooreenstem met die gebruikers- en groep-ID's in die ouer naamruimte. Die ID-toewysings kan egter beperk word tot spesifieke reekse en subsets van ID's, wat fynbeheerde beheer oor die voorregte wat aan prosesse in die nuwe naamruimte verleen word, moontlik maak.
Binne 'n gebruikersnaamruimte kan prosesse volle root-voorregte (UID 0) hê vir operasies binne die naamruimte, terwyl hulle steeds beperkte voorregte buite die naamruimte het. Dit maak dit moontlik dat konteinere met root-agtige vermoëns binne hul eie naamruimte kan loop sonder om volle root-voorregte op die gasheerstelsel te hê.
Prosesse kan tussen naamruimtes beweeg deur die
setns()
-sisteemaanroep te gebruik of nuwe naamruimtes te skep deur dieunshare()
- ofclone()
-sisteemaanroep met dieCLONE_NEWUSER
-vlag te gebruik. Wanneer 'n proses na 'n nuwe naamruimte beweeg of een skep, begin dit die gebruikers- en groep-ID-toewysings wat met daardie naamruimte geassosieer is, gebruik.
Laboratorium:
Skep verskillende Naamruimtes
CLI
Deur 'n nuwe instansie van die /proc
-lêersisteem te monteer as jy die parameter --mount-proc
gebruik, verseker jy dat die nuwe berg-namespace 'n akkurate en geïsoleerde siening van die prosesinligting spesifiek vir daardie namespace het.
Docker
Om gebruikersnaamruimte te gebruik, moet die Docker-daemon begin word met --userns-remap=default
(In Ubuntu 14.04 kan dit gedoen word deur /etc/default/docker
te wysig en dan sudo service docker restart
uit te voer)
Kyk in watter naamruimte jou proses is
Dit is moontlik om die gebruikerskaart van die Docker-container te kontroleer met:
Of vanaf die gasheer met:
Vind alle Gebruiker namespaces
Betree binne 'n Gebruikersnaamruimte
Om binne 'n gebruikersnaamruimte in te gaan, kan jy die volgende stappe volg:
Kyk na die huidige gebruikersnaamruimte-inligting deur die volgende opdrag uit te voer:
Maak 'n nuwe gebruikersnaamruimte met behulp van die volgende opdrag:
Bevestig dat jy binne die nuwe gebruikersnaamruimte is deur die volgende opdrag uit te voer:
Deur hierdie stappe te volg, kan jy binne 'n gebruikersnaamruimte binnekom en die relevante funksies en bevoegdhede daarvan verken.
Verder kan jy slegs toegang kry tot 'n ander proses-namespace as jy root is. En jy kan nie toegang kry tot 'n ander namespace sonder 'n beskrywer wat daarna verwys nie (soos /proc/self/ns/user
).
Skep 'n nuwe Gebruikers-namespace (met karterings)
Herstel van Vaardighede
In die geval van gebruikersnamespaces, wanneer 'n nuwe gebruikersnamespace geskep word, word die proses wat die namespace betree, 'n volledige stel vaardighede binne daardie namespace toegeken. Hierdie vaardighede stel die proses in staat om bevoorregte handelinge uit te voer soos die koppel van lêersisteme, die skep van toestelle, of die verandering van eienaarskap van lêers, maar slegs binne die konteks van sy gebruikersnamespace.
Byvoorbeeld, as jy die CAP_SYS_ADMIN
vaardigheid binne 'n gebruikersnamespace het, kan jy handelinge uitvoer wat tipies hierdie vaardigheid vereis, soos die koppel van lêersisteme, maar slegs binne die konteks van jou gebruikersnamespace. Enige handelinge wat jy met hierdie vaardigheid uitvoer, sal nie die gasheerstelsel of ander namespaces beïnvloed nie.
Daarom, selfs al sal die verkryging van 'n nuwe proses binne 'n nuwe gebruikersnamespace alle vaardighede teruggee (CapEff: 000001ffffffffff), kan jy eintlik slegs diegene wat verband hou met die namespace gebruik (soos die koppel van lêers byvoorbeeld), maar nie almal nie. Dus is dit op sigself nie genoeg om uit 'n Docker-houer te ontsnap nie.
```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