Как обеспечить шифрование трафика репликации в MariaDB Galera Cluster на Ubuntu

Ранее мы рассматривали настройку многомастерового кластера MariaDB Galera на Ubuntu. По умолчанию репликационный трафик в этом кластере не защищен. В данном руководстве мы объясним, как активировать шифрование TLS, чтобы узлы кластера могли безопасно обмениваться данными через общедоступный Интернет. В Galera-кластере выделяют два типа репликационного трафика:

  • Состояние передачи
  • Копирование набора данных.

Что представляет собой концепция передачи состояния?

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

  • Передача состояния снимка (SST): дублирование всей базы данных.
  • Инкрементальная передача состояния (ИТС): передача лишь изменённых данных.

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

Понимание СТТ

Существует пять способов SST:

  • wsrep_sst_rsync: стандартный метод передачи данных.
  • wsrep_sst_mysqldump: наименее быстрый способ.
  • wsrep_sst_mariabackup: метод, не вызывающий блокировок.
  • wsrep_sst_xtrabackup
  • wsrep_sst_xtrabackup-v2

Rsync является стандартным методом SST и отличается высокой скоростью. Рекомендуется избегать использования xtrabackup или xtrabackup-v2, так как они несовместимы с MariaDB 10.3+ и не обеспечивают поддержку GTID и шифрования данных в состоянии покоя.

Я отдаю предпочтение mariabackup, так как он не блокирует узел-донор во время передачи состояния, что является его преимуществом, унаследованным от xtrabackup. В отличие от него, rsync и mysqldump требуют перевода донора в режим только для чтения с помощью команды flush tables with read lock во время передачи. Метод SST mariabackup является форком xtrabackup-v2 и основан на утилите командной строки mariabackup и socat.

Для того чтобы настроить mariabackup в качестве метода SST, сначала необходимо установить socat и mariabackup на каждом узле кластера, а также на узле, который присоединяется.

sudo apt install socat

Если вы обновили MariaDB до последней версии из репозитория mariadb.org, для установки mariabackup выполните следующую команду.

sudo apt install mariadb-backup

Далее внесите следующие две строки в раздел [galera] файла /etc/mysql/mariadb.conf.d/60-galera. cnf на каждом узле кластера и узле, который будет подключаться.

[galera] . . wsrep_sst_method = mariabackup wsrep_sst_auth = mariabackup:ваш_пароль

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

Читайте также:  Дополнять слэшем симлинки на директории по табу в Linux

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

create user 'mariabackup'@'localhost' установлен пароль 'ваш_парольпредоставить права на перезагрузку, обработку, блокировку таблиц и клиентскую репликацию на . для 'mariabackup'@'localhost';

Обновите таблицы прав доступа и завершите сессию.

flush privileges; exit;

Перезагрузите MariaDB на каждом узле по очереди, а затем выполните перезагрузку на узле, который подключается.

sudo systemctl restart mariadb

Шифрование резервного копирования Mariabackup SST

Для создания самоподписанного TLS-сертификата можно воспользоваться openssl, однако я предпочту использовать уже настроенный TLS-сертификат от Let’s Encrypt для моего веб-сервера. Чтобы активировать TLS-шифрование на mariabackup SST, откройте основной конфигурационный файл MariaDB (например, /etc/mysql/mariadb.conf.d/50-server. cnf или /etc/mysql/my. cnf) и добавьте в конце файла указанные строки. Не забудьте при необходимости изменить путь.

[sst] encrypt=4 tkey=/etc/letsencrypt/live/linux16.ru/privkey. pem tcert=/etc/letsencrypt/live/linux16.ru/сертификат. pem tca=/etc/letsencrypt/живой/linux16.ru/chain. pem

Переменная encrypt может принимать одно из пяти значений: 0, 1, 2, 3 или 4. Значение 0 указывает на то, что шифрование отключено. Значения 1, 2 и 3 больше не используются. Не забудьте сохранить и закрыть файл. Пользователь mysql должен иметь доступ к перечисленным выше SSL-файлам, поэтому необходимо предоставить права на чтение с помощью следующих команд.

