User Namespace
Osnovne informacije
User namespace je funkcionalnost Linux kernela koja omogućava izolaciju korisničkih i grupnih ID mapiranja, što omogućava svakom user namespace-u da ima svoj skup korisničkih i grupnih ID-ova. Ova izolacija omogućava procesima koji se izvršavaju u različitim user namespace-ima da imaju različite privilegije i vlasništvo, čak i ako numerički dele iste korisničke i grupne ID-ove.
User namespace-ovi su posebno korisni u kontejnerizaciji, gde svaki kontejner treba da ima svoj nezavisan skup korisničkih i grupnih ID-ova, što omogućava bolju bezbednost i izolaciju između kontejnera i host sistema.
Kako radi:
Kada se kreira novi user namespace, počinje sa praznim skupom korisničkih i grupnih ID-ova. To znači da će bilo koji proces koji se izvršava u novom user namespace-u inicijalno nemati privilegije izvan namespace-a.
Mapiranja ID-ova mogu se uspostaviti između korisničkih i grupnih ID-ova u novom namespace-u i onih u roditeljskom (ili host) namespace-u. Ovo omogućava procesima u novom namespace-u da imaju privilegije i vlasništvo koje odgovaraju korisničkim i grupnim ID-ovima u roditeljskom namespace-u. Međutim, mapiranja ID-ova mogu biti ograničena na određene opsege i podskupove ID-ova, što omogućava preciznu kontrolu nad privilegijama koje se dodeljuju procesima u novom namespace-u.
Unutar user namespace-a, procesi mogu imati punu root privilegiju (UID 0) za operacije unutar namespace-a, dok istovremeno imaju ograničene privilegije izvan namespace-a. Ovo omogućava kontejnerima da se izvršavaju sa privilegijama sličnim root-u unutar svog sopstvenog namespace-a, bez potpune root privilegije na host sistemu.
Procesi mogu prelaziti između namespace-a koristeći
setns()
sistemski poziv ili kreirati nove namespace-e koristećiunshare()
iliclone()
sistemski pozive saCLONE_NEWUSER
zastavicom. Kada proces pređe u novi namespace ili ga kreira, počeće da koristi mapiranja korisničkih i grupnih ID-ova koja su povezana sa tim namespace-om.
Lab:
Kreiranje različitih Namespace-ova
CLI
Montiranjem nove instance /proc
fajl sistema, koristeći parametar --mount-proc
, obezbeđujete da nova namespace montaža ima tačan i izolovan prikaz informacija o procesima specifičnim za tu namespace.
Docker
Da biste koristili korisnički prostor imena, Docker demon mora biti pokrenut sa --userns-remap=default
(U Ubuntu 14.04, ovo se može postići izmenom /etc/default/docker
datoteke, a zatim izvršavanjem sudo service docker restart
).
Proverite u kojem se prostoru imena nalazi vaš proces
Moguće je proveriti mapu korisnika iz Docker kontejnera pomoću:
Ili sa domaćina sa:
Pronađite sve korisničke namespace-ove
Uđite unutar korisničkog namespace-a
Kada se izvrši ova komanda, korisnik će biti prebačen u novi korisnički namespace. Ovo omogućava korisniku da izvršava komande sa privilegijama korisnika root unutar tog namespace-a, iako je zapravo običan korisnik na sistemu. Ovo može biti korisno za izvršavanje komandi koje zahtevaju privilegije root-a, bez potrebe za stvarnim root pristupom.
Takođe, možete ući u drugi procesni namespace samo ako ste root. I ne možete ući u drugi namespace bez deskriptora koji na njega ukazuje (poput /proc/self/ns/user
).
Kreiranje novog User namespace-a (sa mapiranjima)
Obnavljanje sposobnosti
U slučaju korisničkih namespace-ova, kada se kreira novi korisnički namespace, proces koji ulazi u namespace dobija pun set sposobnosti unutar tog namespace-a. Ove sposobnosti omogućavaju procesu da izvršava privilegovane operacije kao što su montiranje fajl sistema, kreiranje uređaja ili menjanje vlasništva fajlova, ali samo u kontekstu svog korisničkog namespace-a.
Na primer, kada imate sposobnost CAP_SYS_ADMIN
unutar korisničkog namespace-a, možete izvršavati operacije koje obično zahtevaju ovu sposobnost, poput montiranja fajl sistema, ali samo u kontekstu svog korisničkog namespace-a. Sve operacije koje izvršite sa ovom sposobnošću neće uticati na host sistem ili druge namespace-ove.
Stoga, čak i ako dobijete novi proces unutar novog korisničkog namespace-a dobijate sve sposobnosti nazad (CapEff: 000001ffffffffff), zapravo možete koristiti samo one koje su povezane sa namespace-om (na primer, montiranje), ali ne sve. Dakle, samo to nije dovoljno da biste pobegli iz Docker kontejnera.
```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