Клетки


Украшаем клетку: установка внутри клетки

К этому моменту все готово к первой загрузке клетки. Не нужно путать понятия: первая загрузка и готова к использованию, потому что до полной готовности нам еще нужно выполнить некоторые действия внутри клетки. Воспользуйтесь командой jail(8) для запуска клетки:

Например, наша первая клетка располагается в каталоге /var/jails/jail1. Ей должно быть присвоено имя хоста jail.absolutefreebsd.com и IP-адрес 192.168.1.4. Для этого следует ввести команду:

# jail /var/jails/jail1 jail.absolutefreebsd.com 192.168.1.4 /bin/sh

Самый ранний этап, где система может предоставить вам доступ к командной строке, — это однопользовательский режим. Это не совсем однопользовательский режим клетки, поскольку в ней пока нет других программ, кроме /bin/sh.

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

Создание /etc/fstab

Многие программы предполагают наличие в системе файла /etc/f’stab и не могут работать при его отсутствии. Этот файл имеет большое значение для настоящего сервера, но он бесполезен для системы в клетке. Однако, чтобы обеспечить работоспособность таких программ, лучше будет создать пустой файл.

# touch /etc/fstab

Настройка разрешения имен DNS

Вероятно, вам потребуется настроить DNS в файле /etc/resolv.conf. Для этого можно скопировать в клетку файл /etc/resolv.conf из хост-системы. Обратите внимание: вы должны скопировать файл из хост-системы, потому что клетка не имеет доступа к каталогу /etc хоста.

sendmail

Вам не нужно выполнять настройку Sendmail(8), по крайней мере, пока, но вы будете постоянно получать предупреждения о том, что устарела база данных псевдонимов. Чтобы такие предупреждения не появлялись, запустите команду newaliases(8).

/etc/rc.conf

Добавьте в файл /etc/rc.conf клетки следующие строки:

network_interfaces=""
sshd_enable="YES"

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

Доступ к клетке можно получить только по сети, поэтому вам потребуется активировать SSH.

Пароль root и учетная запись

В клетке пока еще отсутствует пароль root. Установите его командой passwd(1). Вам также потребуется создать учетную запись пользователя. Запустите команду adduser(8) и создайте хотя бы одну учетную запись.

Прочие настройки

При желании в клетке можно определить часовой пояс с помощью команды tzsetup(8), установить дополнительные пакеты, скопировать личные файлы в домашний каталог и прочее, но все эти действия не являются необходимыми на данном этапе. Покиньте командный интерпретатор, и клетка завершит работу.

Клетка и /etc/rc.conf

Теперь, когда клетка готова к эксплуатации, можно сообщить об этом системе. Самый простой способ управления клетками заключается в использовании параметров файла /etc/rc.conf. Ниже приводятся несколько примеров настройки системы для работы с клетками:

Эти два параметра управляют общими настройками клеток. Установив значение YES в параметре jail_enable (1), вы тем самым предписываете сценариям начальной загрузки системы отыскать и обработать дополнительные параметры настройки клеток. Параметр jail_list (2) содержит перечень всех клеток в системе, разделенных пробелами. Установив значения этих двух параметров, вы сможете использовать систему запуска FreeBSD для управления вашими клетками. Кроме того, каждая клетка имеет свой собственный набор параметров настройки, которые содержат информацию о том, где находится каждая клетка и как она должна настраиваться.

Эти записи описывают конфигурацию единственной клетки. Похожие записи следует добавить для каждой создаваемой вами клетки, замещая название jail1 в именах переменных. Для каждой клетки должны быть определены корневой каталог (1), имя хоста (2) и IP-адрес (3).

Многие программы выводят предупреждения или вообще отказываются работать, если не находят определенные файлы устройств в каталоге /dev. В клетках желательно создать некоторые файлы устройств, такие как терминалы или генератор случайных чисел. Другие файлы, как, например, файлы дисковых устройств или сетевых интерфейсов, создавать не нужно. Можно предоставить доступ к устройствам с помощью devfs (4), но тогда необходимо применить правила (5), которые обеспечивали бы доступ только к определенным устройствам. О devfs мы говорили в главе 8. Операционная система FreeBSD включает определенный набор правил для файловой системы devfs, заключенной в клетку, в виде параметра devfsrules_jail в файле /etc/defaults/devfs.rules.

В файле /etc/defaults/rc.conf можно отыскать и другие параметры, управляющие определенными аспектами клеток, но те, что были описаны выше, охватывают все самое необходимое.

Запуск и останов клетки

Выполнив вышеупомянутые настройки в файле rc.conf, можно будет использовать сценарий /etc/rc.d/jail для управления клетками, как всеми сразу, так и по отдельности. Для запуска всех клеток достаточно просто запустить команду:

# /etc/rc.d/jail start

Можно запустить и единственную клетку, указав ее имя в качестве аргумента:

# /etc/rc.d/jail start jail1

