При обслуживании систем на базе 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.
Спасибо, лучшая статья по этой теме
Хорошая статья получилась. Приятно читать. Спасибо.