Как да използвате командата chroot в Linux

Командата chroot може да ви изпрати в затвора, да запази вашата среда за разработка или тестване изолирана или просто да подобри сигурността на вашата система. Ние ви показваме най-лесния начин да го използвате.

Какво е chroot?

Ако се опитате да измерите полезността на дадена команда, трябва да вземете предвид функционалността, която предоставя, и лекотата на използване. Ако е твърде сложно за хората за използване или твърде дълго, за да ги накара да искат да се опитат да го използват, функционалността може също да е нулева. Ако никой не го използва, той не предоставя никаква функционалност.

В дискусиите с потребители на Linux – лично и във форуми – изглежда, че командата chroot е тази, която е определена като трудна за използване или твърде упорита и досадна за настройка. Изглежда, че тази страхотна помощна програма не се използва толкова много, колкото може да бъде.

С chroot можете да настроите и стартирайте програми или интерактивни обвивки като Bash в капсулирана файлова система, която е възпрепятствана да взаимодейства с вашата обикновена файлова система. Всичко в chroot средата е записано и съдържащо се. Нищо в chroot средата не може да види отвъд собствената си специална главна директория, без да ескалира до root привилегии. Това спечели на този тип среда прякора на chroot затвор. Терминът „затвор“ не трябва да се бърка с FreeBSD jail команда, която създава chroot среда това е по-сигурно отколкото обичайната среда chroot.

Но всъщност има много лесен начин за използване на chroot, през който ще преминем. Използваме обикновени Linux команди, които ще работят във всички дистрибуции. Някои дистрибуции на Linux имат специални инструменти за настройка на chroot среди, като напр debootstrap за Ubuntu, но тук сме дистро-агностици.

Кога трябва да използвате chroot?

Средата chroot предоставя функционалност, подобна на тази на виртуална машина, но е по-леко решение. Затворената система не се нуждае от хипервизор, за да бъде инсталиран и конфигуриран, като напр VirtualBox или Мениджър на виртуални машини. Нито пък е необходимо да има инсталирано ядро ​​в присвоената система. Затворената система споделя вашето съществуващо ядро.

В някои отношения chroot среди са по-близо до контейнери като напр LXC отколкото към виртуалните машини. Те са леки, бързи за внедряване и създаването и задействането на такъв може да бъде автоматизирано. Подобно на контейнерите, един удобен начин да ги конфигурирате е да инсталирате достатъчно от операционната система, за да постигнете необходимото. На въпроса „какво се изисква“ се отговаря, като се погледне как ще използвате вашата chroot среда.

Някои често срещани употреби са:

  Как да конвертирате PNG в JPG на Linux

Разработка на софтуер и проверка на продукта. Разработчиците пишат софтуер и екипът за проверка на продукта (PV) го тества. Понякога от PV се откриват проблеми, които не могат да бъдат репликирани на компютъра на разработчика. Разработчикът има всички видове инструменти и библиотеки, инсталирани на своя компютър за разработка, които обикновеният потребител — и PV — няма да имат. Често се оказва, че нов софтуер, който работи за разработчика, но не и за други, използва ресурс на компютъра на разработчика, който не е включен в тестовата версия на софтуера. chroot позволява на разработчиците да имат обикновена ванилова среда на своя компютър, в която да могат да потопят софтуера, преди да го дадат на PV. Затворената среда може да бъде конфигурирана с минималните зависимости, които софтуерът изисква.

Намаляване на риска за развитие. Разработчикът може да създаде специална среда за разработка, така че нищо, което се случва в нея, да обърка действителния му компютър.

Стартиране на остарял софтуер. Понякога просто трябва да имате стара версия на нещо, което работи. Ако старият софтуер има изисквания, които биха били в противоречие или са несъвместими с вашата версия на Linux, можете да chroot среда за проблемния софтуер.

Възстановяване и надстройки на файловата система: Ако инсталацията на Linux стане неработоспособна, можете да използвате chroot, за да монтирате повредената файлова система към точка за монтиране на Live CD. Това ви позволява да работите в повредената система и да се опитвате да я поправите, сякаш е монтирана нормално в root /. Това означава, че очакваните пътеки към файловете в повредената система ще бъдат правилно препратени от главната директория, а не от точката на монтиране на Live CD. Подобна техника беше използвана в статията, описваща как да мигрирате файловата система на Linux от ext2 или ext3 към ext4.

Приложения за ограждане на пръстени. Пускането на FTP сървър или друго свързано с интернет устройство в chroot среда ограничава щетите, които външният нападател може да причини. Това може да бъде ценна стъпка за укрепване на сигурността на вашата система.

Създаване на chroot среда

Нуждаем се от директория, която да действа като основна директория на chroot средата. За да имаме съкратен начин за препращане към тази директория, ще създадем променлива и ще съхраним името на директорията в нея. Тук настройваме променлива, която да съхранява път към директорията “testroot”. Няма значение дали тази директория все още не съществува, скоро ще я създадем. Ако директорията съществува, тя трябва да е празна.

chr=/home/dave/testroot

Ако директорията не съществува, трябва да я създадем. Можем да направим това с тази команда. Опцията -p (родители) гарантира, че всички липсващи родителски директории се създават едновременно:

mkdir -p $chr

Трябва да създадем директории, които да съхраняват частите от операционната система, които нашата chroot среда ще изисква. Ще настроим минималистична Linux среда, която използва Bash като интерактивна обвивка. Ще включим и командите touch, rm и ls. Това ще ни позволи да използваме всички вградени команди на Bash и touch, rm и ls. Ще можем да създаваме, изброяваме и премахваме файлове и да използваме Bash. И — в този прост пример — това е всичко.

  Как да инсталирате софтуер с помощта на Git на Linux

Избройте директориите, които трябва да създадете в {} разширяване на скоби.

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

Сега ще променим директорията в новата ни основна директория.

cd $chr

Нека копираме двоичните файлове, от които се нуждаем в нашата минималистична Linux среда от вашата обикновена директория “/bin” в нашата директория chroot “/bin”. Опцията -v (подробно) кара cp да ни каже какво прави, докато изпълнява всяко действие за копиране.

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

Файловете се копират за нас:

Тези двоични файлове ще имат зависимости. Трябва да открием какви са и да копираме тези файлове и в нашата среда, в противен случай bash, touch, rm и ls няма да могат да функционират. Трябва да направим това на свой ред за всяка от избраните от нас команди. Първо ще направим Bash. Командата ldd ще избройте зависимостите за нас.

ldd /bin/bash

Зависимостите са идентифицирани и изброени в прозореца на терминала:

Трябва да копираме тези файлове в новата ни среда. Избирането на подробностите от този списък и копирането им един по един ще отнеме време и ще бъде податливо на грешки.

За щастие можем да го полуавтоматизираме. Ще изброим отново зависимостите и този път ще съставим списък. След това ще преминем през списъка, копирайки файловете.

Тук използваме ldd, за да изброим зависимостите и да подадем резултатите през тръба в egrep. Използването на egrep е същото като използването на grep с опцията -E (разширени регулярни изрази). Опцията -o (само съвпадение) ограничава изхода до съответстващите части на редовете. Търсим съвпадащи библиотечни файлове, които завършват с число [0-9].

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

Можем да проверим съдържанието на списъка с помощта на ехо:

echo $list

Сега, когато имаме списъка, можем да преминем през него със следния цикъл, като копираме файловете един по един. Използваме променливата i, за да преминем през списъка. За всеки член на списъка копираме файла в нашата chroot основна директория, която е стойността, съхранявана в $chr.

Опцията -v (подробно) кара cp да обяви всяко копие, докато го изпълнява. Опцията –parents гарантира, че всички липсващи родителски директории се създават в chroot средата.

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

за i в $list;  направи cp -v --родители

И това е изходът:

Ще използваме тази техника, за да уловим зависимостите на всяка от другите команди. И ние ще използваме техниката на цикъла, за да извършим действителното копиране. Добрата новина е, че трябва само да направим малка редакция на командата, която събира зависимостите.

  Как да играете Path of Exile на Linux

Можем да извлечем командата от нашата история на командите, като натиснете клавиша със стрелка нагоре няколко пъти и след това извършим редакцията. Командата за копиране в цикъл не трябва да се променя изобщо.

Тук използвахме клавиша със стрелка нагоре, за да намерим командата, и я редактирахме така, че да казва touch вместо bash.

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

Сега можем да повторим точно същата команда за цикъл, както преди:

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

за i в $list;  направи cp -v --родители

И нашите файлове се копират за нас:

Вече можем да редактираме командния ред на списъка за ls:

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

Отново ще използваме същата команда за цикъл. Не се интересува кои файлове са в списъка. Той работи на сляпо чрез списъка, копирайки файловете вместо нас.

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

за i в $list;  направи cp -v --родители

И зависимостите за ls се копират за нас:

Редактираме командния ред на списъка за последен път, правейки го да работи за rm:

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

Използваме за последен път командата за копиране с цикъл:

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

Последните от нашите зависимости се копират в нашата chroot среда. Най-накрая сме готови да използваме командата chroot. Тази команда задава корена на средата chroot и определя кое приложение да се изпълнява като обвивката.

sudo chroot $chr /bin/bash

Нашата chroot среда вече е активна. Подканата на прозореца на терминала се промени и интерактивната обвивка се обработва от bash обвивката в нашата среда.

Можем да изпробваме командите, които сме внесли в средата.

ls
ls /home/dave/Documents

Командата ls работи както бихме очаквали, когато я използваме в средата. Когато се опитаме да осъществим достъп до директория извън средата, командата се проваля.

Можем да използваме touch, за да създадем файл, ls, за да го изброим, и rm, за да го премахнем.

touch sample_file.txt
ls
rm sample_file.txt
ls

Разбира се, можем да използваме и вградените команди, които предоставя обвивката на Bash. Ако въведете help в командния ред, Bash ще ги изброи вместо вас.

help

Използвайте exit, за да напуснете chroot средата:

exit

Ако искате да премахнете chroot средата, можете просто да я изтриете:

rm -r testroot/

Това ще изтрие рекурсивно файловете и директориите в chroot средата.

Автоматизирайте за удобство

Ако мислите, че chroot среди може да са ви полезни, но са малко трудни за настройка, не забравяйте, че винаги можете да поемете напрежението и риска от повтарящи се задачи, като използвате псевдоними, функции и скриптове.