sudo setfacl -R -m "u:mysql:rx" /etc/letsencrypt/archive/ /etc/letsencrypt/live/

Учтите, что для всех узлов в кластере необходимо применять одинаковый TLS-сертификат и закрытый ключ. После этого требуется перезапустить весь кластер Galera, чтобы изменения были активированы.

Имейте в виду, что во время выполнения SST все пользовательские файлы в директории /var/lib/mysql/ будут удалены.

Осознание IST

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

Плюсы IST:

  • IST не препятствует донору.
  • IST работает быстрее SST, так как передает лишь изменения.

Если размер GCache на доноре недостаточен для хранения всех необходимых записей, подключающемуся узлу будет инициирована SST. Чтобы избежать этой ситуации, можно увеличить объем GCache. По умолчанию его размер составляет 128 МБ, и это значение можно проверить с помощью соответствующей команды в мониторинге MariaDB.

Читайте также:  Как установить NetBeans IDE 8.2 (PHP) на Ubuntu Desktop

show variables like 'wsrep_provider_options'\G

Значения, относящиеся к GCache, таковы:

gcache.dir = /var/lib/mysql/; gcache. keep_pages_size = 0; gcache. mem_size = 0; gcache. name = /var/lib/mysql//galera.cache; gcache. page_size = 128M; gcache. recover = no; gcache. size = 128M ;

Файл GCache находится по пути /var/lib/mysql/galera. cache и его размер уже зарезервирован. Чтобы увеличить объем GCache, необходимо внести следующую строку в секцию [mysqld] конфигурационного файла MariaDB.

wsrep_provider_options="gcache. size = 1G"

Установите нужный размер кэша, заменив 1G. Убедитесь, что ваш сервер обладает достаточным объемом оперативной памяти. Использование большого значения для GCache при ограниченном объеме ОЗУ может привести к проблемам с запуском сервера MariaDB. Рекомендуется также установить параметр gcache. recover в значение yes, чтобы узел мог попытаться восстановить свой GCache при старте и продолжать обслуживать IST для других подключающихся узлов.

wsrep_provider_options="gcache. size = 1G; gcache. recover = yes"

Настройте аналогичную конфигурацию на всех узлах кластера и перезапустите их последовательно.

Шифрование IST — это процесс, позволяющий защищать информацию

Я пытался применить TLS-сертификат Let’s Encrypt для защиты трафика IST, однако каждый раз сталкивался с одной и той же ошибкой в журнале при подключении узла к кластеру.

[ERROR] WSREP: handshake with remote endpoint ssl://xx. xx. xx. xx:4567 failed: asio. ssl:337047686: 'certificate verify failed' ( 337047686: 'error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed')

Таким образом, я разработал самоподписанный сертификат для сервера и соответствующий закрытый ключ. Этапы выполнения следующие.

Создайте папку для размещения файлов SSL.

sudo mkdir /etc/ssl/mysql/

cd /etc/ssl/mysql/

Создайте файл ключа для центра сертификации (CA):

sudo openssl genrsa 2048 > ca-key. pem

Создайте файл сертификата для центра сертификации. Мы устанавливаем срок его действия на 100 лет, чтобы предотвратить возможные простои кластера.

sudo openssl req - new - x509 - nodes - days 36500 - key ca-key. pem - out ca. pem

Вам потребуется ответить на ряд вопросов. Я лишь указал код страны и название учреждения.

Шифрование в кластере MariaDB Galera.

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

sudo openssl req - newkey rsa:2048 - days 36500 - nodes - keyout server-key. pem - out server-req. pem

Уберите пароль.

sudo openssl rsa - in server-key. pem - out server-key. pem

Создайте файл сертификата для сервера:

openssl x509 - req - in server-req. pem - days 36500 - CA ca. pem - CAkey ca-key. pem - set_serial 01 - out server-cert. pem

