Реализация тюрьмы

Реализация системного вызова jail проста. Выделяется и заполняется предоставленными аргументами структура данных prison}. Структура prison связывается со структурой процесса вызывающего процесса. Значение счетчика ссылок структуры prison устанавливается в единицу, и для установки корневого каталога тюрьмы осуществляется системный вызов chroot. После своего создания структура prison не может быть изменена.

Ловушки в коде, реализующем создание и разрушение процесса, поддерживают счетчик ссылок на структуру prison и освобождают ее при освобождении последней ссылки. Любые новые процессы, созданные процессом в тюрьме, унаследуют ссылку на структуру prison, что помещает новый процесс в ту же самую тюрьму.

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

Несколько изменений было добавлено в реализацию работы в сети.

  • Ограничение доступа через TCP и UDP лишь одним IP-адресом было сделано почти полностью в коде, который управляет управляющими блоками протоколов. Когда процесс, заключенный в тюрьму, привязывается к со кету, предоставленный процессом IP-адрес использоваться не будет; вместо этого используется предварительно сконфигурированный IP-адрес тюрьмы.
  • Для подключения к серверам на локальной машине процессами используется интерфейс обратной петли, имеющий IP-адрес 127.0.0.1. Когда к адресу 127.0.0.1 подключается процесс, работающий в тюрьме, ядро должно перехватить и перенаправить запрос соединения по IP-адресу, связанному с тюрьмой.
  • Интерфейсы, посредством которых можно запросить состояние соединения и сетевую конфигурацию, были изменены таким образом, чтобы предоставлять лишь сведения, имеющие отношение к сконфигурированному IP-адресу находящегося в тюрьме процесса.

Потребовалось изменить драйверы устройств для совместно используемых устройств, такие, как драйвер псевдотерминала, чтобы обеспечить невозможность доступа к определенному терминалу в одно и то же время более чем из одной тюрьмы.

Простейшим, но наиболее утомительным изменением была проверка всего ядра на предмет наличия мест, допускавших дополнительные привилегии суперпользователя. Лишь 35 из 300 проверенных в FreeBSD 5.2 были открыты для заключенных в тюрьму процессов, работающих с привилегиями суперпользователя. Поскольку по умолчанию находящиеся в тюрьме суперпользователи не получают привилегий, новый код или драйверы автоматически оказываются осведомленными о тюрьме: они будут отвергать привилегии суперпользователей, находящихся в тюрьме

 

 

Еще материалы

  • Процедуры вычисления приоритета потока -

    Вычисления приоритета, использованные в алгоритме кратковременного планирования, разбросаны в различных частях системы. Периодически запускаются две процедуры, schedcpuQ и roundrobinQ. SchedcpuQ пересчитывает приоритеты потоков раз в секунду, используя формулу 4.2, и обновляет значение kg_slptime для потоков, заблокированных вызовом sleepQ. Процедура roundrobinQ запускается 10 раз в секунду и заставляет систе­му перепланировать потоки в (непустой) очереди с самым высоким приоритетом в режиме карусели, что дает каждому потоку квант времени в 100 миллисекунд.

  • Учет использования ресурсов -

    Система поддерживает простую форму учета использования ресурсов. По завершении каждого процесса учетная запись, описывающая использованные этим процессом ре­сурсы, записывается в системный файл учета.

  • Идентификаторы и SETID -

    FreeBSD реализует возможность setgid путем установки в нулевом элементе мас­сива дополнительных групп процесса, который выполняет программу setgid, значения группы этого файла. После этого можно проверять права доступа, как если бы это был обычный процесс. Из-за дополнительной группы программа setgid может иметь воз­можность доступа к большему количеству файлов, чем процесс пользователя, запус­кающий программу без этой особой привилегии.

  • Идентификаторы (Часть 2) -

    Часто пользователю нужно предоставить дополнительные ограниченные привиле­гии. Например, пользователь, который хочет отправить сообщение, должен иметь воз­можность добавить сообщение в почтовый ящик другого пользователя. Разрешение записи в почтовый ящик назначения для всех пользователей дало бы возможность пользователю, не являющемуся владельцем ящика, изменять в нем сообщения (злона­меренно или неумышленно). Чтобы решить эту проблему, ядро допускает создание программ, которым предоставляются при их выполнении дополнительные привиле­гии.

  • Корректировка времени и интервальное время -

    Часто желательно на всех машинах сети поддерживать одно и то же время. Можно также поддерживать более точное время, чем возможно от базовых часов процессора. Например, без труда доступно оборудование, прослушивающее ряд радиостанций, рассылающих в Соединенных Штатах синхронизирующие сигналы UTC. Когда про­цессы на различных машинах приходят к соглашению относительно общего времени, им нужно изменить часы процессора своего хоста, чтобы согласовать их с сетевым значением времени.