[comment]: # translation:outdated

[comment]: # ({4e1e4061-4e1e4061})
# 1 Configuración de cifrado en MySQL
[comment]: # (tags: ssl)

[comment]: # ({/4e1e4061-4e1e4061})

[comment]: # ({f87c5964-f87c5964})
### Descripción general

Esta sección proporciona varios ejemplos de configuración de cifrado para
CentOS 8.2 y MySQL 8.0.21 y se puede utilizar como guía de inicio rápido para
cifrar la conexión a la base de datos.

::: noteimportant
 Si
el host MySQL está configurado en localhost, las opciones de cifrado no estarán disponibles.
En este caso, una conexión entre la interfaz de Zabbix y
la base de datos utiliza un archivo de socket (en Unix) o memoria compartida (en Windows) y
no se puede cifrar.
:::

::: noteclassic
La lista de las combinaciones de cifrado
 no se limita a las que figuran en esta página. Hay
muchas más combinaciones disponibles.
:::

[comment]: # ({/f87c5964-f87c5964})

[comment]: # ({30b5ee7b-30b5ee7b})
### Requisitos previos

Instale la base de datos MySQL desde el [repositorio oficial](https://dev.mysql.com/downloads/repo/yum/).

Ver la [documentación MySQL](https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)
para obtener detalles sobre cómo utilizar el repositorio de MySQL.

El servidor MySQL está listo para aceptar conexiones seguras mediante un archivo de certificado autofirmado..

Para ver qué usuarios están utilizando una conexión cifrada, ejecute la siguiente
consulta (el esquema de rendimiento 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_threadAS 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;

[comment]: # ({/30b5ee7b-30b5ee7b})

[comment]: # ({fda36821-fda36821})
### Modo requerido

[comment]: # ({/fda36821-fda36821})

[comment]: # ({506c2709-9ebeae19})
#### Configuración de MySQL

Las versiones modernas de la base de datos están listas para usar el
[modo de cifrado](/manual/appendix/install/db_encrypt#terminology) requerido.
El certificado del lado del servidor se creará después de la configuración y el lanzamiento iniciales.

Cree usuarios y roles para los componentes principales:


    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 utiliza para comprobar la identidad, pero el
usuario está configurado para utilizar sólo conexiones cifradas. Ver la [documentación de MySQL
](https://dev.mysql.com/doc/refman/8.0/en/create-user.html#create-user-tls)
para obtener más detalles sobre la configuración de usuarios.

Ejecute para verificar la conexión (la conexión del socket no se puede usar para probar las conexiones seguras):

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

Verifique 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: zbx_srv@bfdb.local
    SSL: Cipher in use is TLS_AES_256_GCM_SHA384


    mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher_list'\G;
    **************************** 1. fila ******************** *******
    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 se ha especificado ninguna consulta

[comment]: # ({/506c2709-9ebeae19})

[comment]: # ({68afdcc8-68afdcc8})
#### Interfaz

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

- Marque *Cifrado TLS de la base de datos*
- Deje *Verificar certificado de base de datos* sin marcar

![](../../../../../assets/en/manual/appendix/install/encrypt_db_transport.png){width="600"}

[comment]: # ({/68afdcc8-68afdcc8})

[comment]: # ({99c0e65b-99c0e65b})
#### Servidor

Para habilitar el cifrado de solo 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
    ...

[comment]: # ({/99c0e65b-99c0e65b})

[comment]: # ({fa9ec203-fa9ec203})
### Modo de verificación de CA

Copie el archivo CA de MySQL requerida al servidor frontend de Zabbix, asigne los permisos adecuados
 para permitir que el servidor web lea este archivo.

::: noteclassic
El modo  *Verificar CA* no funciona en SLES 12 y RHEL 7 debido a
bibliotecas MySQL más antiguas.
:::

[comment]: # ({/fa9ec203-fa9ec203})

[comment]: # ({f7df2e5a-9776435f})
#### Interfaz

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

- Active *Cifrado TLS de base de datos* y *Verificar certificado de base de datos*
- Especifique la ruta al archivo CA TLS de la base de datos

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_ca.png){width="600"}

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'] = falso;
    $DB['CIPHER_LIST'] = '';
    ...

Solucione problemas del usuario usando la herramienta de línea de comandos para verificar 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

[comment]: # ({/f7df2e5a-9776435f})

[comment]: # ({a7a54f92-a7a54f92})
#### Servidor

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

[comment]: # ({/a7a54f92-a7a54f92})

[comment]: # ({fa5d4760-fa5d4760})
### Modo de verificación completa

[comment]: # ({/fa5d4760-fa5d4760})

[comment]: # ({abc6b361-22fb0ddd})
#### Configuración de MySQL

Establezca la opción de configuración del servidor MySQL CE
(*/etc/my.cnf.d/server-tls.cnf*) a:

    [mysqld]
    ...
    # en este ejemplo, 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 cliente MySQL CE (frontend Zabbix) deben ser
creadas manualmente según la documentación de MySQL CE: [Creación de SSL
y certificados y claves RSA utilizando
MySQL](https://dev.mysql.com/doc/refman/8.0/en/creating-ssl-rsa-files-using-mysql.html) o
[Creación de certificados y claves SSL utilizando
openssl](https://dev.mysql.com/doc/refman/5.7/en/creating-ssl-files-using-openssl.html)

::: noteimportant
 El certificado del servidor MySQL debe contener el
campo "Common Name" establecido en el nombre FQDN ya que la interfaz de Zabbix utilizará el
nombre DNS para comunicarse con la base de datos o dirección IP del equipo de la base de datos.
:::

Crear usuario MySQL:

    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

[comment]: # ({/abc6b361-22fb0ddd})

[comment]: # ({c64d3aec-2f3a5c57})
#### Interfaz

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

-   Verifique el cifrado TLS de la base de datos y verifique el certificado de la base de datos
-   Especifique la ruta al archivo de clave TLS de la base de datos
-   Especifique la ruta al archivo CA TLS de la base de datos
-   Especifique la ruta al archivo de certificado TLS de la base de datos

Tenga en cuenta que la *Verificación del equipo de la base de datos* está marcado y atenuado: este paso no se puede omitir para MySQL.

::: notewarning
 La lista de cifrado
debe estar vacía, para que la interfaz y el servidor puedan negociar el cifrado requerido
soportado por ambos extremos.
:::

![](../../../../../assets/en/manual/appendix/install/encrypt_db_verify_full1.png){width="600"}

Alternativamente, esto se puede configurar en */etc/zabbix/web/zabbix.conf.php*:

    ...
    // Se utiliza para conexiones TLS con una lista de cifrado 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 conexión TLS sin lista de cifrado definida - seleccionada 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'] = '';
    ...

[comment]: # ({/c64d3aec-2f3a5c57})

[comment]: # ({c0090000-c0090000})
#### Servidor

Para habilitar el cifrado con verificación completa para 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=<contraseña_fuerte>
    DBTLSConnect=verify_full
    DBTLSCAFile=/etc/ssl/mysql/ca.pem
    DBTLSCertFile=/etc/ssl/mysql/client-cert.pem
    DBTLSKeyFile=/etc/ssl/mysql/client-key.pem
    ...

[comment]: # ({/c0090000-c0090000})