Далее необходимо перенести все файлы на другие узлы кластера, воспользовавшись утилитой scp, и желательно поместить их в один каталог (/etc/ssl/mysql/). Не забудьте также проверить, что пользователь mysql обладает правами на чтение всех SSL-файлов.

Читайте также:  Какой Linux выбрать для слабых ноутбуков?

sudo chown mysql:mysql /etc/ssl/mysql/ - R sudo chmod 400 /etc/ssl/mysql/* sudo chmod 700 /etc/ssl/mysql/

Затем откройте основной конфигурационный файл MariaDB, который может находиться по адресу /etc/mysql/mariadb.conf.d/50-server. cnf или /etc/mysql/my. cnf, и внесите указанные строки в раздел [mysqld].

wsrep_provider_options="socket. ssl_key=/etc/ssl/mysql/server-key. pem;socket. ssl_cert=/etc/ssl/mysql/server-cert. pem;socket. ssl_ca=/etc/ssl/mysql/ca. pem"

Если у вас имеются дополнительные параметры провайдера wsrep, их следует соединить вместе, как указано ниже.

wsrep_provider_options="gcache. size = 1G; gcache. recover = yes;socket. ssl_key=/etc/ssl/mysql/server-key. pem;socket. ssl_cert=/etc/ssl/mysql/server-cert. pem;socket. ssl_ca=/etc/ssl/mysql/ca. pem"

Настройте каждый узел в кластере и перезапустите весь кластер для применения изменений. Если всё пройдет успешно, ваш узел сможет подключиться к кластеру, и в журнале MariaDB (sudo journalctl — eu mariadb) появится сообщение, подтверждающее, что IST зашифрован. (IST использует TCP-порт 4568.)

2019-03-19 14:40:03 1 [Note] WSREP: IST sender using ssl 2019-03-19 14:40:03 0 [Note] WSREP: async IST sender starting to serve ssl://xx. xx. xx. xx:4568 sending 166613-167529

Шифрование данных репликации Write-set

Репликация write-set представляет собой тип синхронной репликации, при которой один узел передает изменения данных всем остальным узлам. Этот процесс применяет те же механизмы шифрования, что и IST. Если TLS-шифрование активировано для IST, то и репликация write-set будет зашифрована, о чем свидетельствуют соответствующие сообщения в журнале MariaDB (sudo journalctl — eu mariadb), подтверждающие защиту репликации с помощью TLS. (Репликация write-set функционирует через TCP-порт 4567.)

SSL handshake successful, remote endpoint ssl://xx. xx. xx. xx:4567 local endpoint ssl://xx. xx. xx. xx:37118 cipher: TLS_AES_256_GCM_SHA384 compression: none

Способы обновления MariaDB в кластере Galera

Если требуется перейти на новую основную версию MariaDB, выполните следующие шаги.

  1. Выберите узел для обновления и убедитесь, что весь трафик перенаправлен на другие узлы.
  2. Остановите MariaDB на данном узле командой:sudo systemctl stop mariadbОткорректируйте конфигурационный файл базы данных, установив параметр wsrep_on = OFF. Это позволит избежать попыток узла восстановить подключение к кластеру в процессе обновления пакета.
  3. Обновите MariaDB до следующей основной версии на данном узле.
  4. Включите MariaDB командой (sudo systemctl start mariadb).
  5. Включите параметр wsrep_on в настройках базы данных и перезапустите MariaDB.
  6. Следуйте тем же действиям для остальных узлов.

SST не совместим между различными основными версиями MariaDB, например, MariaDB 10.4 и MariaDB 10.5. При наличии крупной базы данных рекомендуется увеличить значение параметра gcache. size, чтобы избежать необходимости SST. При обновлении Galera с одной версии на другую, например, с Galera 3 на Galera 4, требуется сначала остановить кластер, затем обновить каждый из узлов, после чего заново запустить кластер.