User Namespace
Informazioni di base
Uno spazio dei nomi utente è una funzionalità del kernel Linux che fornisce l'isolamento delle mappature degli ID utente e di gruppo, consentendo a ogni spazio dei nomi utente di avere il proprio set di ID utente e di gruppo. Questo isolamento consente ai processi in esecuzione in spazi dei nomi utente diversi di avere privilegi e proprietà diversi, anche se condividono gli stessi ID utente e di gruppo numericamente.
Gli spazi dei nomi utente sono particolarmente utili nella containerizzazione, dove ogni contenitore dovrebbe avere il proprio set indipendente di ID utente e di gruppo, consentendo una migliore sicurezza e isolamento tra i contenitori e il sistema host.
Come funziona:
Quando viene creato un nuovo spazio dei nomi utente, parte con un set vuoto di mappature degli ID utente e di gruppo. Ciò significa che qualsiasi processo in esecuzione nel nuovo spazio dei nomi utente inizialmente non avrà privilegi al di fuori dello spazio dei nomi.
Le mappature degli ID possono essere stabilite tra gli ID utente e di gruppo nello spazio dei nomi utente nuovo e quelli nello spazio dei nomi genitore (o host). Ciò consente ai processi nel nuovo spazio dei nomi di avere privilegi e proprietà corrispondenti agli ID utente e di gruppo nello spazio dei nomi genitore. Tuttavia, le mappature degli ID possono essere limitate a intervalli specifici e sottoinsiemi di ID, consentendo un controllo dettagliato sui privilegi concessi ai processi nel nuovo spazio dei nomi.
All'interno di uno spazio dei nomi utente, i processi possono avere privilegi di root completi (UID 0) per le operazioni all'interno dello spazio dei nomi, pur avendo ancora privilegi limitati al di fuori dello spazio dei nomi. Ciò consente ai contenitori di eseguire operazioni con capacità simili a root all'interno del proprio spazio dei nomi senza avere privilegi di root completi sul sistema host.
I processi possono spostarsi tra gli spazi dei nomi utilizzando la chiamata di sistema
setns()
o creare nuovi spazi dei nomi utilizzando le chiamate di sistemaunshare()
oclone()
con il flagCLONE_NEWUSER
. Quando un processo si sposta in un nuovo spazio dei nomi o ne crea uno, inizierà a utilizzare le mappature degli ID utente e di gruppo associate a tale spazio dei nomi.
Laboratorio:
Creare spazi dei nomi diversi
CLI
Montando una nuova istanza del filesystem /proc
utilizzando il parametro --mount-proc
, si garantisce che il nuovo namespace di montaggio abbia una visione accurata e isolata delle informazioni specifiche dei processi in quel namespace.
Docker
Per utilizzare il namespace utente, il demone Docker deve essere avviato con --userns-remap=default
(In Ubuntu 14.04, ciò può essere fatto modificando /etc/default/docker
e quindi eseguendo sudo service docker restart
)
Verifica in quale namespace si trova il tuo processo
È possibile verificare la mappatura degli utenti dal container Docker con:
O dal computer host con:
Trova tutti i namespace utente
Entra all'interno di uno User namespace
Inoltre, puoi entrare in un altro namespace di processo solo se sei root. E non puoi entrare in un altro namespace senza un descrittore che punti ad esso (come /proc/self/ns/user
).
Creare un nuovo User namespace (con mappature)
Recupero delle capacità
Nel caso dei namespace utente, quando viene creato un nuovo namespace utente, il processo che entra nel namespace ottiene un insieme completo di capacità all'interno di tale namespace. Queste capacità consentono al processo di eseguire operazioni privilegiate come il montaggio di filesystem, la creazione di dispositivi o la modifica della proprietà dei file, ma solo nel contesto del proprio namespace utente.
Ad esempio, quando si dispone della capacità CAP_SYS_ADMIN
all'interno di un namespace utente, è possibile eseguire operazioni che richiedono tipicamente questa capacità, come il montaggio di filesystem, ma solo nel contesto del proprio namespace utente. Le operazioni eseguite con questa capacità non influiscono sul sistema host o su altri namespace.
Pertanto, anche se ottenere un nuovo processo all'interno di un nuovo namespace utente ripristina tutte le capacità (CapEff: 000001ffffffffff), in realtà è possibile utilizzare solo quelle relative al namespace (ad esempio il montaggio), ma non tutte. Quindi, questo da solo non è sufficiente per evadere da un container 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