GNU/Linux >> Linux Esercitazione >  >> Linux

Come eseguire Chroot con gli spazi dei nomi Linux?

Dopo aver letto degli spazi dei nomi di Linux, ho avuto l'impressione che fossero, tra molte altre funzionalità, un'alternativa a chroot. Ad esempio, in questo articolo:

Altri usi [degli spazi dei nomi] includono […] l'isolamento in stile chroot() di un processo in una parte della gerarchia di directory singola.

Tuttavia, quando clono lo spazio dei nomi di montaggio, ad esempio con il comando seguente, vedo ancora l'intero albero radice originale.

unshare --mount -- /bin/bash

Comprendo che ora sono in grado di eseguire montaggi aggiuntivi nel nuovo spazio dei nomi che non sono condivisi con lo spazio dei nomi originale e quindi questo fornisce isolamento, ma è sempre la stessa radice, ad es. /etc è sempre lo stesso per entrambi gli spazi dei nomi. Ho ancora bisogno di chroot cambiare la radice o c'è un'alternativa?

Mi aspettavo che questa domanda fornisse una risposta, ma la risposta usa solo chroot , di nuovo.

EDIT #1

C'era un commento ora cancellato che menzionava pivot_root . Poiché questo fa effettivamente parte di linux/fs/namespace.c , fa infatti parte dell'implementazione degli spazi dei nomi. Ciò suggerisce di modificare la directory principale solo con unshare e mount non è possibile, ma i namespace forniscono una versione propria – più intelligente – di chroot . Tuttavia non ho l'idea principale di questo approccio che lo rende fondamentalmente diverso da chroot , anche dopo aver letto il codice sorgente (nel senso ad esempio di sicurezza o migliore isolamento).

EDIT #2

Questo non è un duplicato di questa domanda. Dopo aver eseguito tutti i comandi dalla risposta ho separato /tmp/tmp.vyM9IwnKuY (o simile), ma la directory principale è sempre la stessa!

Risposta accettata:

Immissione di uno spazio dei nomi di montaggio prima di impostare un chroot , ti consente di evitare di ingombrare lo spazio dei nomi host con montaggi aggiuntivi, ad es. per /proc . Puoi usare chroot all'interno di uno spazio dei nomi di montaggio come un trucco piacevole e semplice.

Penso che ci siano dei vantaggi nel comprendere pivot_root , ma ha un po' di una curva di apprendimento. La documentazione non spiega tutto... anche se c'è un esempio di utilizzo in man 8 pivot_root (per il comando della shell). man 2 pivot_root (per la chiamata di sistema) potrebbe essere più chiaro se facesse lo stesso e includesse un programma C di esempio.

Come usare pivot_root

Immediatamente dopo aver inserito lo spazio dei nomi di montaggio, è necessario anche mount --make-rslave / o equivalente. In caso contrario, tutte le modifiche apportate ai mount si propagano ai mount nello spazio dei nomi originale, incluso il pivot_root . Non lo vuoi :).

Se hai usato unshare --mount comando, nota che è documentato per applicare mount --make-rprivate per impostazione predefinita. AFAICS questo è un difetto predefinito e non lo vuoi nel codice di produzione. Per esempio. a questo punto, fermerebbe eject dal lavorare su un DVD o USB montato nello spazio dei nomi host. Il DVD o l'USB rimarrebbero montati all'interno dell'albero di montaggio privato e il kernel non ti permetterebbe di espellere il DVD.

Una volta fatto, puoi montare ad es. il /proc directory che utilizzerai. Allo stesso modo in cui faresti per chroot .

Diversamente da quando usi chroot , pivot_root richiede che il tuo nuovo filesystem di root sia un punto di montaggio. Se non è già uno, puoi soddisfarlo semplicemente applicando un mount bind:mount --rbind new_root new_root .

Usa pivot_root – e poi umount il vecchio filesystem di root, con -l / MNT_DETACH opzione. (Non hai bisogno di umount -R , che può richiedere più tempo.).

Correlati:AT+CSQ senza disconnettere la connessione PPP in ARCH Linux?

Tecnicamente, usando pivot_root generalmente richiede l'uso di chroot anche; non è "o-o".

Come per man 2 pivot_root , è definito solo come scambio della radice dello spazio dei nomi di montaggio. Non è definito per cambiare la directory fisica a cui punta la radice del processo. O la directory di lavoro corrente (/proc/self/cwd ). Succede che fa fallo, ma questo è un trucco per gestire i thread del kernel. La manpage dice che potrebbe cambiare in futuro.

Di solito vuoi questa sequenza:

chdir(new_root);            // cd new_root
pivot_root(".", put_old);   // pivot_root . put_old
chroot(".");                // chroot .

La posizione del chroot in questa sequenza c'è ancora un altro dettaglio sottile. Sebbene il punto di pivot_root è riorganizzare lo spazio dei nomi di montaggio, il codice del kernel sembra trovare il filesystem di root da spostare guardando la radice per processo, che è ciò che chroot set.

Perché usare pivot_root

In linea di principio, ha senso usare pivot_root per la sicurezza e l'isolamento. Mi piace pensare alla teoria della sicurezza basata sulle capacità. Si passa un elenco delle risorse specifiche necessarie e il processo non può accedere ad altre risorse. In questo caso stiamo parlando dei filesystem passati a uno spazio dei nomi di montaggio. Questa idea si applica generalmente alla funzione "spazi dei nomi" di Linux, anche se probabilmente non la sto esprimendo molto bene.

chroot imposta solo la radice del processo, ma il processo fa comunque riferimento allo spazio dei nomi di montaggio completo. Se un processo conserva il privilegio di eseguire chroot , quindi può eseguire il backup dello spazio dei nomi del filesystem. Come dettagliato in man 2 chroot , "il superutente può fuggire da una 'prigione chroot' entro...".

Un altro modo stimolante per annullare chroot è nsenter --mount=/proc/self/ns/mnt . Questo è forse un argomento più forte per il principio. nsenter / setns() ricarica necessariamente la radice del processo, dalla radice dello spazio dei nomi di montaggio... anche se il fatto che funzioni quando i due fanno riferimento a directory fisiche diverse, potrebbe essere considerato un bug del kernel. (Nota tecnica:potrebbero esserci più filesystem montati uno sopra l'altro alla radice; setns() utilizza quello in alto, quello montato più di recente).

Questo illustra un vantaggio della combinazione di uno spazio dei nomi di montaggio con uno "spazio dei nomi PID". Essere all'interno di uno spazio dei nomi PID ti impedirebbe di entrare nello spazio dei nomi di montaggio di un processo non confinato. Ti impedisce anche di inserire la radice di un processo non confinato (/proc/$PID/root ). E ovviamente uno spazio dei nomi PID ti impedisce anche di uccidere qualsiasi processo che sia al di fuori di esso :-).


Linux
  1. Come uso Vagrant con libvirt

  2. Come crittografare i file con gocryptfs su Linux

  3. Come montare la condivisione Windows remota su Linux

  4. Linux:come montare un filesystem remoto specificando un numero di porta?

  5. Come montare un file ISO in Linux?

Come montare file ISO su Linux

Come esibirsi come DJ su Ubuntu Linux con Mixxx

Come confrontare le directory con Meld su Linux

Come montare un'unità su Linux

Come proteggere i server Linux con SE Linux

Come configurare un firewall con GUFW su Linux