Chroot linux что это
Перейти к содержимому

Chroot linux что это

  • автор:

Что такое chroot jail и как этим пользоваться?

img

Термин chroot jail появился еще в 1992 году но часто используется сегодня. Что же это означает и для чего используется эта операция?

Что такое chroot jail?

Chroot (сокращение от change root) — это операция Unix, которая изменяет видимый корневой каталог на тот, который задан пользователем.

Любой процесс, который вы запускаете после операции chroot , имеет доступ только к новому определенному корневому каталогу и его подкаталогам. Эта операция широко известна как chroot jail , поскольку эти процессы не могут читать или писать вне нового корневого каталога.

Для чего используется chroot jail?

Chroot jail используется для создания ограниченной «песочницы» для запуска процесса. Это означает, что процесс не может злонамеренно изменять данные за пределами предписанного дерева каталогов.

Еще одно применение chroot jail — это замена виртуальным машинам. Этот метод называется виртуализацией на уровне ядра и требует меньше ресурсов, чем виртуальные машины. Эта операция позволяет пользователям создавать несколько изолированных инстансов в одной системе.

Как использовать chroot jail

Рассмотрим на примере как создать и настроить chroot jail, чтобы он мог запускать команды bash и ls.

1. Создайте новый каталог с именем chroot_jail :

mkdir chroot_jail

Если мы попытаемся использовать chroot на этом каталоге, мы получим следующий вывод:

chroot chroot_jail

Вы должны включить команду bash , прежде чем сможете использовать chroot на новом каталоге. Для этого необходимо скопировать командный файл и все связанные библиотеки в новый корневой каталог.

2. Создайте новое дерево подкаталогов внутри chroot_jail :

mkdir -p chroot_jail / bin chroot_jail / lib64 / x86_64-linux-gnu chroot_jail / lib / x86_64-linux-gnu

В этих подкаталогах будут храниться все необходимые элементы команд bash и ls .

3. Использование команды cp с командой which позволяет копировать команды bash и ls без указания пути, из которого вы копируете.

Для этого используйте:

cp $(which ls) chroot_jail/bin/ cp $(which bash) chroot_jail/bin/

Примечание. Если ваша команда bash или ls имеет псевдоним, вам необходимо снять его перед копированием. Используйте unalias [command] , где [command] — это имя команды, которую вы хотите удалить.

4. Чтобы bash и ls работали в новой корневой папке, добавьте все связанные библиотеки в chroot_jail/libraries . Используйте команду ldd , чтобы узнать, какие библиотеки связаны с какой командой:

ldd $(which bash) ldd $(which ls)

ldd

5. Скопируйте соответствующие библиотеки в подкаталоги lib и lib64 .

Для команды bash :

cp /lib/x86_64-linux-gnu/libtinfo.so.6 chroot_jail/lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libdl.so.2 chroot_jail/lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libc.so.6 chroot_jail/lib/x86_64-linux-gnu/ cp /lib64/ld-linux-x86-64.so.2 chroot_jail/lib64/
cp /lib/x86_64-linux-gnu/libselinux.so.1 chroot_jail/lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libc.so.6 chroot_jail/lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libpcre2-8.so.0 chroot_jail/lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libdl.so.2 chroot_jail/lib/x86_64-linux-gnu/ cp /lib64/ld-linux-x86-64.so.2 chroot_jail/lib64/ cp /lib/x86_64-linux-gnu/libpthread.so.0 chroot_jail/lib/x86_64-linux-gnu/

6. Используйте команду chroot , чтобы изменить root на каталог chroot_jail :

sudo chroot chroot_jail

sudo chroot chroot_jail

Примечание. При изменении корневого каталога на каталог chroot_jail запускается новый экземпляр оболочки bash .

Используйте команду ls , чтобы вывести список всех файлов и каталогов в новом корневом дереве каталогов:

ls -R

ls -R

7. Как только вы закончите использовать новую корневую папку, выйдите из оболочки:

exit

Заключение

