Guía del cifrado MySQL en la configuración de cifrado de tránsito y obligatorio

Guía del cifrado MySQL en la configuración de cifrado de tránsito y obligatorio
Por defecto, la transmisión de datos de MySQL entre el cliente y el servidor se lleva a cabo sin cifrado. La transmisión de datos no entrelazada es aceptable solo cuando el cliente y el servidor están dentro de la misma red que garantiza la seguridad. Sin embargo, los datos tienen un riesgo potencial si ambas partes están en una red separada. La falta de cifrado introduce un riesgo severo de intercepción de datos mediante un ataque de hombre en el medio (MITM).

Para superar este riesgo, MySQL admite el cifrado en tránsito entre el cliente y el servidor a través del protocolo TLS/SSL. El artículo se centra en la generación manual de certificados SSL y archivos de claves en MySQL para configurar SSL. Más tarde, el artículo también se centra en habilitar los requisitos de cifrado obligatorio de los clientes.

Empezando

Versiones mysql 5.7.28+ proporciona una herramienta útil conocida como mysql_ssl_rsa_setup, que se basa en los binarios OpenSSL para generar automáticamente los certificados y claves SSL requeridos para admitir una conexión segura.

Por lo tanto, antes de comenzar, verifique el estado de conexión SSL predeterminado del servidor MySQL. Escriba el siguiente comando para verificar el valor de la sesión SSL:

MySQL> mostrar variables globales como '%ssl%';
+---------------+-----------------+
| Variable_name | Valor |
+---------------+-----------------+
| have_openssl | Discapacitado |
| have_ssl | Discapacitado |
| SSL_CA | |
| ssl_capath | |
| SSL_CERT | |
| ssl_cipher | |
| SSL_CRL | |
| ssl_crlpath | |
| SSL_KEY | |
+---------------+-----------------+
9 filas en el set (0.53 segundos)

La salida anterior muestra que MySQL no admite el cifrado en tránsito para la sesión actual.

Use OpenSSL para crear certificado y claves SSL

Para proporcionar cifrado en tránsito, MySQL requiere certificados X509 del lado del cliente y del lado del cliente firmados por la autoridad de certificado para validar la propiedad del dominio. Generaremos certificados autofirmados, así como certificados del servidor y del lado del cliente a través de la utilidad de línea de comandos OpenSSL. Es una herramienta de biblioteca OpenSSL que genera claves privadas, crea solicitudes de certificado X509, las firma como CA y las verifica.

Antes de comenzar, cree un directorio para almacenar todos los archivos:

ubuntu@ubuntu: ~ $ mkdir/var/lib/mysql/Transit
ubuntu@ubuntu: ~ $ cd/var/lib/mysql/tranit

El siguiente conjunto de comandos generará varias indicaciones que deben tener respuestas no vacías.

Clave de autoridad de certificado y generación de certificados

La creación de un certificado autofirmado requiere un certificado de autoridad de certificado (CA) a través de un archivo de clave privada. Use el comando OpenSSL para generar la clave privada RSA 2048 bits para la CA.

ubuntu@ubuntu: ~ $ OpenSsl Genrsa 2048> CA-Key.pem

Use la clave anterior con un comando OpenSSL REQ para generar un certificado para su propia CA con un vencimiento de 3000 días.

ubuntu@ubuntu: ~ $ openssl req -new -x509 -nodes -days 3000 -Key ca -key.PEM -Out CA.pem

Los comandos de arriba crean nuevos archivos CA-Key.PEM y CA.PEM para auto-firmar los certificados X509 del servidor MySQL y el cliente.

Generar certificado de clave privada y autofirmado para MySQL Server

Use OpenSSL para generar la tecla RSA del servidor MySQL y la solicitud de firma de certificado (CSR):

Ubuntu@ubuntu: ~ $ OpenSSL Genrsa 2048> Clave de servidor.pem
ubuntu@ubuntu: ~ $ openssl req -new -key servidor -key.PEM -Out Server -Req.pem

Ahora, elimine la frase de pases de la clave del servidor:

