1 Configuración de cifrado de MySQL

Resumen

Esta sección proporciona varios ejemplos de configuración de cifrado para CentOS 8.2 y MySQL 8.0.30 y puede utilizarse como una guía de inicio rápido 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, una conexión entre Zabbix frontend 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 enumeradas en esta página. Hay muchas más combinaciones disponibles.

Requisitos previos

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 server de MySQL está listo para aceptar conexiones seguras mediante un certificado autofirmado.

Para ver qué usuarios están usando una conexión cifrada, ejecute la siguiente consulta (Performance Schema debe estar activado):

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;

Cifrado solo de transporte

Configuración de MySQL

Las versiones modernas de la base de datos están listas de fábrica para el modo de cifrado required encryption mode. Se creará un certificado del lado del server después de la configuración e inicio iniciales.

Cree usuarios y roles para los componentes principales:

Para las versiones de MySQL 8.4+, se debe usar caching_sha2_password en lugar de mysql_native_password.

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'@'%';

Tenga en cuenta que el protocolo X.509 no se usa para comprobar la identidad, sino que 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 una conexión por socket para probar conexiones seguras):

mysql -u zbx_srv -p -h 10.211.55.9 --ssl-mode=REQUIRED 

Compruebe el estado actual y los conjuntos de cifrado disponibles:

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

Frontend

Para habilitar el cifrado solo de transporte para las conexiones entre el frontend de Zabbix y la base de datos:

  • Marque Database TLS encryption
  • Deje sin marcar Verify database certificate

Server

Para habilitar el cifrado solo de transporte para las conexiones entre el server 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
...

Cifrado con verificación de autoridad certificadora

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 SLES 12 y RHEL 7 debido a bibliotecas MySQL antiguas.

Frontend

Para habilitar el cifrado con verificación de certificado para las conexiones entre Zabbix frontend y la base de datos:

  • Marque Database TLS encryption y Verify database certificate
  • Especifique la ruta al archivo Database TLS CA

Como alternativa, 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 con el usuario usando la herramienta de línea de comandos para comprobar si la conexión es posible para el usuario requerido:

mysql -u zbx_web -p -h 10.211.55.9 --ssl-mode=REQUIRED --ssl-ca=/var/lib/mysql/ca.pem

Server

Para habilitar el cifrado con verificación de certificado para las conexiones entre Zabbix server 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
...

Cifrado con verificación completa

Configuración de MySQL

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 (Zabbix frontend) deben crearse manualmente de acuerdo con la documentación de MySQL CE: Creating SSL and RSA certificates and keys using MySQL o Creating SSL certificates and keys using openssl

El certificado del servidor MySQL debe contener el campo Common Name establecido con el nombre FQDN, ya que Zabbix frontend usará 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:

Para las versiones de MySQL 8.4+, se debe usar caching_sha2_password en lugar de mysql_native_password.

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;

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

Frontend

Para habilitar el cifrado con verificación completa para las conexiones entre el frontend de Zabbix y la base de datos:

  • Marque Database TLS encryption y Verify database certificate
  • Especifique la ruta del archivo Database TLS key file
  • Especifique la ruta del archivo Database TLS CA file
  • Especifique la ruta del archivo Database TLS certificate file

Tenga en cuenta que Database host verification está marcada y atenuada: este paso no se puede omitir para MySQL.

Si el campo Database TLS cipher list se deja vacío, se habilitarán los cifrados comunes permitidos tanto por el frontend (cliente) como por el server. Alternativamente, los cifrados se pueden definir explícitamente, de conformidad con los requisitos de configuración de cifrados.

Como alternativa, esto se puede configurar en /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'] = '';
...

Server

Para habilitar el cifrado con verificación completa para las conexiones entre Zabbix server 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_full
DBTLSCAFile=/etc/ssl/mysql/ca.pem
DBTLSCertFile=/etc/ssl/mysql/client-cert.pem
DBTLSKeyFile=/etc/ssl/mysql/client-key.pem
...