Esta sección proporciona varios ejemplos de configuración de cifrado para CentOS 8.2 y MySQL 8.4.0 y puede utilizarse como una guía rápida para cifrar la conexión a la base de datos.
Si el host de MySQL está configurado como localhost, las opciones de cifrado no estarán disponibles. En este caso, la conexión entre el frontend de Zabbix y la base de datos utiliza un archivo de socket (en Unix) o memoria compartida (en Windows) y no puede cifrarse.
La lista de combinaciones de cifrado no se limita a las que se enumeran en esta página. Hay muchas más combinaciones disponibles.
Instale la base de datos MySQL desde el repositorio oficial.
Consulte la documentación de MySQL para obtener detalles sobre cómo usar el repositorio de MySQL.
El servidor MySQL está listo para aceptar conexiones seguras utilizando un certificado autofirmado.
Para ver qué usuarios están utilizando una conexión cifrada, ejecute la siguiente consulta (Performance Schema debe estar ACTIVADO):
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;
Las versiones modernas de la base de datos están listas para usar con el modo de cifrado required
de fábrica. Se creará un certificado del lado del servidor después de la configuración y el inicio inicial.
Cree usuarios y roles para los componentes principales:
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'@'%';
Tenga en cuenta que el protocolo X.509 no se utiliza para comprobar la identidad, pero el usuario está configurado para usar solo conexiones cifradas. Consulte la documentación de MySQL para obtener más detalles sobre la configuración de usuarios.
Ejecute para comprobar la conexión (no se puede usar la conexión por socket para probar conexiones seguras):
Compruebe el estado actual y los conjuntos de cifrado disponibles:
mysql> status
--------------
mysql Ver 8.4.0 for Linux on x86_64 (MySQL Community Server - GPL)
Connection id: 62
Current database:
Current user: zbx_srv@bfdb.local
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
Para habilitar el cifrado solo de transporte para las conexiones entre la interfaz web de Zabbix y la base de datos:
Para habilitar el cifrado solo de transporte para las conexiones entre el servidor y la base de datos, configure /etc/zabbix/zabbix_server.conf:
...
DBHost=10.211.55.9
DBName=zabbix
DBUser=zbx_srv
DBPassword=<strong_password>
DBTLSConnect=required
...
Copie la CA de MySQL requerida al servidor frontend de Zabbix, asigne los permisos adecuados para permitir que el servidor web lea este archivo.
Este modo no funciona en RHEL 7 debido a bibliotecas MySQL antiguas.
Para habilitar el cifrado con verificación de certificado para las conexiones entre la interfaz web de Zabbix y la base de datos:
Alternativamente, esto se puede configurar en /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'] = '';
...
Solucione problemas utilizando la herramienta de línea de comandos para comprobar si es posible la conexión para el usuario requerido:
Para habilitar el cifrado con verificación de certificado para las conexiones entre el servidor Zabbix y la base de datos, configure /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
...
Establezca la opción de configuración del servidor MySQL CE (/etc/my.cnf.d/server-tls.cnf) en:
[mysqld]
...
# en estos ejemplos las claves se encuentran en el directorio datadir de MySQL CE
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON
tls_version=TLSv1.3
...
Las claves para el servidor y el cliente de MySQL CE (interfaz web de Zabbix) deben crearse manualmente según la documentación de MySQL CE: Creación de certificados y claves SSL y RSA usando MySQL o Creación de certificados y claves SSL usando openssl
El certificado del servidor MySQL debe contener el campo Common Name configurado con el nombre FQDN, ya que la interfaz web de Zabbix utilizará el nombre DNS para comunicarse con la base de datos o la dirección IP del host de la base de datos.
Cree el usuario de 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;
Compruebe si es posible iniciar sesión con ese usuario:
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
Para habilitar el cifrado con verificación completa para las conexiones entre la interfaz web de Zabbix y la base de datos:
Tenga en cuenta que Verificación del host de la base de datos está marcada y deshabilitada; este paso no se puede omitir para MySQL.
Si el campo Lista de cifrados TLS de la base de datos se deja vacío, se habilitarán los cifrados comunes permitidos tanto por la interfaz web (cliente) como por el servidor. Alternativamente, los cifrados pueden establecerse explícitamente, de acuerdo con los requisitos de configuración de cifrados.
Alternativamente, esto se puede configurar en /etc/zabbix/web/zabbix.conf.php:
...
// Usado para la conexión TLS con una lista de cifrados estrictamente definida.
$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';
...
// o
...
// Usado para la conexión TLS sin lista de cifrados definida - seleccionados por el servidor 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'] = '';
...
Para habilitar el cifrado con verificación completa para las conexiones entre el servidor Zabbix y la base de datos, configure /etc/zabbix/zabbix_server.conf: