Настройка jail во FreeBSD

Клетки буду создавать в в /usr/jails/

mkdir -p /usr/jails/jail_1
mkdir -p /usr/jails/jail_2
mkdir -p /usr/jails/jail_3

Проверяю, что исходный код актуальный

svnlite info /usr/src
Path: /usr/src
Working Copy Root Path: /usr/src
URL: https://svn.freebsd.org/base/releng/12.0
Relative URL: ^/releng/12.0
Repository Root: https://svn.freebsd.org/base
Repository UUID: ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
Revision: 354569
Node Kind: directory
Schedule: normal
Last Changed Author: gordon
Last Changed Rev: 353915
Last Changed Date: 2019-10-23 06:25:32 +0300 (ср, 23 окт. 2019)

Если всё в порядке, обновляю исходники и перехожу в каталог с исходниками

svnlite update /usr/src
cd /usr/src

если исходников системы нет ( каталог /usr/src пустой) или при проверке получаю ошибку

svnlite info /usr/src
svn: E155007: '/usr/src' is not a working copy

устанавливаю исходники. Для этого определяю какая версия FreeBSD используется

uname -r
12.0-RELEASE-p10

Удаляю из каталога /usr/src/ старые файлы

rm -rf /usr/src/*

Получаю источники

svnlite checkout https://svn.freebsd.org/base/releng/12.0 /usr/src

Создаю клетку

cd /usr/src
make world DESTDIR=/usr/jails/jail_1
??? проверить эту командуcd /usr/src/etc
make distribution DESTDIR=/usr/jails/jail_1
mount -t devfs devfs /usr/jails/jail_1/dev

Настройка /etc/rc.conf корневого сервера.

syslogd_flags="-ss" # отключение прослушивания демоном syslogd сетевого интерфейса
inetd_flags="-wW -a 10.215.130.183"
ifconfig_alc0_alias0="10.215.130.20/24" # алиас на устройство lo0 для jail_1
ifconfig_alc0_alias1="10.215.130.21/24" # алиас на устройство lo0 для jail_2

jail_enable="YES" # запуск клеток разрешен
jail_list="jail_1 jail_2" # список клеток запускаемых автоматически

Настройка клеток. Создаю файл конфигурации клеток:

ee /etc/jail.conf
cat /etc/jail.conf
exec.start = "/bin/sh /etc/rc"; # Команда запуска
exec.stop = "/bin/sh /etc/rc.shutdown"; # Команда остановки
exec.clean;

allow.raw_sockets = 1;
allow.set_hostname = 0;
allow.sysvipc = 1;

#       allow.mount = TRUE;
#       allow.mount.nullfs = TRUE;
#       allow.mount.tmpfs = TRUE;

mount.devfs; #разрешить монтировать devfs к файловой системе клеток
<del>  mount += "dev /usr/jails/jail_1/dev devfs rw,ruleset=$devfs_ruleset";</del>
mount.procfs;

jail_1 {
        host.hostname = "jail_1"; #имя клетки
        path = "/usr/jails/jail_1"; #путь до клетки
        interface = "alc0"; #интерфейс клетки
        ip4.addr = 10.215.130.25/32; #IP адрес клеки
        devfs_ruleset = 6; #какое правило нужно применить при монтирование devfs
}

jail_2 {
        host.hostname = "jail_2";
        path = "/usr/jails/jail_2";
        interface = "alc0";
        ip4.addr = 10.215.130.21/32;
}

Добавляю алиас

ifconfig bge0 alias 10.215.130.25 netmask 255.255.255.255

Для запуска всех jail'ов вручную:

service jail start

или

/etc/rc.d/jail start

Для запуска конкретного jail'а (например jail_1):

service jail start jail_1

Посмотреть список запущеных jail'ов:

jls
   JID  IP Address      Hostname                      Path
     1  10.215.130.21   jail_2                        /usr/jails/jail_2

Остановить jail:

service jail stop jail_1

Перезагрузить выбранный jail:

service jail restart jail_1

В вновь созданный Jail по ssh подключиться пока нету возможности, так-как ssh отключен. Для подключения к jail выполняю:

jexec jail_1

Подключиться к консоли jail'а (нужно указать номер выбранного jail'а из списка jls):

jexec 1

или, подключиться под конкретным пользователем jail'а:

jexec 1 -u jailuser

1. Добавляю DNS сервера:

ee /etc/resolv.conf
nameserver 10.215.130.1

cat /etc/resolv.conf
nameserver 10.215.130.1

2. Добавляю пользователя и включаю в группу wheel

adduser

3. Запускаю sshd

sysrc sshd_enable="YES"
service sshd start

4. Устанавливаю пароль руту

passwd root

5. Отключаю настройку сетевых интерфейсов (они виртуальные)

sysrc network_interfaces=""

6. Настраиваю временную зону

tzsetup

7. Создаю пустой файл fstab, чтобы скрипты инициализации не сообщали о его отсутствии

touch /etc/fstab

8. В rc.conf добавляю строки

sysrc sendmail_enable="NO"
sysrc syslogd_flags="-ss"

Для удобства установки пакетов также можно примонтировать папку ports корневой системы во внутрь jail. Для этого на корневом сервере нужно выполнить следующую команду:

mkdir /usr/jails/jail_1/usr/ports
mount_nullfs /usr/ports /usr/jails/jail_1/usr/ports 

и добавляю в /etc/fstab корневой машины

/usr/ports   /usr/jails/jail_1/usr/ports nullfs rw 0 0

Для создания нескольких клеток делаю:

cd /usr/jails/jail_1
tar -zcvpf jail.tar *
cp jail.tar /usr/jails/jail_2
cp jail.tar /usr/jails/jail_3
cd /usr/jails/jail_2
tar -zxvpf jail.tar
cd /usr/jails/jail_3
tar -zxvpf jail.tar

Для удаления клетки, убираю со всех файлов «флаг» «неизменяемости»:

chflags -R noschg /jails
rm -rf /jails/

Для того что бы правила монтирования devfs применялись к клеткам в rc.conf должна быть строка

devfs_load_rulesets="YES"

Основные настройки devfs находятся в /etc/defaults/devfs.rules/, но все изменения нужно вносить в /etc/devfs.rules.
После внесения изменений в файл /etc/devfs.rules необходимо выполнить команду

service devfs restart

Пример записи

[devfsrules_jail_3=6]
add include 1
add include 2
add path 'cuau*' unhide

Данное правило даёт доступ с com портам из клетки.

Проверка какие правила devfs применяются для jail

sysctl security.jail.devfs_ruleset
sysctl security.jail.sysvipc_allowed
devfs -m /path/to/jail/dev rule showsets
devfs rule -s 4 show

Ссылки:
https://alexei.bakush.ru/nastroika-jail-vo-freebsd
http://linux-bsd-adm.blogspot.com/2014/10/jail-freebsd-10.html
http://linux-bsd-adm.blogspot.com/2014/10/freebsd.html
https://translate.google.ru/translate?hl=ru&sl=en&u=https://www.freebsd.org/doc/handbook/jails-build.html&prev=search
https://wiki.lissyara.su/wiki/FreeBSD_%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%9F%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F:_%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_15_Jails_(%D0%9A%D0%BB%D0%B5%D1%82%D0%BA%D0%B8)
http://www.ignix.ru/book/freebsd/setup/jail
http://www.linuxshop.ru/articles/a241-installing_and_configuring_virtual_servers_jail
https://ru.bmstu.wiki/FreeBSD_Jail
https://xakep.ru/2009/05/22/48311
https://www.lissyara.su/articles/freebsd/tuning/jail
https://habr.com/post/342312
https://www.opennet.ru/tips/1546_freebsd_chroot_jail.shtml
http://devpit.org/wiki/FreeBSD/Jails
http://qaru.site/questions/3213328/freebsd-jail-and-ssh-devtty-no-such-file-or-directory
https://www.freebsd.org/cgi/man.cgi?query=jail&sektion=8&manpath=freebsd-release-ports
https://www.freebsd.org/doc/handbook/makeworld.html#updating-src-obtaining-src
https://www.freebsd.org/doc/handbook/makeworld.html
https://www.cyberciti.biz/faq/how-to-configure-a-freebsd-jail-with-vnet-and-zfs
https://www.cyberciti.biz/faq/update-source-tree-at-usr-src-using-svn-on-freebsd
http://freebsdlog.blogspot.com/2012/06/jail.html
https://www.opennet.ru/openforum/vsluhforumID1/85891.html
https://books.google.ru/books?id=6LQYEAAAQBAJ&pg=PA83&lpg=PA83&dq=devfs+rule+-s+4+show&source=bl&ots=bgGIi0NU4I&sig=ACfU3U0PsJGzfERND0WhoqiUAPT9r002fw&hl=ru&sa=X&ved=2ahUKEwijnM_17ZD0AhWHAxAIHRDTAKQQ6AF6BAgVEAM#v=onepage&q=devfs%20rule%20-s%204%20show&f=false