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 шифрование базы данных и Удостоверять сертификат базы данных
  • Укажите путь в поле Файл TLS ключа базы данных
  • Укажите путь в поле Файл TLS CA базы данных
  • Укажите путь в поле Файл TLS сертификата базы данных

Обратите внимание, что поле Сверка хоста базы данных отмечено и недоступно (затемнено серым) - этот шаг не может быть пропущен для 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:

...
       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
       ...