Hur man använder kommandot chroot på Linux

Chroot-kommandot kan skicka dig till fängelse, hålla dina utvecklings- eller testmiljöer isolerade eller bara förbättra ditt systems säkerhet. Vi visar dig det enklaste sättet att använda det.

Vad är en chroot?

Om du försöker mäta användbarheten av ett kommando måste du ta hänsyn till den funktionalitet det tillhandahåller och dess användarvänlighet. Om det är för komplicerat för folk att använda eller för långrandigt för att få dem att vilja försöka använda det, kan funktionen lika gärna vara noll. Om ingen använder det ger det ingen funktionalitet.

I diskussioner med Linux-användare – personligen och på forum – verkar det som att chroot-kommandot är ett som är kopplat till att det är svårt att använda, eller för snårigt och tråkigt att ställa in. Det verkar som om detta fantastiska verktyg inte används så mycket som det kan vara.

Med chroot kan du ställa in och köra program eller interaktiva skal såsom Bash i ett inkapslat filsystem som förhindras från att interagera med ditt vanliga filsystem. Allt inom chroot-miljön är inskrivet och inneslutet. Ingenting i chroot-miljön kan se ut förbi sin egen, speciella rotkatalog utan att eskalera till root-privilegier. Det har gett den här typen av miljö smeknamnet för ett chroot-fängelse. Termen ”fängelse” ska inte förväxlas med FreeBSD:s jail-kommando, som skapar en chroot-miljö det är säkrare än den vanliga chroot-miljön.

Men faktiskt, det finns ett väldigt enkelt sätt att använda chroot, som vi ska gå igenom. Vi använder vanliga Linux-kommandon som fungerar på alla distributioner. Vissa Linux-distributioner har dedikerade verktyg för att ställa in chroot-miljöer, som t.ex debootstrap för Ubuntu, men vi är distroagnostiska här.

När ska du använda en chroot?

En chroot-miljö ger funktionalitet som liknar en virtuell maskin, men det är en lättare lösning. Captive-systemet behöver inte en hypervisor för att installeras och konfigureras, som t.ex VirtualBox eller Virtual Machine Manager. Det behöver inte heller ha en kärna installerad i captive-systemet. Det infångade systemet delar din befintliga kärna.

I vissa bemärkelser ligger chrootmiljöer närmare behållare som t.ex LXC än till virtuella maskiner. De är lätta, snabba att implementera och att skapa och starta en kan automatiseras. Precis som behållare är ett bekvämt sätt att konfigurera dem att installera precis tillräckligt mycket av operativsystemet för att du ska kunna utföra det som krävs. Frågan ”vad krävs” besvaras genom att titta på hur du ska använda din chroot-miljö.

Några vanliga användningsområden är:

Mjukvaruutveckling och produktverifiering. Utvecklare skriver mjukvara och produktverifieringsteamet (PV) testar det. Ibland upptäcks problem av PV som inte kan replikeras på utvecklarens dator. Utvecklaren har alla möjliga verktyg och bibliotek installerade på sin utvecklingsdator som den genomsnittliga användaren – och PV – inte kommer att ha. Ofta visar sig ny programvara som fungerar för utvecklaren men inte för andra använda en resurs på utvecklarens PC som inte har inkluderats i testversionen av programvaran. chroot gör det möjligt för utvecklarna att ha en vanlig vaniljmiljö på sin dator som de kan doppa programvaran i innan de ger den till PV. Captive-miljön kan konfigureras med de minsta beroenden som programvaran kräver.

Minska utvecklingsrisken. Utvecklaren kan skapa en dedikerad utvecklingsmiljö så att ingenting som händer i den kan förstöra hans faktiska PC.

Kör föråldrad programvara. Ibland måste man bara ha en gammal version av något igång. Om den gamla programvaran har krav som skulle kollidera eller vara inkompatibla med din version av Linux kan du chroota en miljö för problemprogramvaran.

Återställning och filsystemuppgraderingar: Om en Linux-installation inte fungerar kan du använda chroot för att montera det skadade filsystemet till en monteringspunkt på en Live CD. Detta gör att du kan arbeta i det skadade systemet och försöka fixa det som om det var monterat normalt vid root /. Detta innebär att de förväntade filsökvägarna inom det skadade systemet kommer att refereras korrekt från rotkatalogen och inte från monteringspunkten för Live CD:n. En liknande teknik användes i artikeln som beskriver hur man migrerar Linux-filsystemet från ext2 eller ext3 till ext4.

Ringstängselapplikationer. Att köra en FTP-server eller annan internetansluten apparat i en chroot-miljö begränsar skadan som en extern angripare kan göra. Detta kan vara ett värdefullt steg för att stärka säkerheten för ditt system.

Skapa en chrootmiljö

Vi behöver en katalog för att fungera som rotkatalogen för chroot-miljön. Så att vi har ett förkortat sätt att referera till den katalogen skapar vi en variabel och lagrar namnet på katalogen i den. Här ställer vi in ​​en variabel för att lagra en sökväg till ”testroot”-katalogen. Det spelar ingen roll om den här katalogen inte finns ännu, vi kommer att skapa den snart. Om katalogen finns bör den vara tom.

chr=/home/dave/testroot

Om katalogen inte finns måste vi skapa den. Vi kan göra det med det här kommandot. Alternativet -p (föräldrar) säkerställer att alla saknade överordnade kataloger skapas samtidigt:

mkdir -p $chr

Vi måste skapa kataloger för att hålla de delar av operativsystemet som vår chroot-miljö kräver. Vi kommer att sätta upp en minimalistisk Linux-miljö som använder Bash som det interaktiva skalet. Vi kommer också att inkludera touch-, rm- och ls-kommandona. Det gör att vi kan använda alla Bashs inbyggda kommandon och touch, rm och ls. Vi kommer att kunna skapa, lista och ta bort filer och använda Bash. Och – i detta enkla exempel – det är allt.

Lista de kataloger du behöver skapa inom {} stag expansion.

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

Nu ska vi byta katalog till vår nya rotkatalog.

cd $chr

Låt oss kopiera de binärfiler som vi behöver i vår minimalistiska Linux-miljö från din vanliga ”/bin”-katalog till vår chroot-katalog ”/bin”. Alternativet -v (verbose) får cp att berätta för oss vad den gör när den utför varje kopieringsåtgärd.

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

Filerna kopieras in åt oss:

Dessa binärer kommer att ha beroenden. Vi måste upptäcka vad de är och kopiera dessa filer till vår miljö också, annars kommer bash, touch, rm och ls inte att kunna fungera. Vi måste göra detta i tur och ordning för vart och ett av våra valda kommandon. Vi gör Bash först. Kommandot ldd kommer lista beroenden för oss.

ldd /bin/bash

Beroendena identifieras och listas i terminalfönstret:

Vi måste kopiera dessa filer till vår nya miljö. Att plocka ut detaljerna från den lista och kopiera dem en i taget kommer att vara tidskrävande och felbenägen.

Tack och lov kan vi halvautomatisera det. Vi listar beroenden igen, och den här gången skapar vi en lista. Sedan går vi igenom listan och kopierar filerna.

Här använder vi ldd för att lista beroenden och mata resultaten genom ett rör till egrep. Att använda egrep är detsamma som att använda grep med alternativet -E (utökade reguljära uttryck). Alternativet -o (endast matchande) begränsar utdata till de matchande delarna av linjer. Vi letar efter matchande biblioteksfiler som slutar på ett nummer [0-9].

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

Vi kan kontrollera innehållet i listan med echo:

echo $list

Nu när vi har listan kan vi gå igenom den med följande loop, kopiera filerna en i taget. Vi använder variabeln i för att gå igenom listan. För varje medlem i listan kopierar vi filen till vår chroot-rotkatalog som är värdet i $chr.

Alternativet -v (verbose) gör att cp annonserar varje kopia när den utför den. Alternativet –parents säkerställer att alla saknade överordnade kataloger skapas i chroot-miljön.

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

för i i $list;  gör cp -v --föräldrar

Och detta är utgången:

Vi kommer att använda den tekniken för att fånga beroenden för vart och ett av de andra kommandona. Och vi kommer att använda looptekniken för att utföra själva kopieringen. Den goda nyheten är att vi bara behöver göra en liten ändring av kommandot som samlar in beroenden.

Vi kan hämta kommandot från vår kommandohistorik genom att trycka på uppåtpilen några gånger och sedan göra redigeringen. Kommandot looping copy behöver inte ändras alls.

Här har vi använt uppåtpilen för att hitta kommandot, och vi har redigerat det för att säga touch istället för bash.

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

Vi kan nu upprepa exakt samma loop-kommando som tidigare:

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

för i i $list;  gör cp -v --föräldrar

Och våra filer kopieras åt oss:

Vi kan nu redigera listkommandoraden för ls:

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

Återigen kommer vi att använda samma loop-kommando. Det bryr sig inte om vilka filer som finns i listan. Det går blint igenom listan och kopierar filerna åt oss.

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

för i i $list;  gör cp -v --föräldrar

Och beroenden för ls kopieras över åt oss:

Vi redigerar kommandoraden för listan för sista gången, vilket gör att den fungerar för rm:

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

Vi använder kommandot looping copy en sista gång:

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

De sista av våra beroenden kopieras till vår chroot-miljö. Vi är äntligen redo att använda chroot-kommandot. Detta kommando ställer in roten för chroot-miljön och anger vilket program som ska köras som skal.

sudo chroot $chr /bin/bash

Vår chroot-miljö är nu aktiv. Terminalfönstrets prompt har ändrats, och det interaktiva skalet är det som hanteras av bash-skalet i vår miljö.

Vi kan prova de kommandon som vi har tagit in i miljön.

ls
ls /home/dave/Documents

Kommandot ls fungerar som vi kan förvänta oss när vi använder det i miljön. När vi försöker komma åt en katalog utanför miljön misslyckas kommandot.

Vi kan använda touch för att skapa en fil, ls för att lista den och rm för att ta bort den.

touch sample_file.txt
ls
rm sample_file.txt
ls

Naturligtvis kan vi också använda de inbyggda kommandona som Bash-skalet tillhandahåller. Om du skriver hjälp på kommandoraden kommer Bash att lista dem åt dig.

help

Använd exit för att lämna chroot-miljön:

exit

Om du vill ta bort chrootmiljön kan du helt enkelt ta bort den:

rm -r testroot/

Detta kommer rekursivt att radera filerna och katalogerna i chroot-miljön.

Automatisera för bekvämlighet

Om du tror att chroot-miljöer kan vara användbara för dig, men de är lite krångliga att ställa in, kom ihåg att du alltid kan ta påfrestningen och risken med repetitiva uppgifter genom att använda alias, funktioner och skript.