Запустив клетку, можно использовать SSH для входа в нее. После этого можно добавлять пакеты, настраивать локальную систему и вообще делать все, что угодно со своей «новой» машиной FreeBSD. Поиграйте немного, попробуйте, к примеру, сбежать из клетки. Попытайтесь выйти в известный вам каталог, находящийся за пределами клетки. Даже обладая привилегиями root в клетке, вы не сможете просмотреть или обратиться к процессам, работающим на ведущей системе. Даже с помощью таких мощных инструментов, как Perl и cc(1), позволяющих создавать любые инструменты, вы не сможете вырваться в ведущую систему. Вы можете даже использовать csup в клетке и полностью перекраивать ее мир, хотя это и не самая лучшая идея. Не забывайте, что функциональные возможности ядра должны соответствовать требованиям пользовательских программ, в противном случае, хоть это может и не вызвать крах ведущей системы, но несоответствие версий ядра и пользовательских программ станет причиной некорректного поведения последних.

Управление клетками

В клетках происходит сложное управление процессами. Если зарегистрироваться на сервере с клетками, можно увидеть все процессы во всех клетках. Какие из них принадлежат самому серверу, а какие — клеткам?

Команда ps -ax, выполненная в «основной» системе, покажет все работающие процессы, даже процессы клеток. Символ J в поле STAT означает, что процесс запущен в клетке. Если на сервере есть несколько клеток, то исходя из предназначения каждой из них, можно догадаться, к какой клетке относится тот или иной процесс. Например, если есть только один сервер имен, и он находится в клетке, можно смело держать пари на принадлежность процесса named(8). Однако в большинстве случаев все не так хорошо, как кажется. И здесь нам на помощь приходят два инструмента: jls(8) и jexec(8).

jls

Программа jls(8) выводит список всех клеток, запущенных в системе.

Каждая клетка имеет уникальный числовой идентификатор (Jail ID), или JID (1). Идентификатор JID очень похож на числовой идентификатор процесса, в том смысле, что каждая клетка имеет единственный идентификатор, но его точное значение может изменяться. Если остановить клетку и снова запустить ее, ей будет присвоено другое значение JID. Кроме того, утилита jls(8) выводит IP-адрес (2), имя хоста (3) и корневой каталог (4) клетки.

jexec

Утилита jexec(8) позволяет администратору ведущей системы исполнять команды внутри любой запущенной клетки без необходимости входить в нее. Это позволит сохранить у владельцев клеток чувство личного пространства — в конце концов, вам не нужно знать пароли root в клетках и даже не требуется входить в их системы. Но для использования jexec(8) вам необходимо знать значение JID клетки. Чтобы узнать, какие процессы работают внутри клетки, достаточно запустить в ней команду ps -ax. Например, предположим, что наша первая клетка, jail.absolutefreebsd.com, имеет ID со значением 1. Чтобы выполнить команду ps -ax внутри этой клетки, следует запустить такую команду:

# jexec 1 ps -ax

После этого вы увидите список процессов, запущенных в клетке, как если бы вы вошли в нее.

Утилита jexec(8) позволяет запускать любые команды в клиентской клетке из ведущей системы. Вы можете устанавливать программное обеспечение, перезапускать демоны, останавливать процессы или изменять пароли пользователей.

Процессы и procfs

Помните, как в главе 8 я говорил, что не стоит использовать файловую систему procfs? Сервер клеток — единственное исключение из этого правила. В истории безопасности файловой системы procfs имеется множество темных пятен, но на сервере клеток не должно быть никаких служб и посторонних пользователей. Единственное предназначение файловой системы процессов в данном случае — это идентификация клеток по идентификаторам процессов. Если, например, вы увидели, что некоторое приложение баз данных использует слишком большой объем памяти или процессорного времени, то с помощью файловой системы /proc вы можете быстро идентифицировать клетку по числовому идентификатору процесса (PID).

Для каждого запущенного процесса в файловой системе /proc имеется отдельный каталог. Чтобы узнать, в какой клетке исполняется процесс, нужно отыскать каталог процесса по его идентификатору и посмотреть содержимое файла с именем status. Последнее слово в данном файле — это имя хоста клетки, в которую заключен процесс. Если процесс не заключен в клетку, последним словом в файле будет символ дефиса.

Останов клетки

При останове основного хоста также будут остановлены различные клиентские клетки. Останов клетки без останова хоста ненамного сложнее. Чтобы остановить все клетки или какую-нибудь одну клетку, следует запустить команду /etc/rc.d/jail stop. Ниже приводится пример останова клетки jail1:

# /etc/rc.d/jail stop jail1

Эта команда запустит стандартную процедуру останова внутри клетки и выйдет. В результате клетка исчезнет из списка команды jls(8).

Программы shutdown(8) и reboot(8) бесполезны для останова клетки, поскольку их основная обязанность состоит в синхронизации и раз- монтировании дисков, отсоединении от сети и т. д. В виртуальной машине это не требуется.

Что может быть не так с клетками

Клетки обеспечивают высокую гибкость при невысоких требованиях к аппаратному обеспечению. На небольшом жестком диске емкостью 80 Гбайт легко можно организовать десяток клеток и даже более, используя приемы, описанные в этой книге. А если вы ознакомитесь с секретными техниками ниндзя клеток, вы сможете утроить это число. Почему бы тогда не заключить все службы в отдельные клетки, а ведущую систему не использовать в качестве сервера клеток?

Удобство обслуживания — вот главная причина.

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

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

Комментарии запрещены.