В этом разделе предоставлено несколько примеров настроек шифрования для 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> 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> 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 и базой данных:
Чтобы включить только подключения с шифрованием на транспортном уровне между сервером Zabbix и базой данных, настройте /etc/zabbix/zabbix_server.conf:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...
Скопируйте нужный MySQL CA на сервер с веб-интерфейсом Zabbix, назначьте правильные права доступа, чтобы разрешить веб-серверу читать этот файл.
Режим Verify CA не работает на SLES 12 и RHEL 7 из-за более старых библиотек MySQL.
Чтобы разрешить шифрование с проверкой сертификата для соединений между веб-интерфейсом Zabbix и базой данных:
Как альтернатива, это можно выставить в файле /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'] = '';
...
Протестируйте пользователя с помощью инструмента командной строки, чтобы проверить, что подключение для нужного пользователя возможно:
Чтобы разрешить шифрование с проверкой сертификата для соединений между сервером 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 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 и базой данных:
Обратите внимание, что поле Сверка хоста базы данных отмечено и недоступно (затемнено серым) - этот шаг не может быть пропущен для MySQL.
Список шифров должен быть пустым, чтобы веб-интерфейс и сервер могли согласовать нужный из поддерживаемых обеими сторонами.
Как альтернатива, это может быть задано в /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';
...
// или
...
// 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: