Hoe de chroot-opdracht op Linux te gebruiken

Een terminalprompt op het scherm van een Linux-laptop.
Fatmawati Achmad Zaenuri / Shutterstock.com

De chroot commando kan je naar de gevangenis sturen, je ontwikkel- of testomgevingen geïsoleerd houden, of gewoon de beveiliging van je systeem verbeteren. We laten u de gemakkelijkste manier zien om het te gebruiken.

Wat is een chroot?

Als u het nut van een commando probeert te meten, moet u rekening houden met de functionaliteit die het biedt en het gebruiksgemak. Als het te ingewikkeld is voor mensen om het te gebruiken of te langdradig om ervoor te zorgen dat ze het willen proberen, kan de functionaliteit net zo goed nul zijn. Als niemand het gebruikt, biedt het geen enkele functionaliteit.

In discussies met Linux-gebruikers – persoonlijk en op forums – lijkt het erop dat de chroot commando is er een die is gepegd als moeilijk te gebruiken, of te lastig en vervelend om in te stellen. Het lijkt erop dat dit geweldige hulpprogramma niet zo vaak wordt gebruikt als het zou kunnen zijn.

Met chroot u kunt programma’s of interactieve shells zoals Bash opzetten en uitvoeren in een ingekapseld bestandssysteem dat geen interactie heeft met uw normale bestandssysteem. Alles binnen de chroot omgeving is vastgelegd en bevat. Niets in de chroot omgeving kan voorbij zijn eigen, speciale root-directory kijken zonder te escaleren naar root-privileges. Dat heeft dit type omgeving de bijnaam van een chroot gevangenis. De term “gevangenis” moet niet worden verward met die van FreeBSD jail commando, dat een chroot omgeving die veiliger is dan normaal chroot milieu.

Maar eigenlijk is er een heel eenvoudige manier om te gebruiken chroot, waar we doorheen gaan. We gebruiken gewone Linux-commando’s die op alle distributies werken. Sommige Linux-distributies hebben speciale tools om in te stellen chroot omgevingen, zoals debootstrap voor Ubuntu, maar we zijn hier distro-agnostisch.

Wanneer moet je een chroot gebruiken?

EEN chroot omgeving biedt functionaliteit die vergelijkbaar is met die van een virtuele machine, maar het is een lichtere oplossing. Het captive-systeem heeft geen hypervisor nodig om te worden geïnstalleerd en geconfigureerd, zoals VirtualBox of Virtual Machine Manager. Evenmin hoeft er een kernel in het captive-systeem te zijn geïnstalleerd. Het captive-systeem deelt uw bestaande kernel.

In sommige opzichten chroot omgevingen staan ​​dichter bij containers zoals LXC dan bij virtuele machines. Ze zijn licht van gewicht, snel te implementeren en het maken en activeren ervan kan worden geautomatiseerd. Net als containers is een gemakkelijke manier om ze te configureren, door net genoeg van het besturingssysteem te installeren om te bereiken wat nodig is. De “wat is vereist” -vraag wordt beantwoord door te kijken naar hoe u uw chroot milieu.

Enkele veel voorkomende toepassingen zijn:

Softwareontwikkeling en productverificatie. Ontwikkelaars schrijven software en het productverificatieteam (PV) test deze. Soms worden door PV problemen gevonden die niet kunnen worden gerepliceerd op de computer van de ontwikkelaar. De ontwikkelaar heeft allerlei tools en bibliotheken op zijn ontwikkelcomputer geïnstalleerd die de gemiddelde gebruiker – en PV – niet zal hebben. Vaak blijkt dat nieuwe software die wel voor de ontwikkelaar werkt, maar niet voor anderen, een bron op de pc van de ontwikkelaar gebruikt die niet is opgenomen in de testversie van de software. chroot stelt de ontwikkelaars in staat om een ​​eenvoudige vanille-captive-omgeving op hun computer te hebben waarin ze de software kunnen onderdompelen voordat ze deze aan PV geven. De captive-omgeving kan worden geconfigureerd met de absoluut minimale afhankelijkheden die de software vereist.

Ontwikkelingsrisico verminderen. De ontwikkelaar kan een speciale ontwikkelomgeving creëren, zodat niets dat erin gebeurt, zijn eigen pc kan verknoeien.

Verouderde software uitvoeren. Soms moet je gewoon een oude versie van iets laten draaien. Als de oude software vereisten heeft die zouden botsen of niet compatibel zijn met uw versie van Linux, dan kan dat chroot een omgeving voor de probleemsoftware.