После выполнения этого руководства вы сможете настроить chroot jail вместе с необходимыми ресурсами для запуска процессов и команд в новом корневом каталоге.

Chroot в Linux

Chroot в Linux — способ запуска процессов, системный вызов и просто команда, позволяющая изменить корневой каталог в системе. chroot используется при восстановлении работы системы после сбоя когда система не грузится и приходится использовать внешний носитель.

Также через chroot иногда выполняется изначальная настройка, подготовка окружений. В chroot запускаются приложения и виртуальные машины для того чтобы добиться изоляции их процессов.

Использование Chroot в Linux

chroot — способ попасть в консоль системы, которая не может запуститься из другой системы (live usb, режима восстановления, сервера в файловую систему которого примонтирован корневой раздел сервера для которого нужен chroot).

chroot используется для создания изолированного окружения — jail для процессов, а также для сборки пакетов методом debootstrap.

Командой chroot с указанием каталога запускается механизм, создающий систему директорий в этом каталоге идентичную той, что существует в корне . Команда выполняется только от имени суперпользователя.

Рассмотрим пример выполнения смены корневого каталога на /mnt — chroot /mnt.

Это бывает нужно при работе с системой со съемного носителя или в режиме восстановления.

Допустим, что мы подготавливаем образ виртуальной машины, для неё нет загрузчика и она не может загрузиться, при этом нужно попасть в систему.

Всё описанное точно так же применимо к случаю когда chroot используется чтобы из режима восстановления попасть в консоль сервера, на котором произошел сбой и который не загружается.

Проверяем содержимое корневого каталога системы, из которой работаем.

bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var

В /mnt при этом пока никаких каталогов и файлов нет.

В mnt с помощью mount /dev/vda2 /mnt примонтирован системный диск сервера, для которого будем выполнять chroot

lost+found

При выполнении chroot получаем ошибку

chroot: failed to run command ‘/bin/bash’: No such file or directory

Как устранить ошибку ‘chroot: failed to run command ‘/bin/bash’: No such file or directory’

Ошибка возникает из-за отсутствия в каталоге, который делается корневым, необходимых библиотек и бинарных файлов. В частности, судя по ошибке, нет файла оболочки /bin/bash.

Исправить ошибку можно скопировав файлы хост системы в chroot. Это безопасно делать если используемая система и система, в которую выполняется chroot используют один дистрибутив.

Также может потребоваться скопировать зависимости /bin/bash, их можно посмотреть выполнив ldd /mnt/bin/bash

Теперь ошибок быть не должно, выполняя chroot /mnt попадаем в консоль системы, корень которой смонтирован в /mnt

bin lib lib64 usr

Каталогов в новом корне нет, но их можно в зависимости от задачи создать, скопировать с другой системы или подмонтировать из основной системы.

В последнем случае chroot будут не копии, а именно каталоги из хост системы.

Так обычно делают для /dev, /sys, /proc чтобы получить возможность управлять процессами в chroot. По умолчанию её нет.

Как выполнить монтирование /dev, /sys, /proc

Выходим из chroot в основную систему через ctrl+c, ctrl+d, потом выполняем монтирование с ключом —bind

mount —bind /dev /mnt/dev

mount —bind /sys /mnt/sys

mount —bind /proc /mnt/proc

Теперь вернувшись в chroot видим, что стало доступно управление процессами

PID TTY TIME CMD
21294 ? 00:00:00 bash
21673 ? 00:00:00 bash
21689 ? 00:00:00 ps

Пример chroot в Linux системе для которой предупреждения про /bin/bash не возникло приведен на скриншоте:

chroot в linux

Видно, что после выполнения chroot поменялось приглашение к вводу. Если предварительно также подмонтировать /dev, /sys, /proc в системе можно будет управлять процессами.

Важно, что выполнив ps aux можно получить доступ к процессам всей системы, а не только chroot.

Это может являться угрозой безопасности и при запуске процессов только на изоляцию даваемую chroot полагаться не стоит.

