При обслуговуванні систем на базі Linux, нерідко виникають ситуації, коли необхідно отримати доступ до кореневої файлової системи (ФС) із зовнішнього системного середовища або просто тимчасово, наприклад, на годину обслуговування, змінити шлях кореневої ФС для виконання процесів системи. Для цього у Linux-систем існує команда chroot. Вона досить проста, проте використовується вона в дуже відповідальних та технічно досить складних ситуаціях.
У яких випадках зручне використання chroot?
Отже, команда chroot дозволяє змінити системне оточення для виконуваних процесів. Таким чином, вони не можуть отримати доступ до ресурсів поза новим оточенням. Виходячи з цього, використання chroot дуже практичне, наприклад у наступних ситуаціях:
- скидання паролів суперкористувача root;
- оновлення або створення образів initramfs для ядра;
- відновлення стану пакетів додатків;
- відновлення або оновлення роботи завантажувача, наприклад, GRUB – це найпоширеніша ситуація.
Як бачимо, номенклатура застосування для chroot досить широка. При тому, що самі перераховані вище завдання вимагають хорошого досвіду при роботі та/або адмініструванні UNIX/Linux-систем.
Окремо стоїть питання безпеки. Адже в такій ситуації навіть за допомогою «нешкідливого» Live-CD/DVD/USB абсолютно потай можна скомпрометувати систему і зробити з системою все що завгодно. Але слід зазначити, що це вже переважно питання про рівень фізичного доступу до самої системи.
Синтаксис та основні опції
Згідно з офіційною документацією, синтаксис команди chroot наступний:
chroot [OPTION] NEWROOT [COMMAND [ARG]. . .]
Як видно, як NEWROOT вказується новий шлях у файловій системі, далі може йти, власне, команда зі своїми аргументами. У наступній таблиці наведено опції chroot, яких не так багато:
Опція | Значення |
---|---|
—groups=G_LIST | Задає список груп користувачів перерахуванням у форматі g1, g2, … gn. |
—userspec=USER:GROUP | Задає користувача та групу у форматі КОРИСТУВАЧ: ГРУПА. |
—skip-chdir | Забороняє зміну робочого каталогу на кореневий “/”. |
Підготовка системного середовища для режиму Chroot
Для того, щоб забезпечити повноцінне використання Chroot-середовища, необхідно попередньо дотримуватися ряду умів, а також підготувати для нього відповідне оточення.
По перше:
- обчислювальні архітектури двох оточень повинні бути ідентичні, тобто якщо середовище, з якого відбувається завантаження є amd64-архітектурою, то і середовище, в якому проводитися зміна кореневої ФС має бути також amd64;
- для середовища Chroot повинні бути підключені модулі ядра, які їй потрібні відповідно до виконуваних завдань, наприклад, повинні бути підключені модулі для забезпечення роботи з різними типами ФС;
- Наявність можливості завантаження із Live-образів: CD/DVD/USB-носій;
- привілеї суперкористувача root.
По-друге:
Повинен бути примонтований кореневий розділ тієї Linux-системи, в яку необхідно виконати chroot. Щоб легше зорієнтуватися в найменуванні розділів та визначити потрібний, можна скористатися командою lsblk – вона виведе найменування всіх доступних у системі розділів з відповідними точками монтування:
$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 232,9G 0 disk
├─sda1 8:1 0 524M 0 part /boot
├─sda2 8:2 0 18,6G 0 part /
├─sda3 8:3 0 167,7G 0 part /usr
├─sda4 8:4 0 18,6G 0 part /var
└─sda5 8:5 0 27,5G 0 part /opt
sdb 8:32 0 149,1G 0 disk
└─sdb1 8:33 0 149,1G 0 part /home
sr0 11:0 1 1024M 0 rom
В цьому випадку це sda2. Тепер потрібно створити каталог для монтування цього розділу та примонтувати його командою mount:
$ sudo mkdir /mnt/test
$ sudo mount /dev/sda2 /mnt/test
Якщо інші обов’язкові системні каталоги (/home, /boot) винесені до окремих розділів, їх необхідно примонтувати:
$ sudo mount /dev/sda1 /mnt/test/boot/
$ sudo mount /dev/sdb1 /mnt/test/home/
По-третє:
Тепер слід примонтувати службові каталоги, необхідні для забезпечення взаємодії майбутнього системного середовища Chroot з ядром:
$ cd /mnt/test
$ sudo mount -t proc proc proc/
$ sudo mount --rbind /sys sys/
$ sudo mount --rbind /dev dev/
Іноді для того, щоб було можливо використовувати мережу, необхідно скопіювати файл resolv.conf:
$ sudo cp /etc/resolv.conf etc/resolv.conf
Тепер можна під’єднати командну оболонку (наприклад Bash) до нового кореня і, власне, створити нове середовище Chroot:
sudo chroot /mnt/test /bin/bash
З цього моменту все системне оточення переорієнтоване на роботу з кореневою ФС розділу sda2 та пов’язаними з ним іншими системними та службовими каталогами.
Корисним буде також виконати ініціалізацію системних та сеансових (користувацьких) змінних оточення:
$ source /etc/profile
$ source ~/.bashrc
По завершенню роботи в середовищі Chroot, вихід з неї здійснюється командою:
$ exit
Після цього необхідно змонтувати кореневу та решту ФС, які були примонтовані раніше:
$ cd /
$ sudo umount --recursive /mnt/test/
Питання безпеки
При першому знайомстві з командою chroot, та й взагалі з роботою Chroot-середовища, цілком закономірно може здатися, що цю техніку можна використовувати для захисту системи. І це справді так і є, але лише частково, оскільки chroot допустимо використовувати як додатковий рівень захисту, що звужує напрямки та варіанти атак.
Насправді ж вийти із Chroot-оточення досить легко. Це пов’язано, в першу чергу, з недосконалістю механізму роботи chroot, оскільки він створювався спочатку для швидкого та відносно простого доступу до ресурсів системи «ззовні». Безпеки як такої уваги практично не приділялося, оскільки знову ж таки передбачалося використання chroot лише у випадках погодженого та довіреного доступу до системи.
Механізми обходу chroot досить прості. Наприклад, один з них полягає у створенні в Chroot-середовище файлу-пристрою для пристрою зберігання з подальшим зверненням до цього пристрою за допомогою цього файлу.
Висновок
Насамкінець варто ще раз відзначити, що використання chroot вимагає особливої делікатності. Допускати до роботи з chroot слід перевірених користувачів. В іншому ж, як можна було переконатись, сама команда дуже проста. На основі її застосування лежать правильне визначення цільових розділів та грамотне їх монтування. Тобто. належна підготовка системного середовища для Chroot.
Якщо помітили помилки чи неточності, будь ласка, залишіть коментар чи напишіть листа на поштову адресу [email protected]