1 Настройка шифрования MySQL
Обзор
В этом разделе приведено несколько примеров настройки шифрования для CentOS 8.2 и MySQL 8.4.0, которые можно использовать как краткое руководство по шифрованию подключения к базе данных.
Если узел сети MySQL задан как localhost, параметры шифрования будут недоступны. В этом случае соединение между веб-интерфейсом Zabbix и базой данных использует файл сокета (в Unix) или общую память (в Windows) и не может быть зашифровано.
Список комбинаций шифрования не ограничивается приведёнными на этой странице. Доступно гораздо больше комбинаций.
Предварительные требования
Установите базу данных MySQL из официального репозитория.
Подробные сведения об использовании репозитория MySQL см. в документации MySQL.
Сервер MySQL готов принимать защищённые соединения с использованием самоподписанного сертификата.
Чтобы увидеть, какие пользователи используют зашифрованное соединение, выполните следующий запрос (Performance Schema должна быть включена):
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;
Шифрование только для передачи данных
Конфигурация MySQL
Современные версии базы данных готовы к использованию «из коробки» с режимом шифрования required.
Сертификат на стороне сервера будет создан после первоначальной настройки и запуска.
Создайте пользователей и роли для основных компонентов:
mysql> CREATE USER
'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',
'zbx_web'@'%' IDENTIFIED WITH caching_sha2_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.
Выполните команду для проверки соединения (для тестирования защищённых соединений нельзя использовать соединение через сокет):
mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED
Проверьте текущее состояние и доступные наборы шифров:
mysql> status
--------------
mysql Ver 8.4.0 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 и базой данных:
- Установите флажок Database TLS encryption
- Оставьте Verify database certificate неотмеченным

Сервер
Чтобы включить шифрование только на транспортном уровне для соединений между сервером и базой данных, настройте /etc/zabbix/zabbix_server.conf:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...
Шифрование с проверкой центра сертификации
Скопируйте необходимый центр сертификации MySQL на сервер веб-интерфейса Zabbix и назначьте соответствующие права доступа, чтобы веб-сервер мог читать этот файл.
Этот режим не работает в RHEL 7 из-за более старых библиотек MySQL.
Веб-интерфейс
Чтобы включить шифрование с проверкой сертификата для соединений между веб-интерфейсом Zabbix и базой данных:
- Установите флажки Database TLS encryption и Verify database certificate
- Укажите путь к файлу Database 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
...
Шифрование с полной проверкой
Конфигурация MySQL
Установите для параметров конфигурации сервера MySQL CE (/etc/my.cnf.d/server-tls.cnf) следующие значения:
[mysqld]
...
# в этом примере ключи расположены в каталоге datadir MySQL CE
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: Создание SSL- и RSA-сертификатов и ключей с помощью MySQL или Создание SSL-сертификатов и ключей с помощью openssl
Сертификат сервера MySQL должен содержать поле Common Name, установленное в FQDN-имя, так как веб-интерфейс Zabbix будет использовать DNS-имя для связи с базой данных или IP-адрес узла сети базы данных.
Создайте пользователя MySQL:
mysql> CREATE USER
'zbx_srv'@'%' IDENTIFIED WITH caching_sha2_password BY '<strong_password>',
'zbx_web'@'%' IDENTIFIED WITH caching_sha2_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 и базой данных:
- Установите флажки Database TLS encryption и Verify database certificate
- Укажите путь к Database TLS key file
- Укажите путь к Database TLS CA file
- Укажите путь к Database TLS certificate file
Обратите внимание, что параметр Database host verification установлен и недоступен для изменения — этот шаг нельзя пропустить для MySQL.
Если поле Database TLS cipher list оставлено пустым, будут включены общие шифры, разрешённые как веб-интерфейсом (клиентом), так и сервером. В качестве альтернативы шифры можно задать явно в соответствии с требованиями к настройке шифров.

В качестве альтернативы это можно задать в /etc/zabbix/web/zabbix.conf.php:
...
// Used for TLS connection with strictly defined Cipher list.
$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';
...
// or
...
// Used for TLS connection without Cipher list defined - selected by MySQL server
$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
...