FreeBSD virtual environment management and repository

2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !

Внимание! Данные страницы описывают CBSD версии 13.0.x. Если вы используете более раннюю версию, рекомендуется сначала обновиться.

Модификации, которые выполняют скрипты cbsd в FreeBSD

В связи с тем что курс, взятый CBSD ориентирован на связь большого количества функционала для предоставлении комплексного решения, система для своей работы делает или предлагает сделать ряд специфичных настроек. Для чего и где эти изменения нужны, описывает данная страница, что также важно для полной деинсталляции cbsd ;-)

Файл /etc/rc.conf

Следующие параметры в /etc/rc.conf затрагивает CBSD для корректной работы.

  • 1) rcshutdown_timeout

    Данный параметр регулирует время отработки последовательность завершения работы из rc.shutdown файлов — если по истечению этого времени останавливаемый процесс не передал управление, система убьет его. Для серверов, имеющих большое количество клеток, в которых в свою очередь, могут работать длительные по остановке и чувствительные к убийству сервисы (например базы данных), значение по-умолчанию (120) крайне мало. В связи с этим, CBSD изменяет его при первой инициализации.

    Если вы хотите оставить значение по-умолчанию и пресечь переназначение параметра при cbsd initenv, просто продублируйте значение параметра из /etc/defaults/rc.conf: CBSD не будет менять параметр, если в /etc/rc.conf он уже присутствует:

    					% grep rcshutdown_timeout /etc/defaults/rc.conf >> /etc/rc.conf
    				
  • 2) sshd_flags и порт SSHd в мастер-хосте по-умолчанию

    Также как в случае с rcshutdown_timeout в /etc/rc.conf, при отстутствии в /etc/rc.conf параметра sshd_flags, cbsd initenv предложит вам изменить порт (22) по-умолчанию для демона sshd на 22222 порт, выполнив это через установку записи:

    					sshd_flags="-oPort=22222"
    				

    Будьте крайне внимательны к этому изменению. Если вы хотите оставить стандартные флаги sshd демона, продублируйте запись для sshd_flags из файла /etc/defaults/rc.conf в /etc/rc.conf и cbsd не будет предлагать изменение.

Также, возможно вы захотите запретить ресолв хоста по имени DNS, что может существенно ускорять соединения между нодами, расширив запись в /etc/rc.conf до

			sshd_flags="-oUseDNS=no -oPort=22222"
		

Если вы хотите, чтобы sshd слушал как 22222 порт, так и стандартный 22, такая запись будет корректна:

			sshd_flags="-oPort=22 -oPort=22222 -oUseDNS=no"
		

Порт 22222 вместо стандартного 22 предлагается к изменению по некоторым следующим соображениям:

  • до этого порта доходит меньше сканеров sshd для bruteforce. Конечно же, этот аргумент несерьезен ;-) и если вы хотите защитится от перебора, присмотритесь к утилитам security/{bruteblock,denyhosts};
  • Идеология работы CBSD с нодами подразумевает связь серверов между собой через ssh и желательно, чтобы уникальный/выбранный порт sshd (в данном случае 22222), всегда идентифицировал sshd обслуживающим ноду.

На практике, разные порты sshd на мастер-ноде и клеток полезны тем, что если вы внезапно забыли на какой именно ноде работает ваша клетка jail1024.my.domain, вы всегда можете быть уверенными что соединяясь на хост jail1024.my.domain по 22222 порту вы непременно попадете на физическую ноду, обслуживающую эту клетку. Второй момент — это клетки с параметром oninterface=0 и имеющие одинаковый с основной системой IP.

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

Также учитывайте, что при параметре applytpl=1 и создании новой клетки, CBSD таким же способом конфигурирует порт клетки на порт 2222 (однако, sshd_enable по-умолчанию остается в NO). Данное изменение также продиктовано желанием идентифицировать jail уникальным номером порта. Что, в свою очередь, удобно использовать для систем управления конфигурациями, как например Ansible, внося имена клеток в отдельный домен (например jail1024.j.my.domain) и по маске из .j. в зоне система будет применять определенные фильтры и знать корректный порт для установления соединения. Подобный пример из CBSD и Ansible будет описан отдельной статьей.