ubuntu@ubuntu: ~ $ openssl rsa -in servidor -key.PEM -Out Server -Key.pem

Genere el certificado autofirmado por el servidor MySQL desde la solicitud de certificado utilizando la clave y certificado privado de CA.

ubuntu@ubuntu: ~ $ openssl x509 -req -in server -req.PEM -Days 3600 -CA CA.PEM -Ca -Key.PEM -set_Serial 01 -Out Server -Cert.pem

Ahora, la configuración SSL para MySQL no requiere CSR.

Generar la clave del cliente y el certificado autofirmado

Del mismo modo, genere la solicitud de clave y certificado para el cliente.

ubuntu@ubuntu: ~ $ openssl req -newkey rsa: 2048 -days 3600 -nodes -keyout cliente -llave.PEM -Out Client -Req.pem

Elimine la frase de pases de la clave y genere un certificado de cliente a partir de la solicitud de certificado utilizando los archivos CA.

ubuntu@ubuntu: ~ $ openssl rsa -in cliente -clave.PEM -Out Client -Key.pem
ubuntu@ubuntu: ~ $ openssl x509 -req -in client -req.PEM -Days 365000 -CA CA.PEM -Ca -Key.PEM -set_Serial 01 -Out Cliente -Cert.pem

El servidor solo aceptará conexiones remotas de los clientes con estos archivos.

Por último, verifique los certificados del cliente y del lado del servidor contra el certificado de CA.

ubuntu@ubuntu: ~ $ openssl verify -cafile ca.CERT DEL SERVER PEM.CERT DEL CLIENTE PEM.pem
servidor.PEM: OK
alabar al cliente.PEM: OK

El valor de OK indica que los certificados se generaron correctamente y están listos para usar.

Configuración del servidor MySQL

Para habilitar el servicio TLS/SSL para el servidor MySQL requiere establecer una serie de variables del sistema dentro del archivo de configuración principal de MySQL mysqld.confusión, como:

  • Usar ssl_cert y ssl_key Para establecer la ruta al certificado del servidor y la clave privada.
  • Utilizar el SSL_CA variable para establecer la ruta al certificado de la CA en el lado del servidor.

Use su editor favorito para editar el archivo de configuración ubicado dentro /etc/mysql/mysql.confusión.d directorio.

ubuntu@ubuntu: ~ $ vim/etc/mysql/mysql.confusión.d/mysqld.CNF
[mysqld]
ssl_ca =/var/lib/mysql/new_certs/ca.pem
ssl_cert =/var/lib/mysql/new_certs/Server-Cert.pem
ssl_key =/var/lib/mysql/new_certs/Server-Key.pem

Por último, cambiar las claves SSL y la propiedad de certificados, y los permisos.

ubuntu@ubuntu: ~ $ chown -r mysql: mysql/var/lib/mysql/new_certs/
Ubuntu@ubuntu: ~ $ chmod 600 Client-Key.PEM Server-Key.PEM CA-Key.pem

Reiniciar la base de datos para cargar cambios recientes.

ubuntu@ubuntu: ~ $ sudo servicio mysql reiniciar

Inicie sesión en el servidor después de reiniciar y verifique el estado actual de la sesión MySQL SSL.

Configuración del lado del cliente

Establecer una conexión remota segura del cliente requiere la transferencia de los archivos de certificado OpenSSL generados por el cliente generados anteriormente. Cree un nuevo directorio y use la utilidad SCP para la transferencia de archivos seguro.

ubuntu@ubuntu: ~ $ mkdir ~/cliente-cert
ubuntu@ubuntu: ~ $ scp user@[ip_address]:/var/lib/mysql/transit/ca-cert.PEM ~/CLIENTE-CERT/
ubuntu@ubuntu: ~ $ scp user@[ip_address]:/var/lib/mysql/transit/client-cert.PEM ~/CLIENTE-CERT/
ubuntu@ubuntu: ~ $ scp user@[ip_address]:/var/lib/mysql/transit/client-key.PEM ~/CLIENTE-CERT/

Al establecer una conexión remota cifrada, el cliente ahora requiere agregar opciones del lado del cliente que verifican las claves y certificados del lado del cliente. Las opciones incluidas son similares a las variables del sistema del lado del servidor pero el -ssl-key y -SSL-CERT Opciones Identificar rutas a la clave y certificado privado del cliente. Utilizar el -SSL-CA Opción para agregar la ruta al certificado CA. Este archivo debe ser el mismo que el certificado CA del lado del servidor.

Utilice el siguiente comando con todas las opciones requeridas para establecer una conexión remota segura con el servidor de base de datos MySQL.

ubuntu@ubuntu: ~ $ mysql -u user -p -h --SSL-CA = ~/Client-Cert/CA.PEM--SSL-CERT = ~/Client-CERT/Client-CERT.PEM--SSL-Key = Under ~/Client-Cert/Client-Key.pem

Configurar conexiones cifradas obligatorias

Para algunos servidores MySQL, no solo se requiere que el cliente se conecte con el servidor a través de una conexión cifrada, pero es obligatorio. MySQL permite al administrador del servidor configurar conexiones encriptadas obligatorias. Es posible colocando tres niveles diferentes de control:

  • Configure MySQL que requiere que el cliente acceda a la base de datos solo a través de una conexión cifrada.
  • Invocar programas de clientes para necesitar una conexión encriptada, incluso si MySQL lo permite, pero no necesariamente requiere uno.
  • Configurar cuentas de usuario específicas para acceder a la base de datos solo en un canal encriptado.

Detalle a cada uno de ellos:

require_secure_transport

Para garantizar que los clientes utilizan una conexión encriptada, habilite el require_secure_transport variable en el archivo de configuración mysql ubicado en/etc/mysql/mysql.CNF.D Directorio:

ubuntu@ubuntu: ~ $ sudo vim/etc/mysql/mysql.confusión.d/mysqld.CNF
[mysqld]
require_secure_transport = on

La variable del sistema anterior garantiza que el cliente use transporte seguro para conectarse con el servidor, y el servidor solo permite conexiones TCP a través de SSL. Por lo tanto, el servidor rechaza cualquier solicitud de conexión del cliente sin un transporte seguro y devuelve una salida de error de ER_SECURE_TRANSPORT_REQUIRADO al programa del cliente.

Además, la configuración del servidor anterior también deshabilita la conexión remota del cliente al servidor con un -ssl-mode = discapacitado cadena.

Invocar el programa de clientes

Este nivel de control permite invocar el programa del cliente para configurar una comunicación cifrada segura, independientemente de la configuración del servidor. Es decir, incluso si el servidor no está configurado para establecer obligatorio un transporte SSL/TLS, puede mantener una conexión segura con el deseo del cliente.

Es posible mediante el uso de un -modo SSL Opción disponible en MySQL 5.7.11 junto con sus diversos valores. Es útil especificar el estado de seguridad deseado de la conexión del cliente al servidor. Los valores de opción se aplican en función del nivel creciente de rigor.

  • DESACTIVADO: el valor estableció una conexión insegura.
  • PRIVILEGIADO: El modo es similar a cuando no se especifica tal opción de modo -ssl. Establece el cifrado solo si el servidor lo admite de otra manera, vuelve a la conexión predeterminada sin cifrar.
  • REQUERIDO: El valor garantiza una comunicación cifrada si el servidor está habilitado para admitir uno. El cliente falla el intento de conexión si MySQL no admite TLS/SSL.
  • Verify_ca: las funciones de valor similares a REQUERIDO, Pero además, también verifica el certificado CA del servidor. El cliente no se conecta en caso de que no hay certificados de coincidencia válidos.
  • Verify_identity: Similar a Verify_ca, Pero para una versión de OpenSSL 1.0.2+, los clientes también pueden verificar el nombre de host que usan para conectarse con la identidad en el certificado de servidor. La conexión se rompe en el caso de un desajuste.

Sin embargo, es importante tener en cuenta que la verificación del nombre de host no funciona para certificados autofirmados. Estos incluyen certificados generados automáticamente por el servidor o creados manualmente a través de la herramienta mysql_ssl_rsa_setup.

Además del cifrado predeterminado, MySQL permite al cliente incluir configuraciones de seguridad adicionales al proporcionar un certificado de CA, igual que el servidor y habilitar la verificación de identidad del nombre de host. Estas configuraciones permiten a ambas partes confiar en una entidad común, y el cliente puede verificar que se conecte al host correcto.

Ahora entendemos cómo interactúa el modo anterior con las opciones de certificado de CA:

  • Especifique el certificado CA con la opción -ssl -ca con -ssl -mode = verify_ca.
  • Habilitar la verificación de identidad del nombre de host usando -ssl -mode = verify_identity
  • un valor de modo -ssl que no sea verify_identity o verify_ca con -ssl-ca generará una advertencia que indique la no verificación del certificado del servidor.

Configurar cuentas de usuario

Para habilitar la comunicación cifrada por el cliente, configure una cuenta de usuario específica para acceder al servidor MySQL a través de SSL. Crear una cuenta de usuario CREAR USUARIO con el REQUERIR declaración de cláusula. O usa el Alterar el usuario Declaración para agregar la cláusula requerir. Este control termina los intentos de conexión del cliente al servidor si no admite una conexión encriptada.

La cláusula Request es útil para ejecutar una configuración relacionada con el cifrado que aplica requisitos de seguridad estrictos. Permite especificar uno o más de uno tls_option valor.

Entremos en el detalle de las opciones de comando requeridas de los clientes que están configurados con varios valores requeridos:

NINGUNO: no requiere una conexión SSL
SSL: El servidor solo permite una conexión encriptada desde cuentas habilitadas para SSL.
X509: requiere que el cliente presente la clave privada y el certificado. Este valor no requiere la necesidad de mostrar el certificado de CA, el sujeto y el emisor.

La cláusula especifica las características de cifrado requeridas de manera que no hay necesidad de incluir la opción SSL.

MySQL> Crear usuario 'usuario'@'localhost' requiere x509;

Ahora, el cliente necesita especificar las opciones -ssl -key y -ssl -cert para conectarse, mientras que -ssl -ca no es necesario (esto también se aplica para el editor y sujeto valores).

ubuntu@ubuntu: ~ $ mysql -u user -p -h --ssl-cert = cliente-cert.PEM--SSL-Key = Client-Key.pem

EDITOR: La cuenta creada con la declaración del emisor requerir, requiere que el cliente especifique las opciones -ssl -key y -ssl -cert con un certificado válido emitido por el 'emisor' de CA. Cree la cuenta de usuario de la siguiente manera:

mySQL> Crear usuario 'usuario'@'localhost' requiere emisor '/c = SE/ST = Estocolmo/L = Estocolmo/O = MySQL/CN = CA/CORREA ELECTRADO = [email protected] ';

Si el certificado es válido con un emisor diferente, el intento de conexión falla.

SUJETO: requiere que el cliente presente el certificado con un sujeto valor proporcionado al crear su cuenta. Una conexión con un certificado válido pero un resultado diferente en las terminaciones de conexión.

MySQL> Crear usuario 'Usuario'@'localhost' requerir sujeto '/c = SE/ST = Estocolmo/L = Estocolmo/O = MySQL Certificado de Cliente Demo/CN = Client/CageAdDress = [email protected] ';

CIFRAR: La cuenta creada con el estado requiere que el cliente incluya el método de cifrado utilizado para cifrar la comunicación. Es necesario asegurarse de que los cifrados y las longitudes de la llave sean lo suficientemente fuertes.

MySQL> Crear usuario 'usuario'@'localhost' requiere cifrado 'EDH-RSA-des-CBC3-SHA';

Conclusión

El artículo ilustra cómo asegurar la comunicación entre el servidor MySQL y los clientes al habilitar el protocolo SSL. Aprendemos a crear un certificado autofirmado manual a medida que confiamos en el host en la red. También aplicamos cifrado en tránsito para la comunicación del servidor MySQL fuera de la red y aprendemos formas de configurar el servidor para los requisitos de cifrado obligatorios.