Реализация системного вызова jail проста. Выделяется и заполняется предоставленными аргументами структура данных prison. Структура prison связывается со структурой процесса вызывающего процесса. Значение счетчика ссылок структуры prison устанавливается в единицу, и для установки корневого каталога тюрьмы осуществляется системный вызов chroot. После своего создания структура prison не может быть изменена.
Ловушки в коде, реализующем создание и разрушение процесса, поддерживают счетчик ссылок на структуру prison и освобождают ее при освобождении последней ссылки. Любые новые процессы, созданные процессом в тюрьме, унаследуют ссылку на структуру prison, что помещает новый процесс в ту же самую тюрьму.
Потребовались некоторые изменения для ограничения видимости и взаимодействия процессов. Интерфейсы ядра, сообщающие о работающих процессах, были изменены, чтобы сообщать лишь о процессах, находящихся в той же самой тюрьме, что и запрашивающий процесс. Определение того, может ли один процесс отправить сигнал другому, основывается на значениях UID и GID отправляющего и получающего процессов. При наличии тюрьмы ядро добавляет требование, чтобы получающий процесс находился в той же самой тюрьме, если отправляющий процесс заключен в тюрьму.
Несколько изменений было добавлено в реализацию работы в сети.
Ограничение доступа через TCP и UDP лишь одним IP-адресом было сделано почти полностью в коде, который управляет управляющими блоками протоколов (см. раздел 13.1). Когда процесс, заключенный в тюрьму, привязывается к сокету, предоставленный процессом IP-адрес использоваться не будет; вместо этого используется предварительно сконфигурированный IP-адрес тюрьмы.
Для подключения к серверам на локальной машине процессами используется интерфейс обратной петли, имеющий IP-адрес 127.0.0.1. Когда к адресу 127.0.0.1 подключается процесс, работающий в тюрьме, ядро должно перехватить и перенаправить запрос соединения по IP-адресу, связанному с тюрьмой.
Интерфейсы, посредством которых можно запросить состояние соединения и сетевую конфигурацию, были изменены таким образом, чтобы предоставлять лишь сведения, имеющие отношение к сконфигурированному IP-адресу находящегося в тюрьме процесса.
Потребовалось изменить драйверы устройств для совместно используемых устройств, такие, как драйвер псевдотерминала, чтобы обеспечить невозможность доступа к определенному терминалу в одно и то же время более чем из одной тюрьмы.
Простейшим, но наиболее утомительным изменением была проверка всего ядра на предмет наличия мест, допускавших дополнительные привилегии суперпользователя. Лишь 35 из 300 проверенных в FreeBSD 5.2 были открыты для заключенных в тюрьму процессов, работающих с привилегиями суперпользователя. Поскольку по умолчанию находящиеся в тюрьме суперпользователи не получают привилегий, новый код или драйверы автоматически оказываются осведомленными о тюрьме: они будут отвергать привилегии суперпользователей, находящихся в тюрьме.
- 26/10/2010 00:17 - Отладка процессов
- 17/10/2010 19:25 - Управление заданиями
- 17/10/2010 12:22 - Сеансы
- 14/10/2010 16:15 - Группы процессов и сеансы
- 12/10/2010 02:42 - Доставка сигнала
- 11/10/2010 07:30 - Отправка сигнала