Введение

Операция, которая изменяет видимый корневой каталог в Unix-подобных системах.

chroot – это операция в Unix и Unix-подобных операционных системах, которая изменяет видимый корневой каталог для текущего выполняющегося процесса и его дочерних процессов. Программа, запущенная в такой измененной среде, не может указать (и, следовательно, обычно не может получить доступ) файлы за пределами указанного дерева каталогов. Термин "chroot" может относиться к системному вызову или к программе-оболочке. Измененная среда называется chroot-изоляцией.

История

Система chroot была введена во время разработки Unix версии 7 в 1979 году. Один источник утверждает, что Билл Джой добавил её 18 марта 1982 года – за 17 месяцев до выхода 4.2BSD – для тестирования системы установки и сборки. Все версии BSD, имеющие ядро, включают chroot(2). Раннее использование термина "jail" (тюрьма) применительно к chroot связано с Биллом Чесвиком, создавшим honeypot для наблюдения за хакером в 1991 году. Первая статья о джейлбрейке была опубликована в колонке о безопасности SunWorld Online, написанной Кэрол Феннелли; выпуски за август и январь 1999 года охватывают большинство тем, связанных с chroot. Чтобы сделать её полезной для виртуализации, FreeBSD расширила эту концепцию и в выпуске 4.0 в 2000 году представила команду jail. К 2002 году в статье Николя Буатье было описано, как создать jail в Linux. К 2003 году первые интернет-провайдеры микросервисов, использующие Linux jails, предоставляли услуги SAAS/PAAS (shell-контейнеры, прокси, ircd, боты и т.д.), оплачиваемые за потребление ресурсов внутри jail в зависимости от использования. К 2005 году Sun выпустила Solaris Containers (также известные как Solaris Zones), которые описывались как "chroot на стероидах". К 2008 году LXC (на основе которого позже был создан Docker) приняла терминологию "контейнер" и приобрела популярность в 2013 году благодаря включению пользовательных пространств имен в ядро Linux 3.8.

Применение

В среде chroot можно создавать и размещать отдельную виртуализированную копию программной системы. Это может быть полезно для:
Тестирования и разработки. В chroot можно создать тестовую среду для программного обеспечения, которое было бы слишком рискованно развертывать в производственной системе.
Контроля зависимостей. Программное обеспечение можно разрабатывать, собирать и тестировать в chroot, содержащем только необходимые зависимости. Это позволяет избежать проблем с несовместимостью библиотек, возникающих при сборке проектов разными разработчиками с использованием различных наборов программных библиотек.
Обеспечения совместимости. Устаревшее программное обеспечение или программное обеспечение, использующее другой ABI, иногда необходимо запускать в chroot, чтобы его библиотеки или файлы данных не конфликтовали по именам или связям с библиотеками и файлами хост-системы.
Восстановления системы. Если система перестала загружаться, chroot можно использовать для возврата в поврежденную среду после загрузки с альтернативной корневой файловой системы (например, с установочного носителя или Live CD).
Разделения привилегий. Программы могут переносить открытые файловые дескрипторы (для файлов, каналов и сетевых соединений) в chroot, что упрощает создание изолированной среды, избавляя от необходимости хранить рабочие файлы внутри каталога chroot. Это также упрощает распространенную практику запуска потенциально уязвимых частей привилегированной программы в "песочнице" для предотвращения утечки информации в случае нарушения безопасности. Следует отметить, что chroot не всегда достаточно для изоляции процесса с правами root.

Ограничения

Механизм chroot не предназначен для защиты от преднамеренного вмешательства привилегированных (root) пользователей. Заметным исключением является NetBSD, на которой chroot считается механизмом безопасности и не известно случаев обхода защиты. На большинстве систем контексты chroot не складываются должным образом, и программы с достаточными привилегиями могут выполнить второй chroot, чтобы выйти из изолированной среды. Чтобы снизить риск этих уязвимостей, программы, работающие в chroot, должны отказаться от привилегий root как можно скорее после применения chroot, или вместо этого следует использовать другие механизмы, такие как FreeBSD jails. Следует отметить, что некоторые системы, такие как FreeBSD, принимают меры предосторожности для предотвращения повторного применения chroot. В системах, поддерживающих узлы устройств в обычных файловых системах, пользователь root в chroot-окружении всё ещё может создавать узлы устройств и монтировать файловые системы на них; таким образом, механизм chroot не предназначен для блокирования доступа на низком уровне к системным устройствам привилегированными пользователями. Он также не предназначен для ограничения использования ресурсов, таких как ввод/вывод, пропускная способность, дисковое пространство или время процессора. Большинство Unix-систем не полностью ориентированы на файловую систему и оставляют потенциально опасные функции, такие как сетевое взаимодействие и управление процессами, доступными через системные вызовы для программы, работающей в chroot. При запуске программы ожидают найти временные файлы, файлы конфигурации, узлы устройств и общие библиотеки в определенных предопределенных местах. Для успешного запуска программы в chroot-окружении, каталог chroot должен содержать минимальный набор этих файлов. Это может затруднить использование chroot в качестве универсального механизма для создания изолированной среды. Инструменты, такие как Jailkit, могут помочь упростить и автоматизировать этот процесс. Применить chroot может только пользователь root. Это сделано для предотвращения того, чтобы пользователи помещали программу с установленным битом setuid внутрь специально созданной chroot-тюрьмы (например, с поддельными файлами и ), которая могла бы обмануть её и привести к повышению привилегий. Некоторые Unix-системы предлагают расширения механизма chroot для устранения хотя бы некоторых из этих ограничений (см. Реализации технологий виртуализации на уровне операционной системы).

Примечательные применения

Агент передачи почты Postfix функционирует как конвейер из отдельных, изолированных с помощью chroot вспомогательных программ. Подобно 4.2BSD, внутренние системы сборки пакетов Debian и Ubuntu широко используют chroot для выявления непреднамеренных зависимостей между пакетами. SUSE применяет аналогичный подход в своей программе сборки. Fedora, Red Hat и многие другие дистрибутивы на основе RPM собирают все RPM-пакеты с использованием инструмента chroot, например mock. Многие FTP-серверы для POSIX-систем используют механизм chroot для изоляции ненадежных FTP-клиентов. Это достигается путем создания дочернего процесса для обработки входящего соединения, а затем применения chroot к этому процессу (чтобы избежать необходимости заполнять chroot библиотеками, необходимыми для запуска программы). При включенном разделении привилегий демон OpenSSH изолирует непривилегированный вспомогательный процесс в пустую директорию для обработки сетевого трафика до аутентификации каждого клиента. Демон также может изолировать SFTP и сеансы оболочки в chroot (начиная с версии 4.9p1). ChromeOS может использовать chroot для запуска экземпляра Linux с помощью Crouton, предоставляя в противном случае легковесной операционной системе доступ к аппаратным ресурсам. К данной ситуации применимы соображения безопасности, описанные в этой статье.