Sådan bruger du chroot-kommandoen på Linux

Chroot-kommandoen kan sende dig i fængsel, holde dine udviklings- eller testmiljøer isoleret eller bare forbedre dit systems sikkerhed. Vi viser dig den nemmeste måde at bruge det på.

Hvad er en chroot?

Hvis du forsøger at måle nytten af ​​en kommando, skal du tage højde for den funktionalitet, den giver, og dens brugervenlighed. Hvis det er for kompliceret for folk at bruge eller for langtrukkent til at give dem lyst til at prøve at bruge det, kan funktionaliteten lige så godt være nul. Hvis ingen bruger det, giver det ingen funktionalitet.

I diskussioner med Linux-brugere – personligt og på fora – ser det ud til, at chroot-kommandoen er en, der er knyttet til at være svær at bruge, eller for kedelig og kedelig at konfigurere. Det ser ud til, at dette fantastiske værktøj ikke bliver brugt så meget, som det måske er.

Med chroot kan du opsætte og køre programmer eller interaktive skaller såsom Bash i et indkapslet filsystem, der forhindres i at interagere med dit almindelige filsystem. Alt i chroot-miljøet er skrevet ind og indeholdt. Intet i chroot-miljøet kan se ud forbi sin egen, specielle rodmappe uden at eskalere til root-privilegier. Det har givet denne type miljø kaldenavnet på et chroot-fængsel. Udtrykket “fængsel” bør ikke forveksles med FreeBSD’er jail-kommando, som skaber et chroot-miljø det er mere sikkert end det sædvanlige chroot-miljø.

Men faktisk er der en meget ligetil måde at bruge chroot på, som vi skal gå igennem. Vi bruger almindelige Linux-kommandoer, som vil fungere på alle distributioner. Nogle Linux-distributioner har dedikerede værktøjer til at opsætte chroot-miljøer, som f.eks debootstrap for Ubuntu, men vi er distro-agnostiske her.

Hvornår skal du bruge en chroot?

Et chroot-miljø giver funktionalitet svarende til en virtuel maskine, men det er en lettere løsning. Captive-systemet behøver ikke en hypervisor for at blive installeret og konfigureret, som f.eks VirtualBox eller Virtual Machine Manager. Det behøver heller ikke at have en kerne installeret i captive-systemet. Captive-systemet deler din eksisterende kerne.

I nogle forstand er chroot-miljøer tættere på beholdere som f.eks LXC end til virtuelle maskiner. De er lette, hurtige at implementere, og oprettelse og opstart af en kan automatiseres. Ligesom containere er en bekvem måde at konfigurere dem på at installere lige nok af operativsystemet til, at du kan opnå det, der kræves. Spørgsmålet “hvad kræves” besvares ved at se på, hvordan du vil bruge dit chroot-miljø.

  Linux 5.0 "Shy Crocodile" ankommer med Googles Adiantum-kryptering

Nogle almindelige anvendelser er:

Softwareudvikling og produktverifikation. Udviklere skriver software, og produktverifikationsteamet (PV) tester det. Nogle gange findes problemer af PV, som ikke kan replikeres på udviklerens computer. Udvikleren har alle mulige værktøjer og biblioteker installeret på deres udviklingscomputer, som den gennemsnitlige bruger – og PV – ikke vil have. Ofte viser ny software, der fungerer for udvikleren, men ikke for andre, at bruge en ressource på udviklerens pc, som ikke er inkluderet i testudgivelsen af ​​softwaren. chroot giver udviklerne mulighed for at have et almindeligt vaniljefanget miljø på deres computer, som de kan dyppe softwaren i, før de giver det til PV. Captive-miljøet kan konfigureres med de absolutte minimumsafhængigheder, som softwaren kræver.

Reduktion af udviklingsrisiko. Udvikleren kan skabe et dedikeret udviklingsmiljø, så intet, der sker i det, kan ødelægge hans faktiske pc.

Kører forældet software. Nogle gange skal man bare have en gammel version af noget kørende. Hvis den gamle software har krav, der ville kollidere med eller være inkompatible med din version af Linux, kan du chroot et miljø til problemsoftwaren.

Gendannelse og filsystemopgraderinger: Hvis en Linux-installation bliver ubrugelig, kan du bruge chroot til at montere det beskadigede filsystem til et monteringspunkt på en Live CD. Dette giver dig mulighed for at arbejde i det beskadigede system og forsøge at reparere det, som om det var monteret normalt ved root /. Dette betyder, at de forventede filstier i det beskadigede system vil blive refereret korrekt fra rodmappen og ikke fra monteringspunktet på Live CD’en. En lignende teknik blev brugt i artiklen, der beskriver, hvordan man migrerer Linux-filsystemet fra ext2 eller ext3 til ext4.

Ringfencing applikationer. At køre en FTP-server eller et andet internetforbundet apparat i et chroot-miljø begrænser den skade, en ekstern angriber kan gøre. Dette kan være et værdifuldt skridt til at hærde sikkerheden på dit system.

Oprettelse af et chroot-miljø

Vi har brug for en mappe til at fungere som rodmappen til chroot-miljøet. For at vi har en kortfattet måde at henvise til den mappe, opretter vi en variabel og gemmer navnet på mappen i den. Her opsætter vi en variabel til at gemme en sti til “testroot”-mappen. Det er lige meget, om denne mappe ikke eksisterer endnu, vi vil snart oprette den. Hvis mappen eksisterer, skal den være tom.

chr=/home/dave/testroot

Hvis mappen ikke eksisterer, skal vi oprette den. Det kan vi gøre med denne kommando. Indstillingen -p (forældre) sikrer, at eventuelle manglende overordnede mapper oprettes på samme tid:

mkdir -p $chr

Vi er nødt til at oprette mapper til at indeholde de dele af operativsystemet, som vores chroot-miljø kræver. Vi vil opsætte et minimalistisk Linux-miljø, der bruger Bash som den interaktive skal. Vi vil også inkludere touch-, rm- og ls-kommandoer. Det vil give os mulighed for at bruge alle Bashs indbyggede kommandoer og touch, rm og ls. Vi vil være i stand til at oprette, liste og fjerne filer og bruge Bash. Og – i dette simple eksempel – det er alt.

  Sådan læser du tegneserier på Linux med gennemsyn

List de mapper, du skal oprette i {} bøjleudvidelse.

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

Nu vil vi ændre mappe til vores nye rodmappe.

cd $chr

Lad os kopiere de binære filer, som vi har brug for i vores minimalistiske Linux-miljø fra din almindelige “/bin”-mappe til vores chroot “/bin”-mappe. Indstillingen -v (verbose) får cp til at fortælle os, hvad den laver, mens den udfører hver kopihandling.

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

Filerne kopieres ind til os:

Disse binære filer vil have afhængigheder. Vi er nødt til at finde ud af, hvad de er og kopiere disse filer til vores miljø, ellers vil bash, touch, rm og ls ikke kunne fungere. Vi skal gøre dette på skift for hver af vores valgte kommandoer. Vi laver Bash først. ldd-kommandoen vil liste afhængigheder for os.

ldd /bin/bash

Afhængighederne er identificeret og listet i terminalvinduet:

Vi skal kopiere disse filer ind i vores nye miljø. At udvælge detaljerne fra denne liste og kopiere dem én ad gangen vil være tidskrævende og udsat for fejl.

Heldigvis kan vi semi-automatisere det. Vi viser afhængighederne igen, og denne gang danner vi en liste. Så går vi gennem listen og kopierer filerne.

Her bruger vi ldd til at liste afhængighederne og føre resultaterne gennem et rør til egrep. Brug af egrep er det samme som at bruge grep med muligheden -E (udvidede regulære udtryk). Indstillingen -o (kun matchende) begrænser outputtet til de matchende dele af linjer. Vi leder efter matchende biblioteksfiler, der ender på et tal [0-9].

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

Vi kan kontrollere indholdet af listen ved hjælp af ekko:

echo $list

Nu hvor vi har listen, kan vi gå igennem den med følgende løkke, kopiere filerne en ad gangen. Vi bruger variablen i til at gå gennem listen. For hvert medlem af listen kopierer vi filen til vores chroot-rodmappe, som er værdien i $chr.

Valgmuligheden -v (verbose) får cp til at annoncere hver kopi, mens den udfører den. Indstillingen –parents sikrer, at eventuelle manglende overordnede mapper oprettes i chroot-miljøet.

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

for i i $list;  gør cp -v --forældre

Og dette er outputtet:

Vi vil bruge den teknik til at fange afhængighederne af hver af de andre kommandoer. Og vi vil bruge loop-teknikken til at udføre selve kopieringen. Den gode nyhed er, at vi kun behøver at lave en lille ændring af kommandoen, der samler afhængighederne.

  Sådan installeres Pgadmin på Linux

Vi kan hente kommandoen fra vores kommandohistorik ved at trykke på pil op-tasten et par gange og derefter foretage redigeringen. Kommandoen looping copy behøver slet ikke at ændres.

Her har vi brugt pil op-tasten til at finde kommandoen, og vi har redigeret den til at sige touch i stedet for bash.

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

Vi kan nu gentage nøjagtig samme loop-kommando som før:

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

for i i $list;  gør cp -v --forældre

Og vores filer er kopieret til os:

Vi kan nu redigere listens kommandolinje for ls:

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

Igen bruger vi den samme loop-kommando. Det er ligeglad med hvilke filer der er på listen. Det går blindt igennem listen og kopierer filerne for os.

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

for i i $list;  gør cp -v --forældre

Og afhængighederne for ls kopieres til os:

Vi redigerer listens kommandolinje for sidste gang, så den virker for rm:

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

Vi bruger looping copy-kommandoen en sidste gang:

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

De sidste af vores afhængigheder kopieres ind i vores chroot-miljø. Vi er endelig klar til at bruge chroot-kommandoen. Denne kommando angiver roden af ​​chroot-miljøet og angiver, hvilket program der skal køres som shell.

sudo chroot $chr /bin/bash

Vores chroot-miljø er nu aktivt. Terminalvinduets prompt er ændret, og den interaktive shell er den, der håndteres af bash-skallen i vores miljø.

Vi kan prøve de kommandoer, vi har bragt ind i miljøet.

ls
ls /home/dave/Documents

Kommandoen ls fungerer, som vi ville forvente, når vi bruger den i miljøet. Når vi forsøger at få adgang til en mappe uden for miljøet, fejler kommandoen.

Vi kan bruge berøring til at oprette en fil, ls til at liste den og rm til at fjerne den.

touch sample_file.txt
ls
rm sample_file.txt
ls

Vi kan selvfølgelig også bruge de indbyggede kommandoer, som Bash-skallen giver. Hvis du skriver hjælp på kommandolinjen, vil Bash liste dem for dig.

help

Brug exit for at forlade chroot-miljøet:

exit

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

rm -r testroot/

Dette vil rekursivt slette filerne og mapperne i chroot-miljøet.

Automatiser for nemheds skyld

Hvis du tænker, at chroot-miljøer kan være nyttige for dig, men de er lidt besværlige at sætte op, så husk, at du altid kan tage belastningen og risikoen ud af gentagne opgaver ved at bruge aliaser, funktioner og scripts.