FreeBSD 13 Apache, MySQL, PHP7, Let’sEncrypt in CBSD ZFS jails (FAMP с SSL в клетках на ZFS). ч.1

Опубликовано В рубрике FreeBSD Отмечено , , , , , , , , , , 2 комментария к записи FreeBSD 13 Apache, MySQL, PHP7, Let’sEncrypt in CBSD ZFS jails (FAMP с SSL в клетках на ZFS). ч.1

Лирика к сказанию о хостинге тут:

На чём строим:
# uname -a
FreeBSD main.2net.local 13.0-RC5

В качестве враппера использую CBSD
# pkg info | grep cbsd
cbsd-13.0.3 Yet another FreeBSD Jail, XEN and Bhyve Management Utility

Про установку самого CBSD есть отличная статья на Хабре
Оговорим, что для самих клеток у меня, средствами хост системы, создан бридж с ip адресом из пула для клеток, с него же я эти клетки выпускаю в инет, если надо, и через него клетки могут «общаться» друг с другом по ip.
Like that (c):
cloned_interfaces="bridge0"
ifconfig_bridge0_name="jails_if"
ifconfig_jails_if="inet 172.16.0.100/24 up"

Таким образом, при создании клетки можно оставить interface: auto и ipv4_addr: DHCP, а cbsd сам назначит клетке свободный ip адрес и привяжет его к бриджу, фактически сделает: «ifconfig bridge0 ip_клетки alias» или в случае с vnet клеткой: «addm epair0»

Для корректной работы задуманного понадобится раскрыть некоторые устройства в клетки, а именно Berkeley Packet Filter. Добавим в конец /etc/devfs.conf:
[devfsrules_jail=5]
add include $devfsrules_hide_all
add include $devfsrules_unhide_basic
add include $devfsrules_unhide_login
add path 'bpf*' unhide

Этот набор правил, под номером 5 можно будет указать при создании vnet клеток, что бы внутри заработали всякие ping, traceroute, etc.
Таким же образом можно раскрывать и другие устройства, добавив например:
add path 'tap' unhide
add path zfs unhide

По задумке, mysql server сидит в собственном jail и торчит в другие клетки только сокетом через nullfs, с этого и начнём, создадим клетку через:
# cbsd jconstruct-tui
Руководство CBSD говорит, что надо «перебивать» пароль от root, т.к. по умолчанию он берёт хеш пароля root-a из хост системы, надо, так надо.

CBSD Позволяет монтировать файловые системы прямо в клетки при помощи nullfs, для каждой клетки создаётся файл в /usr/jails/jails-fstab/имя_клетки/fstab.local
В profile: default, при создании, nullfs в клетках включен, если нет, можно включить его через cbsd jconfig jname=имя_клетки в jail options -> nullfs
Под файлы БД у меня отдельный пул с томами, на отдельном ssd:
# zfs list | grep data
data
data/jailed_mysql
data/www

Чтобы смонтировать его в клетку с mysql server, надо поправить файл:
# cat /usr/jails/jails-fstab/mysql/fstab.local
/mnt/data/jailed_mysql /var/db/jailed_mysql nullfs rw 0 0

Запустим клетку, залогинимся и произнесём главную мантру всех бздэшников:
# cbsd jstart mysql
# cbsd jlogin mysql

# cd /usr/ports/databases/mysql56-server/ && make install clean
Наведём порядок:
# mv /usr/local/my.cnf /usr/local/etc/mysql/
Чтобы не раскрывать весь /tmp клетки поменяем расположение сокета, также для выноса баз на отдельный ssd, поменяем расположение файлов БД.
В /etc/rc.conf:
sshd_enable="NO"
sshd_flags="-oUseDNS=no"
syslogd_flags="-ss -c"
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
hostname="mysql.2net.local"
mysql_enable="YES"

# Без этого убогий rc скрипт создаёт файлы БД по старому расположению и срать ему на my.cnf!!!
mysql_dbdir="/var/db/jailed_mysql/mysql"

В /usr/local/etc/mysql/my.cnf:
[client]
socket = /tmp/mysql/mysql.sock
[mysqld]
socket = /tmp/mysql/mysql.sock
datadir = /var/db/jailed_mysql/mysql
tmpdir = /var/db/jailed_mysql/mysql_tmpdir
slave-load-tmpdir = /var/db/jailed_mysql/mysql_tmpdir
secure-file-priv = /var/db/jailed_mysql/mysql_secure
innodb_data_home_dir = /var/db/jailed_mysql/mysql
innodb_log_group_home_dir = /var/db/jailed_mysql/mysql
sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

skip-networking

В блоке [mysqld], всё, кроме sql_mode и skip-networking, нужно для удобного выноса баз на отдельный ssd, если это не планируется то и эти записи не нужны, как и mysql_dbdir в /etc/rc.conf.
skip-networking — нужен для отключения работы по ipv4, т.к. клетки в бридже и это потенциальная дыра.

Про создание zfs пулов, в т.ч. для баз mysql и скриптов сайтов я напишу отдельно, будет там:

Запускаем mysql server и проверяем:
# /usr/local/etc/rc.d/mysql-server start
# sockstat | grep mysql
mysql mysqld 52312 18 stream /tmp/mysql/mysql.sock
# ps aux | grep mysql
mysql 51994 0.0 0.0 13624 0 - IWNsJ - 0:00.00 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-f....
mysql 52312 0.0 5.0 1217836 417412 - INJ 22:17 0:21.20 /usr/local/libexec/mysqld --defaults-extra-file=/usr/...
root 7289 0.0 0.0 12868 2124 5 SN+J 12:28 0:00.00 grep mysql

Зададим пароль root и удалим всех юзеров mysql без паролей:
# mysql
mysql> grant all on *.* to root@localhost identified by 'ВАШ_ПАРОЛЬ';
mysql> connect mysql;
mysql> delete from user where Password='';
mysql> flush privileges;

На этом первая часть закончена.

2 комментария

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