Традиционно используемым методом ограничения доступа к процессу является использование системного вызова chroot(). Этот системный вызов меняет корневой каталог, относительно которого определяются все остальные пути в самом процессе и всех порожденных ими процессах. Для того, чтобы этот вызов был выполнен успешно, процесс должен иметь право на выполнение (поиск) каталога, о котором идет речь. Новая среда реально не вступит в силу, пока вы не выполните вызов chdir() в вашей новой среде. Следует также отметить, что процесс может с легкостью выйти из chroot-среды, если он имеет привилегии администратора. Это может быть достигнуто созданием файлов устройств для чтения памяти ядра, подключением отладчика к процессу вне узницы и многими другими способами.
Поведение системного вызова chroot() можно некоторым образом контролировать sysctl-переменной kern.chroot_allow_open_directories. Когда эта переменная установлена в 0, chroot() не сработает с ошибкой EPERM, если есть какие-либо открытые каталоги. Если она установлена в значение по умолчанию, равное 1, то chroot() не сработает с ошибкой EPERM, если есть какие-либо открытые каталоги и процесс уже подвергнут вызову chroot(). Для всех других значений проверка открытости каталогов будет полностью опущена.
Концепция джейлов (Jail) расширяет возможности chroot(), ограничивая власть администратора созданием настоящих `виртуальных серверов'. Как только тюремная камера создана, все сетевые коммуникации должны осуществляться через выделенный адрес IP, а сила "привилегий пользователя root" в этой тюрьме довольно ограничена.
При работе внутри тюрьмы, любые проверки силы администратора в ядре при помощи вызова suser() будут оканчиваться неудачно. Однако некоторые вызовы к suser() были изменены на новый интерфейс suser_xxx(). Эта функция отвечает за распознание и разрешение доступа к власти администратора для процессов, не находящихся в неволе.
Процесс администратора внутри среды джейла имеет право:
Манипулировать привилегиями с помощью setuid, seteuid, setgid, setegid, setgroups, setreuid, setregid и setlogin
Устанавливать ограничения на использование ресурсов при помощи setrlimit
Модифицировать некоторые sysctl-переменные (kern.hostname)
chroot()
Устанавливать следующие флаги на vnode: chflags, fchflags
Устанавливать такие атрибуты vnode, как права доступа к файлу, изменять его владельца, группу, размер, время доступа и модификации.
Осуществлять привязку к привилегированному порту в области портов Интернет (порты с номерами < 1024)
Jail является очень полезным инструментом для запуска приложений в защищенном окружении, но есть и некоторые недостатки. На текущий момент к формату suser_xxx не преобразованы механизмы IPC, так что такие приложения, как MySQL, не могут работать в джейле. Права администратора могут имеет малую силу внутри джейла, но нет способа определить, что значит "малую".
Posix выпустил рабочий документ, который добавляет аудит событий, списки управления доступом, тонко настраиваемые привилегии, метки информации и жесткое управление доступом.
Этот документ находится в работе и находится в центре внимания проекта TrustedBSD. Некоторая начальная функциональность уже была добавлена во FreeBSD-current (cap_set_proc(3)).