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;

Режим Required

Конфигурация MySQL

Современные версии базы данных готовы к работе из коробки для режима шифрования required encryption mode. Сертификат на стороне сервера будет создан после первоначальной настройки и запуска.

Создайте пользователей и роли для основных компонентов:

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-GCM-SHA384:ECDHE-RSA-AES256-GCM-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
...

Режим Verify Full

Конфигурация 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: Creating SSL and RSA certificates and keys using MySQL или Creating SSL certificates and keys using 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
...