chroot
— это операция в Unix и Unix-подобных операционных системах , которая изменяет видимый корневой каталог для текущего запущенного процесса и его потомков . Программа, запущенная в такой измененной среде, не может называть файлы за пределами указанного дерева каталогов (и, следовательно, обычно не может получить к ним доступ). Термин «chroot» может относиться к системному вызову chroot(2) или программе-оболочке chroot(8) . Измененная среда называется chroot jail .
Системный вызов chroot был представлен во время разработки версии 7 Unix в 1979 году. Один источник предполагает, что Билл Джой добавил его 18 марта 1982 года — за 17 месяцев до выпуска 4.2BSD — для тестирования его установки и системы сборки. [1] Все версии BSD, имеющие ядро, имеют chroot(2). [2] [3] Раннее использование термина «jail» в применении к chroot произошло от Билла Чесвика, создавшего honeypot для слежки за хакером в 1991 году. [4]
Первая статья о джейлбрейке обсуждалась в колонке по безопасности SunWorld Online, которую пишет Кэрол Феннелли; выпуски за август 1999 и январь 1999 охватывают большинство тем chroot(). [5]
Чтобы сделать его полезным для виртуализации , FreeBSD расширила концепцию и в версии 4.0 в 2000 году представила команду jail . [6]
В 2002 году в статье Николаса Буато было описано, как создать тюрьму в Linux. [7]
К 2003 году первые поставщики микросервисов Интернета с Linux-тюрьмами стали предоставлять услуги SAAS/PAAS (контейнеры оболочек, прокси, IRCD, боты, ...) с оплатой за потребление в тюрьме по факту использования. [8]
К 2005 году Sun выпустила Solaris Containers (также известные как Solaris Zones), описанные как «chroot на стероидах». [9]
К 2008 году LXC (на основе которого позже был построен Docker ) принял терминологию «контейнер» [10] и приобрел популярность в 2013 году благодаря включению в ядро Linux 3.8 пользовательских пространств имен . [11]
Среду chroot можно использовать для создания и размещения отдельной виртуализированной копии программной системы. Это может быть полезно для:
Механизм chroot не предназначен для защиты от преднамеренного вмешательства привилегированных (root) пользователей. Заметным исключением является NetBSD , в которой chroot считается механизмом безопасности, и не известны никакие выходы. В большинстве систем контексты chroot не складываются должным образом, и chroot-программы с достаточными привилегиями могут выполнить второй chroot, чтобы выйти из него. Чтобы снизить риск этих уязвимостей безопасности, chroot-программы должны отказаться от привилегий root как можно скорее после chroot, или вместо этого следует использовать другие механизмы, такие как тюрьмы FreeBSD . Обратите внимание, что некоторые системы, такие как FreeBSD , принимают меры предосторожности для предотвращения второй атаки chroot. [12]
В системах, которые поддерживают узлы устройств в обычных файловых системах, chroot- пользователь root может по-прежнему создавать узлы устройств и монтировать на них файловые системы; таким образом, механизм chroot сам по себе не предназначен для использования с целью блокировки низкоуровневого доступа к системным устройствам привилегированными пользователями. Он не предназначен для ограничения использования таких ресурсов, как ввод-вывод , пропускная способность, дисковое пространство или процессорное время. Большинство Unix-систем не полностью ориентированы на файловую систему и оставляют потенциально разрушительные функции, такие как сетевое взаимодействие и управление процессами, доступными через интерфейс системных вызовов для chroot-программы.
При запуске программы ожидают найти рабочее пространство , файлы конфигурации, узлы устройств и общие библиотеки в определенных предустановленных местах. Для успешного запуска программы chroot каталог chroot должен быть заполнен минимальным набором этих файлов. Это может затруднить использование chroot в качестве общего механизма песочницы. Такие инструменты, как Jailkit, могут помочь облегчить и автоматизировать этот процесс.
Только пользователь root может выполнить chroot. Это сделано для того, чтобы пользователи не могли поместить программу setuid в специально созданную chroot-окружение (например, с поддельными файлами /etc/passwd и /etc/shadow ), что может привести к повышению привилегий .
Некоторые Unix-системы предлагают расширения механизма chroot для устранения хотя бы некоторых из этих ограничений (см. Реализации технологии виртуализации на уровне операционной системы ).
Графические приложения можно запускать в изолированной среде, используя такие методы, как: [13] [14]
Агент передачи почты Postfix работает как конвейер индивидуально настроенных вспомогательных программ.
Как и 4.2BSD до этого, внутренние фермы сборки пакетов Debian и Ubuntu широко используют chroot для обнаружения непреднамеренных зависимостей сборки между пакетами. SUSE использует аналогичный метод со своей программой сборки . Fedora, Red Hat и различные другие дистрибутивы на основе RPM собирают все RPM с помощью инструмента chroot, такого как mock.
Многие FTP-серверы для систем POSIX используют механизм chroot для изоляции недоверенных FTP-клиентов. Это можно сделать, разветвив процесс для обработки входящего соединения, а затем chroot-процесс ребенка (чтобы избежать необходимости заполнять chroot библиотеками, необходимыми для запуска программы).
Если включено разделение привилегий, демон OpenSSH будет chrootировать непривилегированный вспомогательный процесс в пустой каталог для обработки сетевого трафика до аутентификации для каждого клиента. Демон также может изолировать сеансы SFTP и shell в chroot (начиная с версии 4.9p1). [16]
ChromeOS может использовать chroot для запуска экземпляра Linux с помощью Crouton , [17] предоставляя в противном случае тонкую ОС с доступом к аппаратным ресурсам. Последствия безопасности, описанные в этой статье, применимы и здесь.
Чтобы иметь функциональную среду chroot в Linux, виртуальные файловые системы ядра и файлы конфигурации также должны быть смонтированы/скопированы с хоста в chroot.
# Монтировать виртуальные файловые системы ядра TARGETDIR = "/mnt/chroot"
mount -t proc proc $TARGETDIR /proc mount -t sysfs sysfs $TARGETDIR /sys mount -t devtmpfs devtmpfs $TARGETDIR /dev mount -t tmpfs tmpfs $TARGETDIR /dev/shm mount -t devpts devpts $TARGETDIR /dev/pts # Копировать /etc/hosts
/bin/cp -f /etc/hosts $TARGETDIR /etc/ # Копировать /etc/resolv.conf
/bin/cp -f /etc/resolv.conf $TARGETDIR /etc/resolv.conf # Ссылка /etc/mtab
chroot $TARGETDIR rm /etc/mtab 2 > /dev/null
chroot $TARGETDIR ln -s /proc/mounts /etc/mtab