Поиск по сайту:

Что такое chroot в Linux и как его использовать?


Утилита chroot Linux может изменять рабочий корневой каталог процесса, ограничивая доступ к остальной части файловой системы. Обычно это делается для обеспечения безопасности, контейнеризации или тестирования и часто называется «тюрьмой chroot».

Что делает chroot?

Chroot делает одно — запускает команду с другим корневым каталогом. Запускаемая команда понятия не имеет о существовании чего-либо за пределами ее тюрьмы, поскольку у нее нет никаких ссылок на нее, и, насколько ей известно, она все равно работает в корневой файловой системе. Нет ничего выше корня, поэтому команда не может получить доступ ни к чему другому.

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

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

Главное, для чего используется chroot, — блокировка системных демонов, чтобы любые уязвимости безопасности в этих демонах не влияли на остальную часть системы. Например, почтовый агент Postfix можно настроить для работы в окружении с ограниченным доступом к каталогам, которые он использует для связи с системой. Таким образом, если в Postfix обнаружена ошибка, она затрагивает Postfix, а не что-то еще.

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

Это также полезно в качестве «контейнера бюджета», чтобы создать подмножество вашей операционной системы и запускать приложения в изолированной среде, будь то для тестирования, безопасности или простоты разработки. Но поскольку chroot требует от вас вручную скопировать зависимости приложения в джейл, он не подходит для всего. Процесс, которому требуется доступ и взаимодействие с ресурсами пользовательского уровня, не будет хорошо работать внутри chroot-тюрьмы или потребует дополнительной настройки, которая может сделать всю установку более небезопасной. Но даже такие сложные приложения, как Apache и MySQL, можно запускать в chroot-окружении с учетом всех зависимостей.

Хотя тюрьма chroot – это дополнительный уровень безопасности, chroot не должен быть вашим единственным инструментом безопасности. Выход из тюрьмы может быть относительно тривиальным, если он не настроен должным образом, а chroot-тюрьма только изменяет место монтирования и не влияет на другие пространства имен. Если вы хотите повысить безопасность, используйте пространства имен или механизм контейнеризации, такой как Docker.

Отправка процессов в тюрьму

Чтобы открыть оболочку внутри каталога с тюрьмой, вы можете запустить:

sudo chroot /jail

Однако эта команда не будет выполнена с вновь созданным каталогом /jail, поскольку chroot попытается загрузить bash из /jail/bin/bash. Этот файл не существует, и это первая проблема с chroot — вам нужно собрать джейл самостоятельно.

В некоторых случаях достаточно скопировать их с помощью cp:

cp -a /bin/bash /jail/bin/bash

Но это копирует только исполняемый файл bash, а не все его зависимости, которых еще нет в нашей тюрьме. Вы можете вывести список зависимостей для bash с помощью команды ldd :

ldd $(which bash)
	linux-vdso.so.1 (0x00007ffd079a1000)
	libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f339096f000)
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f339076b000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f339037a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f3390eb3000)

Вы можете скопировать их вручную:

cp /lib/x86_64-linux-gnu/libtinfo.so.5 /jail/lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libdl.so.2 /jail/lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 /jail/lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 /jail/lib64/

Но это становится серьезной проблемой для каждой команды, которую вы хотите запустить под chroot. Если вы не заботитесь о том, чтобы ваш chroot получал доступ к вашим фактическим каталогам lib и bin (без доступа к остальной части системы), вы можете использовать mount --bind , чтобы указать ссылку в вашей тюрьме:

mount --bind /bin /jail/bin
mount --bind /lib /jail/lib
mount --bind /lib64 /jail/lib64

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

Теперь, когда все скопировано, вы сможете снова запустить sudo chroot /jail , чтобы открыть bash. Кроме того, вы можете запустить любую другую команду, выполнив:

sudo chroot /jail command

Если вы запускаете процессы через chroot bash, вы можете выйти из оболочки с помощью exit или Control+D, что остановит запущенный процесс. Процессы, запущенные в тюрьме, работают в своей собственной среде и не имеют доступа к другим процессам в системе.

Может ли процесс избежать тюрьмы?

Не легко, если они не работают как root. Chroot не блокирует доступ к низкоуровневым системным ресурсам (для доступа к которым требуется root), и поэтому привилегированный процесс может легко избежать тюрьмы.

Непривилегированные процессы могут полностью выйти из строя с помощью метода chdir(\..\) и другого вызова chroot. Если вы действительно сосредоточены на безопасности, вам следует отказаться от доступа к системному вызову chroot(2) или использовать ответвление jchroot, которое автоматизирует эту дополнительную функцию безопасности.

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