Modo affidabile per eseguire il jailing dei processi figlio usando `nsenter:`


15

So che gli spazi dei nomi di Linux, tra le altre cose, possono essere sfruttati per gestire in modo sicuro i processi figlio limitanti e imprigionati senza alcuna possibilità che vengano zombiati e scaricati init. Ma sono sfocato sui dettagli di implementazione. Come potrei usare gli strumenti forniti da util-linuxcome mounte nsenterper guardare, monitorare e garantire che tutti i processi avviati siano i discendenti diretti dello spazio dei nomi di un altro processo?

Risposte:


19

Creare uno spazio dei nomi PID

Il comando corretto da usare qui è unshare. Si noti che le opzioni necessarie per farlo sono disponibili solo da util-linux 2.23. L'idea è quella di creare un nuovo spazio dei nomi PID per il programma in esecuzione in modo tale che anche tutti i suoi figli vengano creati in questo spazio dei nomi. È possibile eseguire un comando in un nuovo spazio dei nomi PID semplicemente facendo:

sudo unshare -fp some_command

Per eseguire una shell, basta omettere il comando. Ciò creerà un processo che, insieme a uno qualsiasi dei suoi figli, avrà un PID come al solito all'interno dello spazio dei nomi padre (sistema). Tuttavia, all'interno del nuovo spazio dei nomi, avrà un PID 1insieme ad alcune delle caratteristiche speciali del initprocesso. Forse la caratteristica più rilevante dal punto di vista del monitoraggio è che se uno qualsiasi dei suoi discendenti è orfano, verranno ricondizionati a questo processo piuttosto che al initprocesso reale .

Fare semplicemente questo potrebbe essere sufficiente per la maggior parte dei casi di monitoraggio. Come accennato in precedenza, i processi all'interno dello spazio dei nomi hanno tutti PID all'interno dello spazio dei nomi padre, quindi è possibile utilizzare comandi regolari per monitorare la loro attività. Siamo inoltre certi che se qualsiasi processo nello spazio dei nomi diventa orfano, non cadrà dai rami dell'albero dei processi sotto il PID del programma di livello superiore, il che significa che può ancora essere facilmente monitorato.

Combina con uno spazio dei nomi di mount

Tuttavia, ciò che non possiamo fare è monitorare il processo rispetto al PID che ritiene abbia. Per fare ciò, e in particolare per poter usare il pscomando nel nuovo spazio dei nomi, è necessario montare un procfsfilesystem separato per lo spazio dei nomi. Questo a sua volta porta a un altro problema poiché l'unica posizione che psaccetta procfsè /proc. Una soluzione sarebbe quella di creare una chrootprigione e montare procfslì il nuovo . Ma questo è un approccio ingombrante in quanto come minimo dovremmo copiare (o almeno hard link) tutti i binari che intendiamo usare insieme a tutte le librerie da cui dipendono dalla nuova radice.

La soluzione è utilizzare anche un nuovo spazio dei nomi di mount . All'interno di questo possiamo montare il nuovo procfsin un modo che utilizza la vera /procdirectory root , può essere utilizzabile nello spazio dei nomi PID e non interferisce con nient'altro. Per rendere questo processo molto semplice, il unsharecomando offre l' --mount-procopzione:

sudo unshare -fp --mount-proc some_command

Ora l'esecuzione psall'interno degli spazi dei nomi combinati mostrerà solo i processi con lo spazio nams PID e mostrerà il processo di livello superiore come avere un PID di 1.

Che dire nsenter?

Come suggerisce il nome, nsenterpuò essere utilizzato per inserire uno spazio dei nomi con cui è già stato creato unshare. Ciò è utile se vogliamo ottenere informazioni disponibili solo all'interno dello spazio dei nomi da uno script altrimenti non correlato. Il modo più semplice è accedere a dare il PID di qualsiasi programma in esecuzione all'interno dello spazio dei nomi. Per essere chiari, questo deve essere il PID del programma di destinazione all'interno dello spazio dei nomi da cui nsenterviene eseguito (poiché gli spazi dei nomi possono essere nidificati, è possibile che un singolo processo abbia molti PID). Per eseguire una shell nello spazio dei nomi PID / mount di destinazione, è sufficiente:

sudo nsenter -t $PID -m -p

Se questo spazio dei nomi è impostato come sopra, psora elencherà solo i processi all'interno di quello spazio dei nomi.


Grazie Graeme. Questo ha già risposto alla domanda e altro ancora. Ciò che in realtà mi ha chiesto di leggere era leggere le note dalla pagina man di procfs sui vari file in / proc / pid / ns / * che dice: "Associa il montaggio di questo file (vedi mount (2)) a un altro punto del filesystem mantiene il ... spazio dei nomi del processo specificato da pid attivo anche se tutti i processi attualmente nello spazio dei nomi terminano. " Quasi la stessa domanda, lo so, ma questo è già così buono che ho pensato che se lo ritieni pertinente potresti volerlo aggiungere. Linux.die.net/man/5/proc
mikeserv

Questo è trattato nell'ultima sezione dell'articolo LWN (basta cercare bind mount). Non ne sono davvero sicuro, poiché mantiene vivo lo spazio dei nomi PID ma dopo che il initprocesso di stile di livello superiore è morto, non puoi più crearlo.
Graeme,

Sì, non sono troppo sicuro per il resto. Ma con questa risposta e manun fine settimana per me intendo approfondire la mia conoscenza. Grazie ancora. Forse ha più rilevanza nello --user spazio dei nomi.
Mikeserv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.