Come usare il comando chroot su Linux

Un prompt terminale sullo schermo di un laptop Linux.
Fatmawati Achmad Zaenuri / Shutterstock.com

Il chroot Il comando può inviarti in prigione, mantenere isolati gli ambienti di sviluppo o test o semplicemente migliorare la sicurezza del tuo sistema. Ti mostriamo il modo più semplice per usarlo.

Che cos'è un chroot?

Se si tenta di misurare l'utilità di un comando, è necessario tenere conto della funzionalità fornita e della sua facilità d'uso. Se è troppo complicato da usare per le persone o troppo prolisso per indurli a provare a usarlo, la funzionalità potrebbe anche essere zero. Se nessuno lo utilizza, non fornisce alcuna funzionalità.

Nelle discussioni con gli utenti Linux, di persona e nei forum, sembra che il chroot Il comando è uno che è considerato difficile da usare, o troppo ostile e noioso da configurare. Sembra che questa straordinaria utilità non sia utilizzata tanto quanto potrebbe essere.

Con chroot puoi impostare ed eseguire programmi o shell interattive come Bash in un filesystem incapsulato a cui è impedito l'interazione con il tuo filesystem normale. Tutto all'interno del chroot l'ambiente è scritto e contenuto. Niente nel chroot l'ambiente può vedere oltre la propria directory root speciale senza passare ai privilegi di root. Questo ha guadagnato a questo tipo di ambiente il soprannome di a chroot prigione. Il termine “prigione” non deve essere confuso con FreeBSD jail comando, che crea un chroot ambiente più sicuro del solito chroot ambiente.

Ma in realtà, c'è un modo molto semplice da usare chroot, che esamineremo. Stiamo usando regolari comandi Linux che funzioneranno su tutte le distribuzioni. Alcune distribuzioni Linux hanno strumenti dedicati per la configurazione chroot ambienti, come debootstrap per Ubuntu, ma qui siamo distro-agnostici.

Quando dovresti usare un chroot?

UN chroot l'ambiente offre funzionalità simili a quelle di una macchina virtuale, ma è una soluzione più leggera. Il sistema captive non ha bisogno di un hypervisor per essere installato e configurato, come VirtualBox o Virtual Machine Manager. Né ha bisogno di avere un kernel installato nel sistema captive. Il sistema captive condivide il kernel esistente.

In alcuni sensi, chroot gli ambienti sono più vicini ai container come LXC che alle macchine virtuali. Sono leggeri, veloci da implementare e la creazione e l'attivazione possono essere automatizzati. Come i contenitori, un modo conveniente per configurarli è quello di installare il sistema operativo in modo tale da soddisfare le esigenze. Alla domanda “cosa è richiesto” viene data una risposta a come utilizzerai la tua chroot ambiente.

Alcuni usi comuni sono:

Sviluppo software e verifica del prodotto. Gli sviluppatori scrivono software e il team di verifica del prodotto (PV) lo verifica. A volte PV rileva problemi che non possono essere replicati sul computer dello sviluppatore. Lo sviluppatore ha tutti i tipi di strumenti e librerie installati sul proprio computer di sviluppo che l'utente medio e PV non avranno. Spesso, il nuovo software che funziona per lo sviluppatore ma non per altri risulta utilizzare una risorsa sul PC dello sviluppatore che non è stato incluso nella versione di prova del software. chroot consente agli sviluppatori di avere un semplice ambiente captive vanilla sul loro computer in cui possono immergersi nel software prima di consegnarlo al fotovoltaico. L'ambiente captive può essere configurato con le dipendenze minime richieste dal software.

Riduzione del rischio di sviluppo. Lo sviluppatore può creare un ambiente di sviluppo dedicato in modo che nulla di ciò che accade al suo interno possa rovinare il suo PC reale.

Esecuzione di software obsoleto. A volte devi solo avere una vecchia versione di qualcosa in esecuzione. Se il vecchio software ha requisiti che potrebbero scontrarsi o essere incompatibili con la tua versione di Linux, puoi farlo chroot un ambiente per il software problematico.

Aggiornamenti di ripristino e filesystem: Se un'installazione Linux diventa inutilizzabile, è possibile utilizzare chroot per montare il filesystem danneggiato su un mount point su un Live CD. Ciò consente di lavorare nel sistema danneggiato e tentare di risolverlo come se fosse montato normalmente su root /. Ciò significa che i percorsi dei file previsti all'interno del sistema danneggiato verranno correttamente referenziati dalla directory principale e non dal punto di montaggio del Live CD. Una tecnica simile è stata utilizzata nell'articolo che descrive come migrare il filesystem Linux da ext2 o ext3 a ext4.

Applicazioni di suoneria. Esecuzione di un server FTP o altra apparecchiatura connessa a Internet all'interno a chroot l'ambiente limita il danno che un attaccante esterno può fare. Questo può essere un passo prezioso per rafforzare la sicurezza del tuo sistema.

RELAZIONATO: Come migrare i file system Ext2 o Ext3 su Ext4 su Linux

Creazione di un ambiente chroot

Abbiamo bisogno di una directory che funga da directory principale di chroot ambiente. In modo da avere un modo abbreviato di fare riferimento a quella directory creeremo una variabile e memorizzeremo il nome della directory in essa. Qui stiamo impostando una variabile per memorizzare un percorso nella directory “testroot”. Non importa se questa directory non esiste ancora, la creeremo presto. Se la directory esiste, dovrebbe essere vuota.

chr=/home/dave/testroot

chr = / home / dave / testroot in una finestra terminale

Se la directory non esiste, dobbiamo crearla. Possiamo farlo con questo comando. Il -p L'opzione (genitori) garantisce la creazione contemporanea di tutte le directory principali mancanti:

mkdir -p $chr

mkdir -p $ chr in una finestra terminale

Dobbiamo creare directory per contenere le porzioni del sistema operativo chroot l'ambiente richiederà. Installeremo un ambiente Linux minimalista che usa Bash come shell interattiva. Includeremo anche il touch, rm, e ls comandi. Ciò ci consentirà di utilizzare tutti i comandi integrati di Bash e touch, rm, e ls. Saremo in grado di creare, elencare e rimuovere file e utilizzare Bash. E, in questo semplice esempio, tutto qui.

Elenca le directory che devi creare all'interno di {} espansione parentesi graffa.

mkdir -p $chr/{bin,lib,lib64}

mkdir -p $ chr / {bin, lib, lib64} in una finestra terminale

Ora cambieremo directory nella nostra nuova directory root.

cd $chr

cd $ chr in una finestra del terminale

Copiamo i file binari di cui abbiamo bisogno nel nostro ambiente minimalista Linux dalla normale directory “/ bin” nella nostra chroot Directory “/ bin”. Il -v (verbose) opzione rende cp dicci cosa sta facendo mentre esegue ogni azione di copia.

cp -v /bin/{bash,touch,ls,rm} $chr

cp -v / bin / {bash, touch, ls, rm} $ chr in una finestra terminale

I file vengono copiati per noi:

output da cp mentre i file vengono copiati in una finestra di terminale

Questi binari avranno dipendenze. Dobbiamo scoprire cosa sono e copiare quelli file nel nostro ambiente, altrimenti bash, touch, rm, e ls non sarà in grado di funzionare. Dobbiamo farlo a turno per ciascuno dei nostri comandi scelti. Faremo prima Bash. Il ldd il comando elencherà le dipendenze per noi.

ldd /bin/bash

ldd / bin / bash in una finestra terminale

Le dipendenze sono identificate ed elencate nella finestra del terminale:

Dipendenze di Bash elencate in una finestra del terminale

Dobbiamo copiare quei file nel nostro nuovo ambiente. Scegliere i dettagli da quell'elenco e copiarli uno alla volta richiederà tempo e sarà soggetto a errori.

Per fortuna, possiamo semi-automatizzarlo. Elencheremo di nuovo le dipendenze e questa volta formeremo un elenco. Quindi scorreremo l'elenco copiando i file.

Qui stiamo usando ldd per elencare le dipendenze e alimentare i risultati attraverso una pipe in egrep. utilizzando egrep è lo stesso che usare grep con il -E (espressioni regolari estese) opzione. Il -o L'opzione (solo corrispondenza) limita l'output alle parti corrispondenti delle linee. Stiamo cercando i file di libreria corrispondenti che finiscono in un numero (0-9).

list="$(ldd /bin/bash | egrep -o '/lib.*.(0-9)')"

list =

Possiamo controllare il contenuto dell'elenco usando echo:

echo $list

echo $ list in una finestra di terminale

Ora che abbiamo l'elenco, possiamo scorrere attraverso il seguente ciclo, copiando i file uno alla volta. Stiamo usando la variabile i per scorrere l'elenco. Per ogni membro dell'elenco, copiamo il file nel nostro chroot directory root che è il valore contenuto $chr.

Il -v (verbose) cause dell'opzione cp per annunciare ogni copia mentre la esegue. Il --parents L'opzione assicura che qualsiasi directory principale mancante venga creata in chroot ambiente.

for i in $list; do cp -v --parents "$i" "${chr}"; done

per i in $ list; do cp -v --parents "$ i" "$ {chr}"; fatto in una finestra terminale

E questo è l'output:

output dal loop cp in una finestra terminale

Useremo quella tecnica per catturare le dipendenze di ciascuno degli altri comandi. E useremo la tecnica del loop per eseguire la copia effettiva. La buona notizia è che dobbiamo solo apportare una piccola modifica al comando che raccoglie le dipendenze.

Possiamo recuperare il comando dalla nostra cronologia dei comandi premendo il tasto Up Arrow digitare alcune volte e quindi effettuare la modifica. Non è necessario modificare il comando di copia ciclica.

Qui abbiamo usato il Up Arrow chiave per trovare il comando e lo abbiamo modificato per dire touch invece di bash.

list="$(ldd /bin/touch | egrep -o '/lib.*.(0-9)')"

list =

Ora possiamo ripetere esattamente lo stesso comando loop di prima:

for i in $list; do cp -v --parents "$i" "${chr}"; done

per i in $ list; do cp -v --parents "$ i" "$ {chr}"; fatto in una finestra terminale

E i nostri file vengono copiati per noi:

foutput del loop cp copiando le dipendenze touch in una finestra terminale

Ora possiamo modificare il list riga di comando per ls:

list="$(ldd /bin/ls | egrep -o '/lib.*.(0-9)')"

list =

Ancora una volta, useremo lo stesso comando loop. Non importa quali file siano presenti nell'elenco. Funziona alla cieca attraverso l'elenco copiando i file per noi.

for i in $list; do cp -v --parents "$i" "${chr}"; done

per i in $ list; do cp -v --parents "$ i" "$ {chr}"; fatto in una finestra terminale

E le dipendenze per ls vengono copiati per noi:

Uscita dal loop cp che copia le dipendenze ls in una finestra terminale

Modifichiamo il list riga di comando per l'ultima volta, facendolo funzionare per rm:

list="$(ldd /bin/ls | egrep -o '/lib.*.(0-9)')"

list =

Usiamo il comando looping copy un'ultima volta:

for i in $list; do cp -v --parents "$i" "${chr}"; done

L'ultima delle nostre dipendenze viene copiata nella nostra chroot ambiente. Siamo finalmente pronti per usare il chroot comando. Questo comando imposta la radice di chroot ambiente e specifica quale applicazione eseguire come shell.

sudo chroot $chr /bin/bash

sudo chroot $ chr / bin / bash in una finestra terminale

Nostro chroot l'ambiente è ora attivo. Il prompt della finestra del terminale è stato modificato e la shell interattiva è gestita da bash shell nel nostro ambiente.

Ambiente chroot attivo in una finestra terminale

Possiamo provare i comandi che abbiamo introdotto nell'ambiente.

ls
ls /home/dave/Documents

Ambiente chroot attivo in una finestra terminale

Il ls Il comando funziona come ci aspetteremmo quando lo utilizziamo nell'ambiente. Quando proviamo ad accedere a una directory al di fuori dell'ambiente, il comando non riesce.

Possiamo usare touch per creare un file, ls per elencarlo, e rm per rimuoverlo.

touch sample_file.txt
ls
rm sample_file.txt
ls

toccare sample_file.txt in una finestra del terminale

Ovviamente, possiamo anche usare i comandi integrati forniti dalla shell Bash. Se digiti help dalla riga di comando, Bash li elencherà per te.

help

Output del comando di aiuto in una finestra del terminale

Usa exit per uscire da chroot ambiente:

exit

usando exit per lasciare l'ambiente chroot in una finestra terminale

Se si desidera rimuovere il chroot ambiente, puoi semplicemente eliminarlo:

rm -r testroot/

rm -r testroot / in una finestra terminale

Ciò eliminerà in modo ricorsivo i file e le directory nel file chroot ambiente.

Automatizza per comodità

Se lo stai pensando chroot gli ambienti potrebbero esserti utili, ma sono un po 'complicati da configurare, ricorda che puoi sempre sforzarti e rischiare di svolgere attività ripetitive utilizzando alias, funzioni e script.

RELAZIONATO: Come creare alias e funzioni Shell su Linux

Articoli correlati

Ultimi articoli