Введение
Моё первое знакомство с контейнерной виртуализацией было с jail в FreeBSD, данный подход позволяет изолировать различные службы в безопасном окружении. Недостаток jail в том, что в нём нет возможности создать собственную сетевую подсистему, в отличии от Zones Solaris. В данной публикации будет рассмотрено создание зоны с собственной сетевой подсистемой, а также без неё.
Firewall
В качестве «фаервола» будет использоваться packet filter из OpenBSD. С помощью packet filter будет осуществляться nat из зоны с собственной сетевой подсистемы, а также ограничения сети глобальной зоны. Для установки packet filter и запуска, выполните команды:
pkg install firewall
svcadm enable firewall
Далее откройте файл с будущими правилами:
nano /etc/firewall/pf.conf
в редактор nano добавьте следующие строки:
table <good> {192.168.1.105,192.168.1.106}
table <nat> {192.168.0.0/24}
pass quick on lo0 from any to any no state
pass quick on vnic0 from any to any
pass out quick on net0 from <nat> to any nat-to (net0)
pass in quick on net0 proto tcp from any to 192.168.1.105 port 80 rdr-to 192.168.0.2
pass in quick on net0 proto tcp from any to <good> port=22 flags S/SA modulate state
pass out quick on net0 proto tcp from <good> to any port {80,443,21,53} flags S/SA modulate state
pass out quick on net0 proto udp from <good> to any port=53 keep state
pass out quick on net0 proto icmp from <good> to any
block from any to any fragment
block from any to any
block all
Укажите какой файл необходимо использовать в packet filter:
pfctl -f /etc/firewall/pf.conf
В данном файле правил присутствую две таблицы с списком ip адресов:
table <good> {192.168.1.105,192.168.1.106}
table <nat> {192.168.0.0/24}
В таблице good перечислены ip адреса глобальной зоны и зоны которая не имеет собственной сетевой подсистемы, если планируете использовать несколько таких зон, то через запятую укажите список ip адресов. Данным ip адресам будет разрешён исходящий трафик, а также будет возможность производить подключение через ssh. Если планируете организовать, например, вэб сервер в глобальной зоне, или в зоне без сетевой подсистемы, в этом случае необходимо добавить следующею строку:
pass in quick on net0 proto tcp from any to 192.168.1.106 port=80 flags S/SA modulate state
Или группу портов:
pass in quick on net0 proto tcp from any to 192.168.1.106 port {80, 443, 21,22} flags S/SA modulate state
В таком случаи производить подключение возможно через http,https, ftp, ssh.
В таблице nat указана подсеть зоны с собственной сетевой подсистемой, если планируете несколько таких сетей, то укажите их через запятую. В приведённой ниже строке производиться «натирование» через net0 всех подсетей из таблицы nat.
pass out quick on net0 from <nat> to any nat-to (net0)
Зону с собственной сетевой подсистемой можно использовать как DMZ, но для этого необходимо пробросить необходимые порты, следующая строка пробрасывает в зону 80 порт вэб сервера, тоесть все обращения на ip 192.168.1.105(глобальной зоны) будут перенаправлены на ip 192.168.0.2:
pass in quick on net0 proto tcp from any to 192.168.1.105 port 80 rdr-to 192.168.0.2
Также необходимо обратить внимание на строку:
pass quick on vnic0 from any to any
Данная строка разрешает любой трафик на виртуальном интерфейсе vnic0, данный интерфейс будет выступать в качестве шлюза. ip адрес данного интерфейса 192.168.0.1, этот интерфейс будет активен в глобальной зоне, поэтому его нужно указать в файле правил. Если планируется несколько шлюзов для разных подсетей, то в этом случаи необходимо добавить аналогичную строку с именем виртуально интерфейса. Например если планируете ещё одну подсеть 192.168.2.0/24 и присвоили адаптеру vnic5 ip(как это сделать будет написано в следующей главе) адрес 192.168.2.1, то строка будет выглядеть так:
pass quick on vnic5 from any to any
Виртуальные интерфейсы которые создаются для не глобальной зоны указывать не нужно.
Создание зоны
Данную главу можно начать с создания виртуальных интерфейсов, а также необходимо позволить ходить пакетам между интерфейсами net0 и vnic0:
dladm create-vnic -l net0 vnic0
dladm create-vnic -l net0 vnic1
ipadm set-ifprop -p forwarding=on -m ipv4 net0
ipadm set-ifprop -p forwarding=on -m ipv4 vnic0
После создания необходимо для vnic0 создать ip адрес:
ipadm create-ip vnic0
ipadm create-addr -T static -a 192.168.0.1/24 vnic0/v4
На этом с виртуальными интерфейсами закончено, если у Вас конечно нет необходимости создать ещё несколько подсетей.
Следующим шагом будет создание zfs пула для хранения зон, пул создадим из файла образа:
mkfile 10g /disk
Данная команда создаст файл размером 10 гигабайт(размер укажите который необходим Вам), создадим пул командой:
zpool create zones /disk
Создадим два раздела под будущие зоны и назначим каждому квоту в 5 гигабайт:
zfs create zones/zone1
zfs create zones/zone2
zfs set quota=5g zones/zone1
zfs set quota=5g zones/zone2
На момент написания данной публикации версия Solaris 11.4 являлась бета версией, в данной версии добавлена возможность ограничить(не применимо к версии 11.3) чтение и запись на раздел zfs:
zfs set writelimit=50mb zones/zone1
zfs set readlimit=50mb zones/zone2
Перейдём непосредственно к созданию зоны, первоначально создадим зону без собственной сетевой подсистемы, введите команду:
zonecfg -z zone1
После создайте основные параметры командой create, следующим шагом будет удаление параметра anet(содержит название сети, mac адрес, mtu и так далее):
remove anet
Далее укажем путь для будущей зоны, установим автозапуск зоны и тип ip адреса:
set zonepath=/zones/zone1
set autoboot=true
set ip-type=shared
Далее необходимо создать сеть для зоны:
add net
Следующим шагом необходимо указать физический интерфейс и ip адрес для зоны, и выйти из настроек сети(end):
set physical=net0
set address=192.168.1.106/24
end
Сохраните изменения и выйдете из zonecfg командами:
commit
exit
Установка зоны происходит после выполнения команды:
zoneadm -z zone1 install
Если скорость доступа в сеть интернет достаточно большая, то весь процесс займёт не более 5-ти минут. После того как зона будет установлена, необходимо её запустить и произвести первичную настройку(hostname, dns, domen search, пароль для root, создать учётную запись), настройка происходит таким же образом как и при установке системы. Выполните последовательно команды(для запуска зоны и первичной настройки):
zoneadm -z zone1 boot
zlogin -C zone1
Дождитесь пока появиться «мастер настройки». В будущем возможно производить подключение к зоне командой:
zlogin zone1
На этом настройка и установка зоны закончена. Настройка зоны с собственной сетевой подсистемой мало чем отличается от создания обычной зоны, необходимо лишь указать тип ip адреса, в качестве физического интерфейса указать виртуальный адаптер vnic1(для которого не создавался ip адрес), а также не создавать ip адрес для сети зоны, ip адрес будет создан при первом подключении к зоне(zlogin -C zone2). Для того что-бы всё корректно заработало, согласно данной публикации, необходимо указать ip адрес 192.168.0.2.
zonecfg -z zone2
create
remove anet
set zonepath=/zones/zone2
set autoboot=true
set ip-type=exclusive
add net
set physical=vnic1
end
commit
exit
zoneadm -z zone2 install
zoneadm -z zone2 boot
zlogin -C zone2
После того как первичная настройка закончена, установите apache, nano и packet filter, а также запустите apache и packet filter
pkg install apache-24
pkg install firewall
pkg install nano
svcadm enable apache24
svcadm enable firewall
Отредактируйте pf.conf:
nano /etc/firewall/pf.conf
В nano добавьте строки:
ip=192.168.0.2
pass in quick on vnic1 proto tcp from any to $ip port 80 flags S/SA modulate state
pass out quick on vnic1 proto tcp from $ip to any port {80,443,21,53} flags S/SA modulate state
pass out quick on vnic1 proto udp from $ip to any port=53 keep state
pass out quick on vnic1 proto icmp from $ip to any
block from any to any fragment
block from any to any
block all
Укажите какой файл необходимо использовать в packet filter:
pfctl -f /etc/firewall/pf.conf
В данном примере используется переменная $ip, если Вы указали другой ip адрес, то достаточно изменить первую строчку на корректный адрес.
Дополнительно
В заключительной главе речь пойдёт о ограничениях зоны, монтирование папок, а также расширенных полномочиях зоны. Предположим Вам необходимо смонтировать некий каталог из глобальной зоны, для этого выберете необходимую зону:
zonecfg -z zone1
Далее добавьте файловую системы:
add fs
Укажите каталог в глобальной зоне(например каталог /test):
set special=/test
Укажите куда необходимо его смонтировать:
set dir=/usr/test
Тип файловой системы укажем loopback:
set type=lofs
Выставим права на каталог только для чтения(если необходимо и для записи укажите rw, или вообще не добавляйте данный параметр):
add options [ro,nodevices]
Выйдете из настроек файловой системы и сохраните изменения:
end
commit
exit
Также можно смонтировать раздел zfs:
add dataset
set name=rpool/export/home
end
commit
Перезапустите зону:
zoneadm -z zone1 reboot
Теперь давайте ограничим оперативную память, swap и использование процессора, выберете необходимую зону:
zonecfg -z zone1
Добавьте ограничения для памяти:
add capped-memory
Ограничим оперативную память в 1 гигабайт, а swap в 500 мегабайт:
set physical=1024m
set swap=500m
end
commit
Ограничим использования каждого ядра процессора на 30 процентов:
add capped-cpu
set ncpus=.30
end
commit
Последний штрих, добавим зоне привилегии по умолчанию, список всех привилегий можно посмотреть выполнив команду:
ppriv -l -v
Ознакомиться с привилегиями которые используются по умолчанию(а также которые можно добавить при необходимости) можно в этом руководстве. Добавить привилегии можно следующей командой(из zonecfg):
set limitpriv="default,sys_time"
Как указано в данном руководстве, данная строка установит привилегии по умолчанию, а также позволит изменять системное время из не глобальной зоны. На мой взгляд для зоны лучше не добавлять дополнительных привилегий, так как зона с маленьким количеством привилегий более ограниченна в функционале, а значит более защищена.
Заключение
Как видно из данной публикации зоны довольно просты в настройке, но в тоже время предоставляют высокий уровень защиты(особенно зоны с собственной сетевой подсистемой) в связке с packet filter настроенный на политику «запрещено всё, что не разрешено». Настройка и развёртывание занимает минимум усилий в времени.
Список источников, которые помогли мне написать данную публикацию.
Zones
Packet Filter