Як використовувати команду 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.

Деякі поширені види використання:

Розробка програмного забезпечення та верифікація продукту. Розробники пишуть програмне забезпечення, а команда перевірки продукту (PV) тестує його. Іноді PV виявляє проблеми, які не можна відтворити на комп’ютері розробника. Розробник має всі види інструментів і бібліотек, встановлених на своєму комп’ютері розробника, яких не матиме пересічний користувач — і PV. Часто виявляється, що нове програмне забезпечення, яке працює на розробника, але не на інших, використовує ресурс на ПК розробника, який не був включений у тестовий випуск програмного забезпечення. chroot дозволяє розробникам мати на своєму комп’ютері звичайне середовище, в яке вони можуть занурювати програмне забезпечення, перш ніж передавати його PV. Пристрокове середовище можна налаштувати з мінімальними залежностями, які вимагає програмне забезпечення.

  Як грати в 911 Operator на Linux

Зниження ризику розвитку. Розробник може створити спеціальне середовище розробки, щоб ніщо, що відбувається в ньому, не могло зіпсувати його справжній ПК.

Запуск застарілого програмного забезпечення. Іноді вам просто потрібно мати стару версію чогось. Якщо старе програмне забезпечення має вимоги, які суперечать або несумісні з вашою версією 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. І — у цьому простому прикладі — це все.

  Як слухати подкасти на робочому столі Linux за допомогою CPod

Перелік каталогів, які потрібно створити в {} розширення брекетів.

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:

echo $list

Тепер, коли у нас є список, ми можемо пройти по ньому за допомогою наступного циклу, копіюючи файли по одному. Ми використовуємо змінну i для переходу по списку. Для кожного члена списку ми копіюємо файл у наш кореневий каталог chroot, який є значенням у $chr.

Параметр -v (докладний) змушує cp оголошувати кожну копію під час її виконання. Параметр –parents гарантує створення відсутніх батьківських каталогів у середовищі chroot.

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

for i в $list;  do cp -v --батьки

І це вихід:

Ми будемо використовувати цю техніку, щоб фіксувати залежності кожної з інших команд. І ми будемо використовувати техніку циклу для виконання фактичного копіювання. Хороша новина полягає в тому, що нам потрібно лише трохи змінити команду, яка збирає залежності.

  Як використовувати Gkill, щоб зупинити проблемні програми, що працюють на Linux

Ми можемо отримати команду з нашої історії команд, натиснувши клавішу зі стрілкою вгору кілька разів, а потім внести зміни. Команду циклічного копіювання взагалі не потрібно змінювати.

Тут ми використали клавішу зі стрілкою вгору, щоб знайти команду, і ми відредагували її, щоб сказати touch замість bash.

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

Тепер ми можемо повторити ту саму команду циклу, що й раніше:

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

for i в $list;  do cp -v --батьки

І наші файли копіюються для нас:

Тепер ми можемо редагувати командний рядок списку для ls:

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

Знову, ми будемо використовувати ту саму команду циклу. Не важливо, які файли в списку. Він сліпо працює через список, копіюючи файли для нас.

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

for i в $list;  do 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. Якщо ви введете довідку в командному рядку, Bash покаже їх для вас.

help

Використовуйте exit, щоб вийти з середовища chroot:

exit

Якщо ви хочете видалити середовище chroot, ви можете просто видалити його:

rm -r testroot/

Це призведе до рекурсивного видалення файлів і каталогів у середовищі chroot.

Автоматизуйте для зручності

Якщо ви думаєте, що середовища chroot можуть бути корисними для вас, але їх трохи складно налаштувати, пам’ятайте, що ви завжди можете позбутися від повторюваних завдань, використовуючи псевдоніми, функції та сценарії.