Herstel en upgrades van bestandssystemen: Als een Linux-installatie onbruikbaar wordt, kunt u chroot om het beschadigde bestandssysteem naar een koppelpunt op een Live CD te mounten. Hierdoor kun je in het beschadigde systeem werken en proberen het te repareren alsof het normaal op root / is gemount. Dit betekent dat de verwachte bestandspaden binnen het beschadigde systeem correct worden gerefereerd vanuit de root-directory, en niet vanaf het koppelpunt van de Live CD. Een vergelijkbare techniek werd gebruikt in het artikel dat beschrijft hoe het Linux-bestandssysteem van ext2 of ext3 naar ext4 kan worden gemigreerd.

Omheiningsapplicaties. Een FTP-server of ander met internet verbonden apparaat draaien binnen een chroot omgeving beperkt de schade die een externe aanvaller kan aanrichten. Dit kan een waardevolle stap zijn om de beveiliging van uw systeem te versterken.

VERWANT: Ext2- of Ext3-bestandssystemen migreren naar Ext4 op Linux

Een chroot-omgeving maken

We hebben een directory nodig om te fungeren als de root-directory van het chroot milieu. Zodat we een verkorte manier hebben om naar die map te verwijzen, zullen we een variabele maken en de naam van de map daarin opslaan. Hier stellen we een variabele in om een ​​pad op te slaan naar de “testroot” -directory. Het maakt niet uit of deze directory nog niet bestaat, we gaan hem binnenkort aanmaken. Als de map wel bestaat, moet deze leeg zijn.

chr=/home/dave/testroot

chr = / home / dave / testroot in een terminalvenster

Als de directory niet bestaat, moeten we deze maken. We kunnen dat doen met dit commando. De -p (ouders) optie zorgt ervoor dat alle ontbrekende bovenliggende mappen tegelijkertijd worden aangemaakt:

mkdir -p $chr

mkdir -p $ chr in een terminalvenster

We moeten mappen maken om de delen van het besturingssysteem onze chroot omgeving vereist. We gaan een minimalistische Linux-omgeving opzetten die Bash gebruikt als de interactieve shell. We nemen ook de touch, rm, en ls commando’s. Dat stelt ons in staat om alle ingebouwde commando’s van Bash te gebruiken en touch, rm, en ls. We kunnen bestanden maken, weergeven en verwijderen, en Bash gebruiken. En – in dit eenvoudige voorbeeld – dat is alles.

Maak een lijst van de mappen die u moet maken in het {} brace uitbreiding.

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

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

Nu zullen we de directory wijzigen in onze nieuwe root-directory.

cd $chr

cd $ chr in een terminalvenster

Laten we de binaire bestanden die we nodig hebben in onze minimalistische Linux-omgeving van uw gewone “/ bin” -directory naar onze chroot Map “/ bin”. De -v (uitgebreide) optie maakt cp vertel ons wat het doet terwijl het elke kopieeractie uitvoert.

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

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

De bestanden worden voor ons gekopieerd:

uitvoer van cp als bestanden worden gekopieerd in een terminalvenster

Deze binaire bestanden zullen afhankelijkheden hebben. We moeten ontdekken wat ze zijn en kopiëren die bestanden in onze omgeving ook, anders bash, touch, rm, en ls zal niet kunnen functioneren. We moeten dit beurtelings doen voor elk van onze gekozen opdrachten. We doen eerst Bash. De ldd commando zal de afhankelijkheden voor ons opsommen.

ldd /bin/bash

ldd / bin / bash in een terminalvenster

De afhankelijkheden worden geïdentificeerd en weergegeven in het terminalvenster:

Bash-afhankelijkheden vermeld in een terminalvenster

We moeten die bestanden naar onze nieuwe omgeving kopiëren. De details uit die lijst halen en ze een voor een kopiëren, zal tijdrovend en foutgevoelig zijn.

Gelukkig kunnen we het semi-automatiseren. We zullen de afhankelijkheden opnieuw vermelden en deze keer zullen we een lijst vormen. Daarna zullen we de lijst doorlopen en de bestanden kopiëren.

Hier gebruiken we ldd om de afhankelijkheden op te sommen en de resultaten via een pijp naar egrep. Gebruik makend van egrep is hetzelfde als gebruiken grep met de -E (uitgebreide reguliere expressies) optie. De -o (alleen overeenkomende) optie beperkt de uitvoer tot de overeenkomende delen van lijnen. We zijn op zoek naar overeenkomende bibliotheekbestanden die eindigen op een nummer [0-9].

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

lijst =

We kunnen de inhoud van de lijst controleren met echo:

echo $list

echo $ lijst in een terminalvenster

Nu we de lijst hebben, kunnen we er doorheen lopen met de volgende lus, waarbij we de bestanden een voor een kopiëren. We gebruiken de variabele i om door de lijst te lopen. Voor elk lid van de lijst kopiëren we het bestand naar ons chroot root directory die de waarde is die wordt vastgehouden in $chr.

De -v (uitgebreide) optie oorzaken cp om elke kopie aan te kondigen terwijl deze deze uitvoert. De --parents optie zorgt ervoor dat alle ontbrekende bovenliggende mappen worden aangemaakt in de chroot milieu.

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

voor i in $ lijst;  do cp -v --parents "$ i" "$ {chr}";  gedaan in een terminalvenster

En dit is de output:

uitvoer van de cp-lus in een terminalvenster

We zullen die techniek gebruiken om de afhankelijkheden van elk van de andere opdrachten vast te leggen. En we zullen de loop-techniek gebruiken om het daadwerkelijke kopiëren uit te voeren. Het goede nieuws is dat we slechts een kleine wijziging hoeven aan te brengen in het commando dat de afhankelijkheden verzamelt.

We kunnen de opdracht uit onze opdrachtgeschiedenis halen door op de Up Arrow toets een paar keer in en voer de bewerking uit. De herhaalde kopieeropdracht hoeft helemaal niet te worden gewijzigd.

Hier hebben we de Up Arrow sleutel om het commando te vinden, en we hebben het bewerkt om te zeggen touch in plaats van bash.

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

lijst =

We kunnen nu exact dezelfde lusopdracht herhalen als voorheen:

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

voor i in $ lijst;  do cp -v --parents "$ i" "$ {chr}";  gedaan in een terminalvenster

En onze bestanden worden voor ons gekopieerd:

foutput van de cp-lus die de aanraakafhankelijkheden kopieert in een terminalvenster

We kunnen nu het list opdrachtregel voor ls:

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

lijst =

Nogmaals, we gebruiken dezelfde lusopdracht. Het maakt niet uit welke bestanden in de lijst staan. Het werkt blindelings door de lijst en kopieert de bestanden voor ons.

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

voor i in $ lijst;  do cp -v --parents "$ i" "$ {chr}";  gedaan in een terminalvenster

En de afhankelijkheden voor ls worden voor ons gekopieerd:

Uitvoer van de cp-lus die de ls-afhankelijkheden in een terminalvenster kopieert

We bewerken het list opdrachtregel voor de laatste keer, waardoor het werkt voor rm:

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

lijst =

We gebruiken de herhaalde kopieeropdracht nog een laatste keer:

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

De laatste van onze afhankelijkheden worden gekopieerd naar onze chroot milieu. We zijn eindelijk klaar om het chroot opdracht. Dit commando stelt de root van het chroot omgeving, en specificeert welke applicatie moet worden uitgevoerd als de shell.

sudo chroot $chr /bin/bash

sudo chroot $ chr / bin / bash in een terminalvenster

Onze chroot omgeving is nu actief. De terminalvensterprompt is gewijzigd en de interactieve shell wordt afgehandeld door de bash shell in onze omgeving.

Actieve chroot-omgeving in een terminalvenster

We kunnen de commando’s uitproberen die we in de omgeving hebben gebracht.

ls
ls /home/dave/Documents

Actieve chroot-omgeving in een terminalvenster

De ls commando werkt zoals we zouden verwachten als we het in de omgeving gebruiken. Wanneer we proberen toegang te krijgen tot een map buiten de omgeving, mislukt de opdracht.

We kunnen gebruiken touch om een ​​bestand te maken, ls om het op te sommen, en rm om het te verwijderen.

touch sample_file.txt
ls
rm sample_file.txt
ls

raak sample_file.txt aan in een terminalvenster

Natuurlijk kunnen we ook de ingebouwde commando’s gebruiken die de Bash-shell biedt. Als je typt help op de opdrachtregel zal Bash ze voor je weergeven.

help

Uitvoer van het help-commando in een terminalvenster

Gebruik exit om het chroot milieu:

exit

exit gebruiken om de chroot-omgeving in een terminalvenster te verlaten

Als u het chroot omgeving, kunt u deze eenvoudig verwijderen:

rm -r testroot/

rm -r testroot / in een terminalvenster

Hiermee worden de bestanden en mappen in het chroot milieu.

Automatiseer voor gemak

Als je dat denkt chroot omgevingen zijn misschien nuttig voor u, maar ze zijn een beetje lastig in te stellen. Onthoud dat u altijd de spanning en het risico van repetitieve taken kunt wegnemen door aliassen, functies en scripts te gebruiken.

VERWANT: Aliassen en shell-functies maken op Linux

Nieuwste artikelen

Gerelateerde artikelen