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%';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:
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:
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.
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:
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.