chroot
chroot — операция изменения корневого каталога в Unix-подобных операционных системах. Программа, запущенная с изменённым корневым каталогом, будет иметь доступ только к файлам, содержащимся в данном каталоге. Поэтому, если нужно обеспечить программе доступ к другим каталогам или файловым системам (например, /proc), нужно заранее примонтировать в целевом каталоге необходимые каталоги или устройства.
Термин chroot может относиться или к концепции изменений корневого каталога, или к системному вызову chroot(2), или к программе chroot(8), что обычно понятно из контекста.
Изменение корневого каталога производится при помощи системного вызова chroot(2). Изменение корневого каталога затрагивает только текущий процесс (то есть процесс, сделавший системный вызов chroot(2)) и всех его потомков. Если требуется запустить некоторую программу с изменённым корневым каталогом, но в данной программе не предусмотрено выполнение вызова chroot(2), используют программу chroot(8). Эта программа принимает в качестве параметров новый корневой каталог и путь к программе. Она сначала сама выполняет вызов chroot(2) для изменения собственного корневого каталога на указанный, а затем запускает программу по заданному пути. Так как изменённый корневой каталог наследуется потомками процессов, программа запускается с изменённым корневым каталогом.
Программа, корень которой был перенесён в другой каталог, не может обращаться к файлам вне этого каталога. Это обеспечивает удобный способ помещения в «sandbox» («песочницу») тестовой, ненадёжной или любой другой потенциально опасной программы. Это также простой способ использования механизма «jail» («тюрьмы»). Однако документация предостерегает от такого использования[1]. Но наиболее часто chroot используется для сборки дистрибутивов или отдельных программ как бы в «чистой» среде. См. также bootstrapping.
На практике в chroot сложно поместить программы, ожидающие при запуске найти свободное место на диске, файлы конфигурации, файлы устройств и динамические библиотеки в конкретных местах. Для того чтобы позволить программам запуститься внутри chroot-каталога, необходимо обеспечить их минимальным набором таких файлов, желательно аккуратно выбранным так, чтобы не позволить неумышленный доступ к системе снаружи (например, через файлы устройств или FIFO).
Программам разрешается открывать файловые дескрипторы (для файлов, конвейеров и сетевых соединений) в chroot-е, который может упростить изготовление jail, делая необязательным хранение рабочих файлов внутри каталога chroot. Это также может использоваться как простейшая capability-система, в которой программе явно даётся доступ к ресурсам вне chroot, основываясь на дескрипторах, которые содержатся внутри.
Использование
- Разделение привилегий — chroot может использоваться как упреждающий способ защиты от бреши в безопасности, предотвращая возможного атакующего от нанесения любых повреждений или зондирования системы с помощью скомпрометированной программы. Например, сетевой файловый сервер может делать chroot в тот каталог, из которого он раздаёт файлы, сразу после соединения с клиентом. Подобный подход используется MTA Postfix, который разделяет свою работу на конвейер меньших, индивидуально заточённых в chroot программ.
- Изготовление honeypot-ов — chroot-каталог может быть наполнен таким образом, чтобы симулировать реальную систему с запущенными сетевыми сервисами. Механизм chroot в результате может предотвратить обнаружение атакующими системы с целью компрометации от того, что это является искусственным окружением, или от взлома реальной системы.
Недостатки
Только суперпользователь (root) может выполнять системный вызов chroot(2). Это необходимо для того, чтобы предотвратить атаку со стороны пользователя при помощи помещения setuid-ной программы внутрь специально изготовленной chroot jail (например, с ложным файлом /etc/passwd), приводящую к тому, что он получит повышение привилегий.
Сам по себе механизм chroot не полностью безопасен. Если программа, запущенная в chroot, имеет привилегии root, она может выполнить second chroot для того, чтобы выбраться наружу. Это работает, потому что некоторые ядра Unix не позволяют правильного вложения контекстов chroot.
Большинство систем Unix не полностью ориентированы на файловую систему и оставляют потенциально разрушительную функциональность, такую как сетевую и контроль процессов, доступной через интерфейс системных вызовов к программе в chroot.
Механизм chroot сам по себе не умеет осуществлять ограничения на ресурсы, такие как пропускная способность ввода-вывода, дисковое пространство или время ЦП.
Ссылки
chroot(2)
— страница справки man по системным вызовам FreeBSD (англ.)chroot(8)
— страница справки man системного администратора FreeBSD (англ.)- Jailkit: Набор утилит для построения chroot-окружений.
- Создание chroot окружения в Fedora с помощью yum
- Статья «Установка Chroot Jail для CVS»
- Русская статья Chroot для SSH
- Chroot Jail для SSH
- Взлом chroot
- Настройка OpenSSH chroot в FreeBSD