Для того, чтобы не править скрипты на серверах, откуда происходит соединение с нодой или клетками, рекомендуется использовать возможности ~/.ssh/config , в котором можно указать порты для конкретного хоста или маске хостов, например:

			# this server on 22 default ssh port
			Host otherserver.my.domain
			Port 22
			User root
			
			# mask for jails which have records in blabla.j.my.domain zones:
			Host *.j.*
			Port 2222
			
			# Default records - all host on 22222 port
			Host *
			ControlMaster auto
			ControlPath ~/.ssh/sockets/%r@%h:%p
			Port 22222
			StrictHostKeyChecking no
			UserKnownHostsFile /dev/null
		
  • 3) devfs_load_rulesets
  • Данный параметр необходим для инициализации devfs rule. По-умолчанию, создаваемые jail будут использовать 4 ruleset (смотрите /etc/defaults/devfs.rules). Однако, по-умолчанию параметр devfs_load_rulesets в /etc/defaults/rc.conf установлен в NO, что в свою очередь откроет в клетках все устройства в каталоге /dev, что в общем случае — нежелательно. Поменять номер набора правил для конкретной клетки вы можете через команду cbsd jconfig
  • 4) cbsdd_enable, cbsdrsyncd_enable, cbsdrsyncd_flags, cbsd_workdir

Следующие записи необходимы для корректной работы CBSD, что предлагает сделать скрипт установки initenv:

			cbsdrsyncd_enable="YES"
			cbsdrsyncd_flags="--config=/usr/jails/etc/rsyncd.conf"
			cbsdd_enable="YES"
			cbsd_workdir="/usr/jails"
		

cbsddrsyncd представляет из себя скрипт, запускающий rsyncd с альтернативным конфигурационным файлом на порту 1873. В случае, если вы не планируете переносить клетки через cbsd jcoldmigrate, вы можете предпочесть его выключить через:

			cbsdrsyncd_enable="NO"
		

Файл /boot/loader.conf, модули ядра, net.inet.ip.fw.default_to_accept

В том случае, если вы используете cbsd natcfg, cbsd naton или отвечаете утвердительно на вопрос использования NAT во время cbsd initenv, система может оставлять (с согласия пользователя) в /boot/loader.conf следующие записи:

			pf_load=YES
			ipfw_load=YES
			ipfw_nat_load=YES
			libalias_load=YES
			net.inet.ip.fw.default_to_accept=1
		

в зависимости от того, какой NAT используется. Сами правила NAT прописываются в структуре каталогов CBSD.

Параметр

			net.inet.ip.fw.default_to_accept=1
		

роли в работе cbsd не играет, однако он включен по причинам того, что модуль IPFW по-умолчанию запрещает все, а на момент настройки CBSD часть пользователей могут не настроить ipfw правила (или настроят с ошибкой), что повлечет за собой потерю доступа к системе. Имейте ввиду, что данный параметр заставляет последнее правило 65535 выглядеть следующим образом:

			allow ip from any to any
		

Подробнее: FreeBSD handbook::Firewalls-ipfw

Кроме этого, при старте NAT (cbsd naton), выполняется вызов:

			% sysctl -qn net.inet.ip.forwarding=1
			% sysctl -qn net.inet6.ip6.forwarding=1
		

для корректного функционирования NAT, а при запуске vnet-клетки ( VIMAGE ), автоматически подгружается модуль if_bridge.

Обратите внимание, что CBSD не удаляет за собой записи в /boot/loader.conf при ее удалении, или к примеру, если вы переходите от одного NAT фреймворка к другому (к примеру сначала сконфигурировани PF, затем переключили на IPFW), то при выборе другого фреймворка, модули предыдущего удаляться не будут.

Файл /usr/local/etc/sudoers.d/cbsd_sudoers

Большая часть команд CBSD требует полномочий привилегированного пользователя, в связи с чем испольуется утилита sudo и конфигурационный файл /usr/local/etc/sudoers.d/cbsd_sudoers следующего содержания:

			Defaults     env_keep += "workdir DIALOG NOCOLOR"
			Cmnd_Alias   CBSD_CMD = /usr/jails/sudoexec/*,/usr/local/cbsd/sudoexec/*
			cbsd   ALL=(ALL) NOPASSWD: CBSD_CMD
		

Данные записи позволяют запускать скрипты с полномочиями пользователя root в следующих каталогах:

			/usr/jails/sudoexec/
			/usr/local/cbsd/sudoexec/
		

и без необходимости вводить пароль root

Номера правил ipfw для подсчета трафика jail

В данный момент, если на вопрос Enable IPFW был дан утвердительный ответ и IPFW в системе включен, ipfw будет использован для установки счетчиков трафика jail при из запуске и остановке. При этом, диапазон правил для установки счетчиков фиксирован в файле $workdir/cbsd.conf. По-умолчанию, это параметры:

			fwcount_st="99"
			fwcount_end="2000"
		

При этом последний номер (2000) будет использован для установки NAT правила, если в качестве NAT выбран IPFW. Соответственно, если вы планируете писать свои правила, вам необходимо исключить данный диапазон (или отрегулировать его в конфигурационном файле), чтобы остальные правила шли после счетчиков ( > fwcount_end ). В данный момент, ищется альтернативный путь для подсчета трафика jail.