chroot стоит использовать для сборки пакетов под разные системы на одном хосте или для тестирования какого-либо ПО.

Также он нужен чтобы запуститься со съемного носителя когда на основной машине неработоспособен загрузчик.

Для использования в качестве системы для восстановления подходит Linux Tiny Core.

Chroot linux что это

Команда chroot позволяет выполнить другую команду с измененным путем к корневой директории. Хотя она и может пригодиться для выполнения различных административных задач, чаще всего о ней упоминают как о методе защиты отдельных служб или процессов, заключающемся в их запуске с использованием новой нестандартной корневой директории. Преимущество данного метода заключается в том, что служба или процесс исполняется в окружении chroot, изолированном от таких важных хранилищ системных файлов, как директория /etc или других не менее важных файлов, хранящихся в системных директориях. Вместе с данным методом защиты используется еще один метод, заключающийся в запуске служб или процессов с использованием учетных записей пользователей с минимальными наборами привилегий.

Например, при активации поддержки chroot служба доменных имен named использует в качестве корневой директории директорию /var/named/ и запускается от лица локального пользователя с именем «named» (с минимальными привилегиями) в отличие от корневой директории системы и учетной записи пользователя root. Поэтому если сервер named будет скомпрометирован взломщиком или вредоносной программой, будут повреждены лишь файлы из директории /var/named (новой корневой директории сервера), ведь служба named не может получить доступ к файлам, находящимися за приделами окружения chroot, а пользователь с именем named не имеет достаточных прав для чтения каких-либо других системных файлов.

Обратите внимание на то, что окружение chroot все же можно покинуть с помощью различных специальных техник. Одна из таких техник связана с созданием файла устройства (с помощью команды mknod) для жесткого диска в рамках окружения chroot и доступом к содержимому этого жесткого диска посредством созданного файла устройства. Еще одна техника связана с осуществлением манипуляций с сетевым трафиком, передаваемым на машину и отправляемым с нее. Наконец, существует еще одна техника, связанная с управлением работой ядра ОС либо напрямую, либо посредством дополнительных загруженных модулей.

Базовый синтаксис команды выглядит следующим образом:

Вы можете указать имена пользователя и группы пользователей, от лица которых должна быть выполнена команда, с помощью параметра —userspec=: или перечислить дополнительные группы пользователей будущего процесса с помощью параметра —groups=, . .

Примеры использования

Запуск процесса с измененной корневой директорией

# chroot /home/alex /home/alex/myprogram

Запуск процесса с измененной корневой директорией от лица другого пользователя

# chroot —userspec=test:test /home/alex /home/alex/myprogram

Запуск процесса с измененной корневой директорией с дополнительными группами пользователей

# chroot —userspec=test:test —groups=dialout /home/alex /home/alex/myprogram

Советы по использованию поддержки chroot в системных службах

Для того, чтобы сократить шансы проникновения злоумышленников за пределы окружения chroot с помощью одной из выше описанных техник следует смонтировать файловую систему для окружения chroot с параметром «nodev». Создание небольшой узловой файловой системы или раздела для окружения chroot не представляет каких-либо сложностей.

Apache

Хотя веб-сервер Apache и может быть запущен посредством команды chroot таким же образом, как и любая системная служба, существует также специализированный модуль под названием «mod_chroot», который может использоваться для автоматического запуска Apache в окружении chroot после добавления дополнительной строки в файл конфигурации /etc/httpd.conf.

BIND

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

FTP

Некоторые серверы FTP автоматически активируют поддержку chroot после добавления символа точки «.» (соответствующего текущей директории) в путь к домашней директории соответствующего пользователя в файле /etc/passwd.

chroot (Русский)

Состояние перевода: На этой странице представлен перевод статьи chroot. Дата последней синхронизации: 30 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Chroot — операция изменения корневого каталога диска для запущенного процесса и его дочерних процессов. Программа, запущенная в таком окружении, не может получить доступ к файлам вне нового корневого каталога. Это измененное окружение называется chroot jail.

Причины

Изменение корневого каталога обычно производится при обслуживании системы, загрузка и/или вход в которую стали невозможны. В таком режиме, например, могут быть выполнены:

  • Переустановка загрузчика.
  • Пересборка образа initramfs.
  • Обновление или откат пакетов.
  • Сброс пароля root.
  • Сборка пакетов в чистом окружении, смотрите DeveloperWiki:Building in a clean chroot.

Требования

  • Наличие привилегий суперпользователя.
  • Возможность загрузки с другой среды Linux, например, LiveCD, загрузочного USB-носителя или другого установленного дистрибутива.
  • Совпадение архитектур двух сред: с которой производится загрузка и в которую происходит изменение корня. Архитектуру текущей среды можно узнать командой uname -m (например, i686 или x86_64).
  • Если среде chroot необходимы какие-нибудь модули ядра, они должны быть загружены.
  • Если нужен раздел подкачки, он должен быть включен: # swapon /dev/sdxY .
  • Интернет-соединение установлено, если нужно.

Использование

  • Некоторые инструменты systemd, такие как hostnamectl, localectl и timedatectl, не работают внутри внутри chroot, поскольку они требуют активного dbus-соединения. [1]
  • Файловая система, которая станет новым корнем ( / ), должна быть доступна (т.е. расшифрована, смонтирована).

Есть два варианта использования chroot.

Используя arch-chroot

Bash-скрипт arch-chroot является частью пакета arch-install-scripts . Перед запуском /usr/bin/chroot он монтирует нужные виртуальные файловые системы, например /proc , и делает /etc/resolv.conf доступным из chroot.

Переход в chroot

Запустите arch-chroot с указанием нового корневого каталога:

# arch-chroot /путь/к/новому/корню 

Например, руководство по установке использует каталог /mnt :

# arch-chroot /mnt

Выход из chroot простой:

# exit
Запуск одной команды и выход

Чтобы запустить команду из chroot и сразу выйти, добавьте команду в конец строки:

# arch-chroot /путь/к/новому/корню команда 

Чтобы запустить mkinitcpio -p linux в окружении chroot минуя создание сеанса в командной оболочке:

# arch-chroot /mnt/arch /usr/bin/mkinitcpio -p linux

Используя chroot

Важно: При использовании —rbind некоторые подкаталоги dev/ и sys/ не будут размонтированы. Попытка размонтирования с помощью umount -l в такой ситуации сломает ваш сеанс, и потребуется перезагрузка. По возможности используйте вместо этого -o bind .

В данном примере /путь/к/новому/корню является каталогом, который станет корнем файловой системы внутри chroot.

Смонтируйте временные интерфейсные файловые системы:

# cd /путь/к/новому/корню # mount -t proc proc proc/ # mount -t sysfs /sys sys/ # mount --rbind /dev dev/
# mount --rbind /run run/

Если у вас UEFI, вам также может поднадобиться доступ к переменным EFI. Без них попытка установки GRUB приведёт к ошибке вроде UEFI variables not supported on this machine :

# mount --rbind /sys/firmware/efi/efivars sys/firmware/efi/efivars/

Чтобы использовать интернет-соединение в chroot может понадобиться скопировать resolv.conf:

# cp /etc/resolv.conf etc/resolv.conf

Чтобы запустить bash в окружении chroot:

# chroot /путь/к/новому/корню /bin/bash
  • chroot: cannot run command ‘/usr/bin/bash’: Exec format error , это значит, что архитектуры основной среды и среды нового корневого каталога не совпадают.
  • chroot: ‘/usr/bin/bash’: permission denied , перемонтируйте раздел с разрешением exec: mount -o remount,exec /mnt/arch .
    • Если это не помогает, убедитесь, что базовые компоненты новой среды не повреждены (если это корень Arch, попробуйте paccheck —root=/путь/к/новому/корню —files —file-properties —md5sum glibc filesystem из пакета pacutils )

    После входа в сеанс chroot может понадобиться проинициализировать среду командной оболочки в новой среде:

    # source /etc/profile # source ~/.bashrc

    Совет: Вы также можете установить другое приглашение командной оболочки для того, чтобы отличать среду chroot от основной:

    # export PS1="(chroot) $PS1"

    После завершения работы выйдите из сеанса chroot:

    # exit

    Теперь размонтируйте временные файловые системы и корневой раздел:

    # cd / # umount --recursive /путь/к/новому/корню 

    Примечание: Если есть ошибки вроде umount: /path: device is busy , это обычно означает, что либо какая-то программа (даже командная оболочка) осталась запущенной в chroot, либо что-то внутри всё ещё примонтировано. Выйдите из программы и используйте findmnt -R /путь/к/новому/корню чтобы найти и затем размонтировать оставшиеся точки монтирования. Может быть несколько непросто размонтировать некоторые вещи, и можно понадеяться, что сработает umount —force . В качестве последнего средства используйте umount —lazy , который просто освобождает устройства. В любом случае, чтобы перестраховаться, перезагрузитесь как можно скорее, если эти проблемы не решены, чтобы избежать возможных конфликтов в будущем.

    Запуск графических приложений в среде chroot

    Если у вас есть запущенный X-сервер, вы сможете запускать даже графические приложения в среде chroot.

    Чтобы разрешить среде chroot соединение с сервером X, откройте виртуальный терминал внутри сервера (то есть, внутри рабочего стола пользователя, который в данный момент вошел в систему), запустите команду xhost, которая даст права каждому подключаться к X-серверу пользователя:

    $ xhost +local:

    Теперь, для соединения приложений с сервером X, установите переменной окружения DISPLAY в сеансе chroot значение, совпадающее с переменной окружения DISPLAY пользователя, от имени которого запущен сервер. То есть, выполните

    $ echo $DISPLAY

    от имени этого пользователя для того, чтобы узнать значение переменной, и выполните

    # export DISPLAY=:0

    в среде chroot, установив переменной нужное значение (в данном примере это :0 ).

    Без прав суперпользователя

    Chroot требует привелегий суперпользователя, что может быть нежелательно. Однако, есть несколько способов симулировать работу chroot, используя альтернативные реализации.

    PRoot

    PRoot может использоваться для изменения корневого раздела и использовать mount —bind без привелегий суперпользователя. Это полезно для ограничивания доступа приложений до единственного каталога или запуска программ, собранных для другой архитектуры. Однако PRoot имеет ограничения, связанные с тем, что все файлы принадлежат пользователю на основной системе. PRoot предоставляет опцию —root-id , которая может быть использована в качестве обходного пути для этих ограничений, по тому же принципу (хотя и более ограниченно), что и в fakeroot.

    Fakechroot

    fakechroot является небольшой прослойкой, которая перехватывает системные вызовы chroot и симулирует поведение системы, на самом деле не выполняя реальных вызовов (на которые все равно нет прав). Он может использоваться вместе с fakeroot для создания видимости того, что chroot запускается суперпользователем.

    # fakechroot fakeroot chroot ~/my-chroot bash

    Unshare

    Unshare можно использовать для создания нового пространства имён в ядре. Он входит в состав пакета util-linux . Он работает с обычной командой chroot. Пример:

    $ unshare --map-root-user chroot ~/namespace /bin/sh

    Решение проблем

    arch-chroot: /путь/к/новому/корню is not a mountpoint. This may have undesirable side effects.

    При выполнении arch-chroot /путь/к/новому/корню может появиться такое предупреждение:

    ==> WARNING: /путь/к/новому/корню is not a mountpoint. This may have undesirable side effects.

    Объяснение этого можно прочитать в arch-chroot(8) ; там же вы найдёте пример, как превратить каталог в точку монтирования с помощью bind mount.

    Смотрите также

    Retrieved from «https://wiki.archlinux.org/index.php?title=Chroot_(Русский)&oldid=723314»

    • System recovery (Русский)
    • Sandboxing (Русский)
    • Commands (Русский)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *