jail freebsd что такое

Chapter 12. Подсистема Jail

Перевод на русский язык: Сергей Любка ( )

Jail становится новой моделью защиты. Администраторы запускают потенциально уязвимые сервисы, такие как Apache, BIBD и sendmail, внутри jail; и если атакующий даже и получит права root внутри Jail, то это не приведет к краху всей системы. Эта статья концентрируется на внутренней реализации Jail и Jail NG, а также предложит некоторые улучшения к теперешней реализации. Если Вас интересует административная сторона установки Jail, я рекомендую просмотреть мою статью в Sys Admin Magazine за май 2001, под заглавием «Securing FreeBSD using Jail«.

12.1. Архитектура

Jail состоит из двух частей: непривилегированной (user-space) программы, jail, и кода в ядре: системного вызова jail и соответствующих ограничений. Сначала я рассмотрю user-space утилиту jail, а затем то, как jail реализованa в ядре.

12.1.1. Утилита jail

Исходный код утилиты jail находится в каталоге /usr/src/usr.sbin/jail, в файле jail.c. Утилита принимает следующие аргументы командной строки: путь к jail, имя хоста, ip адрес, и команду.

12.1.1.1. Структуры данных

В файле jail.c первой вещью, которую я хотел бы отметить, это декларация важной структуры, struct jail j, которая включена из файла /usr/include/sys/jail.h.

Вот определение это структуры:

Как можно заметить, в ней есть поле для каждого из аргументов, передаваемого утилите jail, и они выставляются при запуске jail.

12.1.1.2. Сеть

Одним из аргументов, передаваемых jail, есть ip адрес, по которому jail может быть доступен из сети. Jail переводит переданный ip адрес в big endian формат (network byte order), и сохраняет его в j (структуре jail).

Функция inet_aton (3) интерпретирует переданную ей строку как интернет адрес, и сохраняет его по переданному указателю на структуру in_addr. Функция ntohl() изменяет порядок следования байтов на сетевой (big endian), и получившееся значение сохраняется в поле ip адреса структуры jail.

12.1.1.3. Заключение (jailing) процесса

Наконец, утилита jail выполняет системный вызов jail, чем «заключает в тюрьму» сама себя, и порождает дочерний процесс, который затем выполняет команду, указанную в командной строке jail, используя вызов execv (3) :

Системному вызову jail, как видно из листинга, передается указатель на заполненную структуру jail. Теперь я собираюсь обсудить, как Jail реализован в ядре.

12.1.2. Код jail в ядре

Заглянем в файл /usr/src/sys/kern/kern_jail.c. Это файл, в котором определены системный вызов jail, соответствующие параметры ядра (sysctls), и сетевые функции.

12.1.2.1. Параметры ядра (sysctls)

В файле kern_jail.c определены следующие параметры ядра:

Каждый из этих параметров доступен пользователю через утилиту sysctl. В ядре эти параметры распознаются по уникальному имени; например, имя первого параметра будет jail.set.hostname.allowed.

12.1.2.2. Системный вызов jail(2)

Таким образом, uap->jail будет указывать на структуру jail, переданную системному вызову. Далее, структура jail копируется в адресное пространство ядра с помощью функции copyin(), которая принимает три аргумента: данные, которые необходимо скопировать ( uap->jail), где их сохранить ( j) и размер копируемых данных. Структура jail, переданная как параметр системному вызову, копируется в пространство ядра и сохраняется в другой структуре jail, j.

Далее, системный вызов jail() выделяет память для структуры prison и копирует данные:

Источник

FreeBSD Jail

Из Википедии — свободной энциклопедии

FreeBSD Jail (англ. jail — «тюрьма») — механизм виртуализации в системе FreeBSD, позволяющий создавать внутри одной операционной системы FreeBSD несколько независимо работающих FreeBSD на том же ядре операционной системы, но совершенно независимо настраиваемых с независимым набором установленных приложений.

В основу FreeBSD Jail вошёл системный вызов chroot(2), при котором для текущего процесса и всех его потомков, корневой каталог переносится в определённое место на файловой системе. При этом это место для процесса становится корневым каталогом. Таким образом, изолированный процесс может иметь доступ только к низлежащему дереву каталогов.

Однако FreeBSD Jail также имеет поддержку на уровне ядра, что позволяет ограничивать доступ к сети, общей памяти, переменным ядра sysctl и ограничивать видимость процессов вне jail.

Процесс, заключённый в Jail, может иметь доступ только к определённым IP-адресам операционной системы и использовать определённый hostname. Такой процесс называется «изолированный процесс» или «Jailed-процесс».

Таким образом, создаётся безопасная «клетка», внутри которой можно исполнять даже потенциально опасное программное обеспечение, которое не сможет никак повредить основной системе или другим таким же «клеткам». До версии 9.0-RELEASE, FreeBSD Jail не имела средств контроля по использованию ресурсов (как это делает, например, OpenVZ под Linux). С версии 9.0-RELEASE, подобные механизмы были введены через утилиту rctl(8) и фреймворк RACCT.

На уровне sysctl системы настраиваются привилегии Jailed-процессов:

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

FreeBSD Jail

FreeBSD Jail (англ. jail — тюрьма) — механизм виртуализации в системе FreeBSD, позволяющий создавать внутри одной операционной системы FreeBSD несколько независимо работающих систем, называемых тюрьмами.

Потребность в FreeBSD Jail появилась в небольшой компании хостинг-провайдера R&D Associates для создания четкой границы между сервисными службами и приложениями своих клиентов, важными характеристиками также были безопасность и простота в управлении. Вместо добавления нового слоя конфигураций, решение Пола-Хеннинга Кампа состояло в разделении файлов и ресурсов таким образом, что пользователи получали доступ только к тем отсекам, к которым они имеют доступ.

Содержание

Основные цели

FreeBSD Jail ставит перед собой задачу реализации трех парадигм:

В отличие от обычных тюрем-каталогов, которые ограничивают процессы с точки зрения файловой системы, механизм FreeBSD Jail замыкает процесс внутри тюрьмы, не разрешая влиять на остальную систему. Этот механизм похож на принцип работы песочницы. Процессы связанны с определенными IP-адресами и не имеют доступ к переадресации и сокетам маршрутизации. Сырые сокеты также отключены по-умолчанию, но могут быть включены путем присваивания настройке security.jail.allow_raw_sockets значения sysctl.

Виртуализация

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

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

Но все же FreeBSD Jail не достигает полной виртуализации; механизм не позволяет виртуальной машине работать с версией ядра отличающейся от версии базовой системы. Все виртуальные сервера имеют одни и те же ядра, следовательно, одни и те же ошибки и дыры в безопасности. Отсутствует поддержка кластеризации и миграции процессов, поэтому ошибки в машине-хосте приведут к падению всех виртуальных серверов.

Безопасность

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

Ограничения FreeBSD Jail:

Постройка тюрьмы

Создание окружения

В каталоге /usr/src и нужно выполнить следующую последовательность команд:

Настройка корневой системы

Нужно привязать тюрьму к IP-интерфейсу, для получения трафика, и сделать так, чтобы сервисы корневой системы слушали порты только на своем IP и пропускали трафик, предназначенный заключенному сервису.

IP-псевдонимы для сетевых интерфейсов назначаются с помощью команды:

Чтобы команда исполнялась во время загрузки, добавляем ее в /etc/rc.conf :

Теперь о настройке сервисов корневой системы. Если тюрьма привязана ко второму внешнему IP-адресу, как иллюзия второго сервера в сети, нужно настроить все сервисы корневой системы на прослушивание только первого IP-адреса. Иначе могут случиться конфликты между приложениями, слушающими один порт (например, ssh внутри тюрьмы и в корневой системе). В большинстве случаев сделать это можно через редактирование конфигурационного файла или путем указания специальных флагов:

К несчастью, некоторые сервисы (rpcbind, nfsd, mountd) не позволяют указать прослушиваемый ими IP-адрес, поэтому лучше не запускать их в базовой системе и в тюрьме одновременно. С локальным IP-адресом этого делать не придется, так как заключенные сервисы извне доступны не будут, но нужно будет позаботиться о настройке брандмауэра (пример для ssh):

Настройка окружения

Нужно выполнить следующую последовательность действий:

