
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
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
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}
Ora cambieremo directory nella nostra nuova directory root.
cd $chr
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
I file vengono copiati per noi:
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
Le dipendenze sono identificate ed elencate nella 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)')"
Possiamo controllare il contenuto dell'elenco usando echo
:
echo $list
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
E questo è l'output:
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)')"
Ora possiamo ripetere esattamente lo stesso comando loop di prima:
for i in $list; do cp -v --parents "$i" "${chr}"; done
E i nostri file vengono copiati per noi:
Ora possiamo modificare il list
riga di comando per ls
:
list="$(ldd /bin/ls | egrep -o '/lib.*.(0-9)')"
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
E le dipendenze per ls
vengono copiati per noi:
Modifichiamo il list
riga di comando per l'ultima volta, facendolo funzionare per rm
:
list="$(ldd /bin/ls | egrep -o '/lib.*.(0-9)')"
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
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.
Possiamo provare i comandi che abbiamo introdotto nell'ambiente.
ls
ls /home/dave/Documents
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
Ovviamente, possiamo anche usare i comandi integrati forniti dalla shell Bash. Se digiti help
dalla riga di comando, Bash li elencherà per te.
help
Usa exit per uscire da chroot
ambiente:
exit
Se si desidera rimuovere il chroot
ambiente, puoi semplicemente eliminarlo:
rm -r testroot/
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