1. Настройка шифрования для MySQL
Обзор
В этом разделе предоставлено несколько примеров настроек шифрования для CentOS 8.2 и MySQL 8.0.21, раздел может использоваться в качестве руководства по быстрому старту для шифрования соединений к базе данных.
Если хост MySQL выставлен в значение localhost, опции шифрования будут недоступны. В этом случае соединение между веб-интерфейсом Zabbix и базой данных использует сокет-файл (в Unix) или разделяемую память (в Windows) и не может быть зашифровано.
Список комбинаций шифрования не ограничивается тем, что перечислено на этой странице. Имеется гораздо больше комбинаций.
Предварительные условия
Установите базу данных MySQL из официального репозитория.
Обратитесь к документации MySQL [en] за подробностями того, как использовать репозиторий MySQL.
Сервер MySQL готов принимать безопасные подключения, используя самоподписанный сертификат.
Чтобы посмотреть, какие пользователи используют шифрованное подключение, выполните следующий запрос (Performance Schema должно быть включено, т.е. ON):
mysql> SELECT sbt.variable_value AS tls_version, t2.variable_value AS cipher, processlist_user AS user, processlist_host AS host
FROM performance_schema.status_by_thread AS sbt
JOIN performance_schema.threads AS t ON t.thread_id = sbt.thread_id
JOIN performance_schema.status_by_thread AS t2 ON t2.thread_id = t.thread_id
WHERE sbt.variable_name = 'Ssl_version' and t2.variable_name = 'Ssl_cipher'
ORDER BY tls_version;
Режим Required
Настройка MySQL
Современные версии базы данных готовы для
режима шифрования required «прямо из коробки». Сертификат на стороне сервера будет создан после первоначальной настройки и запуска.
Создайте пользователей и роли для основных компонентов:
mysql> CREATE USER
'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
REQUIRE SSL
PASSWORD HISTORY 5;
mysql> CREATE ROLE 'zbx_srv_role', 'zbx_web_role';
mysql> GRANT SELECT, UPDATE, DELETE, INSERT, CREATE, DROP, ALTER, INDEX, REFERENCES ON zabbix.* TO 'zbx_srv_role';
mysql> GRANT SELECT, UPDATE, DELETE, INSERT ON zabbix.* TO 'zbx_web_role';
mysql> GRANT 'zbx_srv_role' TO 'zbx_srv'@'%';
mysql> GRANT 'zbx_web_role' TO 'zbx_web'@'%';
mysql> SET DEFAULT ROLE 'zbx_srv_role' TO 'zbx_srv'@'%';
mysql> SET DEFAULT ROLE 'zbx_web_role' TO 'zbx_web'@'%';
Обратите внимание, что протокол X.509 не используется для проверки идентичности, но пользователь настраивается на использование только шифрованных соединений. Обратитесь к документации MySQL [en] за подробностями относительно настроек пользователя.
Выполните проверку подключения (подключения на базе сокета нельзя использовать для тестирования безопасных соединений):
mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED
Проверить текущее состояние и доступные наборы шифров:
mysql> status
--------------
mysql Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 62
Current database:
Current user: [email protected]
SSL: Cipher in use is TLS_AES_256_GCM_SHA384
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;
*************************** 1. row ***************************
Variable_name: Ssl_cipher_list
Value: TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-DSS-AES128-SHA:DHE-RSA-AES128-SHA:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES256-SHA:CAMELLIA256-SHA:CAMELLIA128-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA
1 row in set (0.00 sec)
ERROR:
No query specified
Веб-интерфейс
Чтобы включить только подключения с шифрованием на транспортном уровне между веб-интерфейсом Zabbix и базой данных:
- Отметьте TLS шифрование базы данных
- Оставьте Удостоверять сертификат базы данных неотмеченным

Сервер
Чтобы включить только подключения с шифрованием на транспортном уровне между сервером Zabbix и базой данных, настройте /etc/zabbix/zabbix_server.conf:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...
Режим Verify CA
Скопируйте нужный MySQL CA на сервер с веб-интерфейсом Zabbix, назначьте правильные права доступа, чтобы разрешить веб-серверу читать этот файл.
Режим Verify CA не работает на SLES 12 и RHEL 7 из-за более старых библиотек MySQL.
Веб-интерфейс
Чтобы разрешить шифрование с проверкой сертификата для соединений между веб-интерфейсом Zabbix и базой данных:
- Отметьте TLS шифрование базы данных и Удостоверять сертификат базы данных
- Укажите путь в поле Файл TLS CA базы данных

Как альтернатива, это можно выставить в файле /etc/zabbix/web/zabbix.conf.php:
...
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
...
Протестируйте пользователя с помощью инструмента командной строки, чтобы проверить, что подключение для нужного пользователя возможно:
mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=REQUIRED --ssl-ca=/var/lib/mysql/ca.pem
Сервер
Чтобы разрешить шифрование с проверкой сертификата для соединений между сервером Zabbix и базой данных, настройте /etc/zabbix/zabbix_server.conf:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=verify_ca
DBTLSCAFile=/etc/ssl/mysql/ca.pem
...
Режим Verify Full
Настройка MySQL
Выставьте опции конфигурации сервера MySQL CE (/etc/my.cnf.d/server-tls.cnf) в:
[mysqld]
...
# in this examples keys are located in the MySQL CE datadir directory
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON
tls_version=TLSv1.3
...
Ключи для сервера MySQL CE и клиента (веб-интерфейс Zabbix) нужно создать вручную в соответствии с документацией MySQL CE documentation: Creating SSL and RSA certificates and keys using MySQL [en] или Creating SSL certificates and keys using openssl [en].
Сертификат сервера MySQL должен содержать поле Common Name, заданное в FQDN-имя, поскольку веб-интерфейс Zabbix для коммуникаций с базой данных будет использовать DNS-имя или IP-адрес хоста базы данных.
Создайте пользователя:
mysql> CREATE USER
'zbx_srv'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>',
'zbx_web'@'%' IDENTIFIED WITH mysql_native_password BY '<strong_password>'
REQUIRE X509
PASSWORD HISTORY 5;
Проверьте, можно ли подключиться этим пользователем:
mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=VERIFY_IDENTITY --ssl-ca=/var/lib/mysql/ca.pem --ssl-cert=/var/lib/mysql/client-cert.pem --ssl-key=/var/lib/mysql/client-key.pem
Веб-интерфейс
Чтобы разрешить шифрование с полной верификацией для подключений между веб-интерфейсом Zabbix и базой данных:
- Отметьте TLS шифрование базы данных (Database TLS encryption) и Удостоверять сертификат базы данных (Verify database certificate)
- Укажите путь в поле Файл TLS ключа базы данных (Database TLS key file)
- Укажите путь в поле Файл TLS CA базы данных (Database TLS CA file)
- Укажите путь в поле Файл TLS сертификата базы данных (Database TLS certificate file)
Обратите внимание, что поле Сверка хоста базы данных (Database host verification) отмечено флажком и недоступно (затемнено серым) — этот шаг не может быть пропущен для MySQL.
Если поле Список шифров TLS базы данных (Database TLS cipher list) оставить пустым, будут включены общие шифры, разрешёееые как веб-интерфейсом (клиентом), так и сервером. В качестве альтернативы шифры можно задать явно в соответствии с требованиями к конфигурации шифра [en].

В качестве альтернативы, это может быть задано в /etc/zabbix/web/zabbix.conf.php:
...
// Используется для TLS-подключения со строго определённым списком шифров.
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
$DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-GC';
...
// или
...
// Используется для соединения TLS без заданного списка шифров — выбирается сервером MySQL
$DB['ENCRYPTION'] = true;
$DB['KEY_FILE'] = '/etc/ssl/mysql/client-key.pem';
$DB['CERT_FILE'] = '/etc/ssl/mysql/client-cert.pem';
$DB['CA_FILE'] = '/etc/ssl/mysql/ca.pem';
$DB['VERIFY_HOST'] = true;
$DB['CIPHER_LIST'] = '';
...
Сервер
Чтобы разрешить шифрование с полной верификацией для подключений между сервером Zabbix и базой данных, настройте /etc/zabbix/zabbix_server.conf:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=verify_full
DBTLSCAFile=/etc/ssl/mysql/ca.pem
DBTLSCertFile=/etc/ssl/mysql/client-cert.pem
DBTLSKeyFile=/etc/ssl/mysql/client-key.pem
...