В случае использования локального IP-адреса для тюрьмы, его сетевое имя может быть любым. Но если тюрьма привязан к внешнему IP, потребуется, выбрать настоящее доменное имя, прописанное в DNS-зонах.

Пример иллюстрирует запуск ssh-сервера внутри тюрьмы. Если нужного сервиса нет в базовом дистрибутиве, лучше всего указать путь установки через переменную PREFIX во время установки порта:

Для пользователей portinstall:

К сожалению, в некоторых случаях прямое указание пути установки не подходит. Тогда можно применить виртуальные файловые системы вроде unionfs и nullfs для монтирования каталога /usr/ports ко всем тюрьмам:

Запуск окружения

Все подготовительные работы выполнены, осталось только запустить готовый виртуальный сервер. Для этого необходимо добавить в /etc/rc.conf следующие строки:

Настраиваемые константы

При использовании FreeBSD Jail процессы замыкаются внутри тюрьмы и никак не могут контактировать с процессами из других клеток. В следствие, на процессы накладываются значительные ограничения, но на уровне sysctl системы настраиваются некоторые привилегии заключенных процессов:

Источник

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

Содержание:

Введение

Создание клетки

Необходимо провести несколько манипуляций:

1. Укажем переменную имени к окружению.
2. Создадим домашнюю директорию по переменной.
5. Заполним каталог поддерева необходимыми двоичными файлами, библиотеками, справочниками и так далее.
6. Установим все необходимые файлы из /usr/src/etc/ и /etc в каталог клетки $D/etc/.

Конфигурация rc.conf

Конфигурация сети

Необходимо создать сетевые алиасы для ваших клеток. Они нужны чтобы клетки могли корректно работать в сети. Алиасы создаются на материнской системе:

Запуск

Для запуска всех клеток используйте:

Для запуска необходимой клетки используйте ее имя:

Выведем список работающих клеток:

Зайдем в первую клетку:

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

Дополнительная настройка

Окружение

FSTAB

Создадим в клетке пустой файл /etc/fstab чтобы при ее запуске не появлялось сообщение об отсутствующем файле fstab.

PORT MAPPER

Выключите в клетке port mapper.

RESOLV

Настроим resolv.conf так, чтобы разрешение имен в клетке работало правильно. Создадим в клетке файл с нужным DNS сервером или скопируем с основной машины в клетку.

SENDMAIL

Запустим в клетке newaliases чтобы при запуске не появлялось сообщение от sendmail.

IFCONFIG

Отключим сетевой конфигурационный интерфейс чтобы при запуске не появлялось сообщение от ifconfig.

Пароли

Обязательно измените пароль root в клетке (сделайте отличным от основной машины).

Создадим нового пользователя. Для этого есть штатная утилита jexec с помощью нее мы добавим нового пользователя состоящего в группе wheel [цифра это JID клетки]:

Для работы с клеткой посредством SSH необходимо настроить демон sshd.
Для этого на основной машине в /etc/SSH /sshd_config укажем нужный для прослушивания IP.
Перезапустим демон и проверим его работу.
Добавим в конфигурационный файл rc.conf клетки.

TIMEZONE

Установите нужную временую зону в клетке.

Экспорт портов

Экспортируем существующие порты в клетку. Вы можете также скопировать их в нужную директорию или создать симлинк.

Ограничения

Вы можете настроить некоторые переменные sysctl в основной системе для настройки работы клеток.

Для некоторого ограничения ресурсов клетки используйте совместно с ограничениями в /etc/login.conf 😉

Автоматизируем птицеферму

Написать о самописном скрипте или о порте который может управлять клетками?

Заключение

Теперь вы можете создавать и работать с клетками. Есть конечно недостатки клеток такие как отсутствие ограничений на использование ресурсов процессора или памяти без серьезной распилки и применения специальных патчей и многое другое. Но зато все работает нативно и быстро в данном случае мы добились желаемого.

Источник

Национальная библиотека им. Н. Э. Баумана
Bauman National Library

Персональные инструменты

FreeBSD Jail

FreeBSD Jail (англ. jail — тюрьма) — механизм виртуализации в системе FreeBSD, позволяющий создавать внутри одной операционной системы FreeBSD несколько независимо работающих систем, называемых тюрьмами.

Потребность в FreeBSD Jail появилась в небольшой компании хостинг-провайдера R&D Associates для создания четкой границы между сервисными службами и приложениями своих клиентов, важными характеристиками также были безопасность и простота в управлении. Вместо добавления нового слоя конфигураций, решение Пола-Хеннинга Кампа состояло в разделении файлов и ресурсов таким образом, что пользователи получали доступ только к тем отсекам, к которым они имеют доступ.

Содержание

Основные цели

FreeBSD Jail ставит перед собой задачу реализации трех парадигм:

В отличие от обычных тюрем-каталогов, которые ограничивают процессы с точки зрения файловой системы, механизм FreeBSD Jail замыкает процесс внутри тюрьмы, не разрешая влиять на остальную систему. Этот механизм похож на принцип работы песочницы. Процессы связанны с определенными IP-адресами и не имеют доступ к переадресации и сокетам маршрутизации. Сырые сокеты также отключены по-умолчанию, но могут быть включены путем присваивания настройке security.jail.allow_raw_sockets значения sysctl.

Виртуализация

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

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

Но все же FreeBSD Jail не достигает полной виртуализации; механизм не позволяет виртуальной машине работать с версией ядра отличающейся от версии базовой системы. Все виртуальные сервера имеют одни и те же ядра, следовательно, одни и те же ошибки и дыры в безопасности. Отсутствует поддержка кластеризации и миграции процессов, поэтому ошибки в машине-хосте приведут к падению всех виртуальных серверов.

Безопасность

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

Ограничения FreeBSD Jail:

Постройка тюрьмы

Создание окружения

В каталоге /usr/src и нужно выполнить следующую последовательность команд:

Настройка корневой системы

Нужно привязать тюрьму к IP-интерфейсу, для получения трафика, и сделать так, чтобы сервисы корневой системы слушали порты только на своем IP и пропускали трафик, предназначенный заключенному сервису.

IP-псевдонимы для сетевых интерфейсов назначаются с помощью команды:

Чтобы команда исполнялась во время загрузки, добавляем ее в /etc/rc.conf :

Теперь о настройке сервисов корневой системы. Если тюрьма привязана ко второму внешнему IP-адресу, как иллюзия второго сервера в сети, нужно настроить все сервисы корневой системы на прослушивание только первого IP-адреса. Иначе могут случиться конфликты между приложениями, слушающими один порт (например, ssh внутри тюрьмы и в корневой системе). В большинстве случаев сделать это можно через редактирование конфигурационного файла или путем указания специальных флагов:

К несчастью, некоторые сервисы (rpcbind, nfsd, mountd) не позволяют указать прослушиваемый ими IP-адрес, поэтому лучше не запускать их в базовой системе и в тюрьме одновременно. С локальным IP-адресом этого делать не придется, так как заключенные сервисы извне доступны не будут, но нужно будет позаботиться о настройке брандмауэра (пример для ssh):

Настройка окружения

Нужно выполнить следующую последовательность действий:

В случае использования локального IP-адреса для тюрьмы, его сетевое имя может быть любым. Но если тюрьма привязан к внешнему IP, потребуется, выбрать настоящее доменное имя, прописанное в DNS-зонах.

Пример иллюстрирует запуск ssh-сервера внутри тюрьмы. Если нужного сервиса нет в базовом дистрибутиве, лучше всего указать путь установки через переменную PREFIX во время установки порта:

Для пользователей portinstall:

К сожалению, в некоторых случаях прямое указание пути установки не подходит. Тогда можно применить виртуальные файловые системы вроде unionfs и nullfs для монтирования каталога /usr/ports ко всем тюрьмам:

Запуск окружения

Все подготовительные работы выполнены, осталось только запустить готовый виртуальный сервер. Для этого необходимо добавить в /etc/rc.conf следующие строки:

Настраиваемые константы

При использовании FreeBSD Jail процессы замыкаются внутри тюрьмы и никак не могут контактировать с процессами из других клеток. В следствие, на процессы накладываются значительные ограничения, но на уровне sysctl системы настраиваются некоторые привилегии заключенных процессов:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *