chroot
— это операция в Unix и Unix-подобных операционных системах , которая изменяет очевидный корневой каталог для текущего запущенного процесса и его дочерних элементов . Программа, запущенная в такой измененной среде, не может называть файлы (и, следовательно, обычно не имеет доступа) за пределами назначенного дерева каталогов. Термин «chroot» может относиться к системному вызову chroot(2) или программе-оболочке chroot(8) . Измененная среда называется chroot-тюрьмой .
Системный вызов chroot был введен во время разработки версии 7 Unix в 1979 году. Один источник предполагает, что Билл Джой добавил его 18 марта 1982 года — за 17 месяцев до выпуска 4.2BSD — чтобы протестировать систему установки и сборки. [1] Все версии BSD с ядром имеют chroot(2). [2] [3] Первое использование термина «тюрьма» применительно к chroot принадлежит Биллу Чесвику , создавшему приманку для наблюдения за хакером в 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 для выхода. Чтобы снизить риск этих недостатков безопасности, chrooted-программы должны отказаться от привилегий root как можно скорее после chrooting или вместо этого следует использовать другие механизмы, такие как тюрьмы FreeBSD . Обратите внимание, что некоторые системы, такие как FreeBSD , принимают меры предосторожности, чтобы предотвратить повторную атаку chroot. [12]
В системах, поддерживающих узлы устройств в обычных файловых системах, пользователь root с chroot все равно может создавать узлы устройств и монтировать на них файловые системы; таким образом, механизм chroot сам по себе не предназначен для блокировки низкоуровневого доступа к системным устройствам со стороны привилегированных пользователей. Он не предназначен для ограничения использования таких ресурсов, как ввод-вывод , пропускная способность, дисковое пространство или время процессора. Большинство Unix-систем не полностью ориентированы на файловую систему и оставляют потенциально разрушительные функции, такие как работа в сети и управление процессами, доступными через интерфейс системных вызовов для chrooted-программы.
При запуске программы ожидают найти рабочее пространство , файлы конфигурации, узлы устройств и общие библиотеки в определенных предустановленных местах. Для успешного запуска chroot-программы каталог chroot должен быть заполнен минимальным набором этих файлов. Это может затруднить использование chroot в качестве общего механизма песочницы. Такие инструменты, как Jailkit, могут помочь упростить и автоматизировать этот процесс.
Только пользователь root может выполнить chroot. Это сделано для того, чтобы пользователи не могли поместить программу setuid в специально созданную тюрьму chroot (например, с поддельными файлами /etc/passwd и /etc/shadow ), что могло бы обмануть ее и заставить повысить привилегии .
Некоторые Unix-системы предлагают расширения механизма chroot для устранения хотя бы некоторых из этих ограничений (см. Реализации технологии виртуализации на уровне операционной системы ).
Можно запускать графические приложения в chroot-окружении, используя такие методы, как: [13] [14]
Агент передачи почты Postfix работает как конвейер индивидуально внедренных вспомогательных программ.
Как и в предыдущей версии 4.2BSD, внутренние фермы сборки пакетов Debian и Ubuntu широко используют chroot для обнаружения непреднамеренных зависимостей сборки между пакетами. SUSE использует аналогичный метод в своей программе сборки . Fedora, Red Hat и различные другие дистрибутивы на основе RPM собирают все RPM с помощью инструмента chroot, такого как макет.
Многие FTP-серверы для систем POSIX используют механизм chroot для изоляции ненадежных FTP-клиентов. Это можно сделать, разветвив процесс для обработки входящего соединения, а затем переместив дочерний процесс в chroot (чтобы избежать необходимости заполнять chroot библиотеками, необходимыми для запуска программы).
Если разделение привилегий включено, демон OpenSSH выполнит chroot непривилегированного вспомогательного процесса в пустой каталог для обработки сетевого трафика предварительной аутентификации для каждого клиента. Демон также может изолировать сеансы SFTP и оболочки в 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