Slik bruker du chroot-kommandoen på Linux

Chroot-kommandoen kan sende deg i fengsel, holde utviklings- eller testmiljøene dine isolert, eller bare forbedre systemets sikkerhet. Vi viser deg den enkleste måten å bruke den på.

Hva er en chroot?

Hvis du prøver å måle nytten av en kommando, må du ta hensyn til funksjonaliteten den gir og dens brukervennlighet. Hvis det er for komplisert for folk å bruke eller for langdrygt til at de vil prøve å bruke det, kan funksjonaliteten like gjerne være null. Hvis ingen bruker det, gir det ingen funksjonalitet.

I diskusjoner med Linux-brukere – personlig og på forum – ser det ut til at chroot-kommandoen er en som er knyttet til å være vanskelig å bruke, eller for tøff og kjedelig å sette opp. Det ser ut til at dette fantastiske verktøyet ikke blir brukt så mye som det kanskje er.

Med chroot kan du sette opp og kjøre programmer eller interaktive skall for eksempel Bash i et innkapslet filsystem som hindres i å samhandle med ditt vanlige filsystem. Alt innenfor chroot-miljøet er skrevet inn og inneholdt. Ingenting i chroot-miljøet kan se ut forbi sin egen, spesielle rotkatalog uten å eskalere til root-privilegier. Det har gitt denne typen miljø kallenavnet til et chroot-fengsel. Begrepet «fengsel» bør ikke forveksles med FreeBSD-er jail-kommando, som skaper et chroot-miljø det er sikrere enn det vanlige chroot-miljøet.

Men faktisk er det en veldig grei måte å bruke chroot på, som vi skal gå gjennom. Vi bruker vanlige Linux-kommandoer som vil fungere på alle distribusjoner. Noen Linux-distribusjoner har dedikerte verktøy for å sette opp chroot-miljøer, som f.eks debootstrap for Ubuntu, men vi er distroagnostiske her.

Når bør du bruke en chroot?

Et chroot-miljø gir funksjonalitet som ligner på en virtuell maskin, men det er en lettere løsning. Captive-systemet trenger ikke en hypervisor for å installeres og konfigureres, som f.eks VirtualBox eller Virtual Machine Manager. Det trenger heller ikke å ha en kjerne installert i captive-systemet. Captive-systemet deler din eksisterende kjerne.

I noen forstand er chroot-miljøer nærmere containere som f.eks LXC enn til virtuelle maskiner. De er lette, raske å distribuere, og å lage og starte en kan automatiseres. I likhet med containere er en praktisk måte å konfigurere dem på å installere akkurat nok av operativsystemet til at du kan oppnå det som kreves. Spørsmålet «hva kreves» besvares ved å se på hvordan du skal bruke chroot-miljøet ditt.

  Hvordan installere og bruke Tor-nettleseren på Linux

Noen vanlige bruksområder er:

Programvareutvikling og produktverifisering. Utviklere skriver programvare og produktverifiseringsteamet (PV) tester det. Noen ganger finner PV problemer som ikke kan replikeres på utviklerens datamaskin. Utvikleren har alle slags verktøy og biblioteker installert på utviklingsdatamaskinen som den gjennomsnittlige brukeren – og PV – ikke vil ha. Ofte viser det seg at ny programvare som fungerer for utvikleren, men ikke for andre, bruker en ressurs på utviklerens PC som ikke er inkludert i testversjonen av programvaren. chroot lar utviklerne ha et vanlig vaniljefanget miljø på datamaskinen som de kan dyppe programvaren i før de gir den til PV. Captive-miljøet kan konfigureres med minimumsavhengighetene som programvaren krever.

Redusere utviklingsrisiko. Utvikleren kan lage et dedikert utviklingsmiljø slik at ingenting som skjer i det kan ødelegge den faktiske PC-en hans.

Kjører utdatert programvare. Noen ganger må du bare ha en gammel versjon av noe kjørende. Hvis den gamle programvaren har krav som vil kollidere eller være inkompatibel med din versjon av Linux, kan du chroot et miljø for problemprogramvaren.

Gjenoppretting og filsystemoppgraderinger: Hvis en Linux-installasjon blir ubrukelig, kan du bruke chroot til å montere det skadede filsystemet til et monteringspunkt på en Live CD. Dette lar deg jobbe i det skadede systemet og forsøke å fikse det som om det var montert normalt ved root /. Dette betyr at de forventede filbanene i det skadede systemet vil bli korrekt referert fra rotkatalogen, og ikke fra monteringspunktet til Live CD. En lignende teknikk ble brukt i artikkelen som beskriver hvordan man kan migrere Linux-filsystemet fra ext2 eller ext3 til ext4.

Ringfencing-applikasjoner. Å kjøre en FTP-server eller en annen Internett-tilkoblet enhet i et chroot-miljø begrenser skaden en ekstern angriper kan gjøre. Dette kan være et verdifullt skritt for å styrke sikkerheten til systemet ditt.

Opprette et chroot-miljø

Vi trenger en katalog for å fungere som rotkatalogen til chroot-miljøet. For at vi har en kortfattet måte å referere til den katalogen på, lager vi en variabel og lagrer navnet på katalogen i den. Her setter vi opp en variabel for å lagre en bane til «testroot»-katalogen. Det spiller ingen rolle om denne katalogen ikke eksisterer ennå, vi kommer til å lage den snart. Hvis katalogen eksisterer, bør den være tom.

chr=/home/dave/testroot

Hvis katalogen ikke eksisterer, må vi opprette den. Vi kan gjøre det med denne kommandoen. Alternativet -p (foreldre) sikrer at eventuelle manglende overordnede kataloger opprettes samtidig:

mkdir -p $chr

Vi må lage kataloger for å holde delene av operativsystemet vårt chroot-miljø krever. Vi skal sette opp et minimalistisk Linux-miljø som bruker Bash som det interaktive skallet. Vi vil også inkludere berørings-, rm- og ls-kommandoene. Det vil tillate oss å bruke alle Bashs innebygde kommandoer og touch, rm og ls. Vi kan opprette, liste og fjerne filer og bruke Bash. Og – i dette enkle eksempelet – det er alt.

  Slik bruker du rclone til å sikkerhetskopiere til Google Drive på Linux

List opp katalogene du må opprette i {} spennutvidelse.

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

Nå vil vi endre katalog til vår nye rotkatalog.

cd $chr

La oss kopiere binærfilene vi trenger i vårt minimalistiske Linux-miljø fra din vanlige «/bin»-katalog til vår chroot «/bin»-katalog. Alternativet -v (verbose) får cp til å fortelle oss hva den gjør mens den utfører hver kopieringshandling.

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

Filene er kopiert inn for oss:

Disse binærfilene vil ha avhengigheter. Vi må finne ut hva de er og kopiere disse filene til miljøet vårt også, ellers vil ikke bash, touch, rm og ls kunne fungere. Vi må gjøre dette etter tur for hver av våre valgte kommandoer. Vi gjør Bash først. ldd-kommandoen vil liste opp avhengighetene for oss.

ldd /bin/bash

Avhengighetene identifiseres og listes opp i terminalvinduet:

Vi må kopiere disse filene til vårt nye miljø. Å plukke ut detaljene fra den oppføringen og kopiere dem én om gangen vil være tidkrevende og utsatt for feil.

Heldigvis kan vi halvautomatisere det. Vi vil liste opp avhengighetene igjen, og denne gangen danner vi en liste. Deretter går vi gjennom listen og kopierer filene.

Her bruker vi ldd for å liste opp avhengighetene og mate resultatene gjennom en pipe inn i egrep. Å bruke egrep er det samme som å bruke grep med alternativet -E (utvidede regulære uttrykk). Alternativet -o (bare samsvarende) begrenser utdataene til de samsvarende delene av linjene. Vi ser etter samsvarende bibliotekfiler som ender på et tall [0-9].

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

Vi kan sjekke innholdet i listen ved å bruke ekko:

echo $list

Nå som vi har listen, kan vi gå gjennom den med følgende løkke, kopiere filene en om gangen. Vi bruker variabelen i for å gå gjennom listen. For hvert medlem av listen kopierer vi filen til chroot-rotkatalogen vår, som er verdien i $chr.

Alternativet -v (verbose) får cp til å annonsere hver kopi mens den utfører den. Alternativet –parents sikrer at eventuelle manglende overordnede kataloger opprettes i chroot-miljøet.

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

for i i $list;  gjør cp -v --foreldre

Og dette er utgangen:

Vi vil bruke den teknikken til å fange opp avhengighetene til hver av de andre kommandoene. Og vi bruker løkketeknikken til å utføre selve kopieringen. Den gode nyheten er at vi bare trenger å gjøre en liten redigering av kommandoen som samler avhengighetene.

  Slik sletter du en bruker på Linux (og fjerner alle spor)

Vi kan hente kommandoen fra kommandohistorikken vår ved å trykke på pil opp-tasten noen ganger og deretter foreta redigeringen. Kommandoen for looping copy trenger ikke å endres i det hele tatt.

Her har vi brukt pil opp-tasten for å finne kommandoen, og vi har redigert den til å si touch i stedet for bash.

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

Vi kan nå gjenta nøyaktig samme loop-kommando som før:

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

for i i $list;  gjør cp -v --foreldre

Og filene våre er kopiert for oss:

Vi kan nå redigere listens kommandolinje for ls:

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

Igjen, vi bruker den samme loop-kommandoen. Det bryr seg ikke om hvilke filer som er på listen. Det går blindt gjennom listen og kopierer filene for oss.

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

for i i $list;  gjør cp -v --foreldre

Og avhengighetene for ls blir kopiert over for oss:

Vi redigerer listekommandolinjen for siste gang, slik at den fungerer for rm:

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

Vi bruker looping copy-kommandoen en siste gang:

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

De siste av avhengighetene våre kopieres inn i chroot-miljøet vårt. Vi er endelig klare til å bruke chroot-kommandoen. Denne kommandoen setter roten til chroot-miljøet, og spesifiserer hvilket program som skal kjøres som skallet.

sudo chroot $chr /bin/bash

Chroot-miljøet vårt er nå aktivt. Terminalvinduet har endret seg, og det interaktive skallet er det som håndteres av bash-skallet i miljøet vårt.

Vi kan prøve ut kommandoene som vi har brakt inn i miljøet.

ls
ls /home/dave/Documents

ls-kommandoen fungerer som vi forventer når vi bruker den i miljøet. Når vi prøver å få tilgang til en katalog utenfor miljøet, mislykkes kommandoen.

Vi kan bruke berøring for å lage en fil, ls for å liste den, og rm for å fjerne den.

touch sample_file.txt
ls
rm sample_file.txt
ls

Vi kan selvfølgelig også bruke de innebygde kommandoene som Bash-skallet gir. Hvis du skriver hjelp på kommandolinjen, vil Bash liste dem opp for deg.

help

Bruk exit for å forlate chroot-miljøet:

exit

Hvis du vil fjerne chroot-miljøet, kan du ganske enkelt slette det:

rm -r testroot/

Dette vil rekursivt slette filene og katalogene i chroot-miljøet.

Automatiser for enkelhets skyld

Hvis du tenker at chroot-miljøer kan være nyttige for deg, men de er litt vanskelige å sette opp, husk at du alltid kan ta belastningen og risikoen ut av repeterende oppgaver ved å bruke aliaser, funksjoner og skript.