Mysql sobre TLS en Ubuntu Top 10.Top 10

Mysql sobre TLS en Ubuntu Top 10.Top 10
Tradicionalmente, su servidor de base de datos y su frontend solían estar en la misma red aislada. Esto permitió a Frontend hablar con la base de datos sobre un canal sin cifrar sin preocupación por la seguridad. Todo esto ha cambiado en los últimos años con el aumento de la nube y los sistemas distribuidos. Sus aplicaciones ya no están limitadas en una sola red aislada. Ahora, más que nunca, la comunicación entre la frontend y la base de datos debe estar encriptada y asegurada.Puede lograr esto utilizando una VPN para virtualizar una red aislada. El frontend y la base de datos pueden ser parte de esta VPN y la comunicación entre ellos se asegurará. O puede usar TLS, para cifrar los datos que se envían hacia y desde la base de datos, de la misma manera que los sitios web aseguran su comunicación con los navegadores utilizando HTTPS. Instalaremos MySQL y lo configuraremos de manera que las consultas y el flujo de datos a través de TLS.

Instalación del servidor MySQL

La guía supone que tiene un servidor reservado para el uso de MySQL con una dirección IP estática accesible, tal vez en la nube o en algún lugar de su red local. Los siguientes comandos, en esta subsección, deben ejecutarse en el shell del servidor. Instalemos y configuremos rápidamente MySQL en Ubuntu.

$ sudo apt actualización
$ sudo apt install mysql-server
$ sudo mysql_secure_installation

El último comando ejecutará un script para cambiar algunos de los valores predeterminados inseguros de MySQL. Primero sería un mensaje para instalar un complemento de validación de contraseña. Esto verificaría si la nueva contraseña que está configurando para los usuarios es lo suficientemente fuerte o no. Puede optar por no participar en este complemento, si lo desea. Después de esto, se le solicitará que establezca contraseña de usuario root de MySQL. Continúe y establezca una contraseña de usuario raíz fuerte.

Presione Y | y para sí, cualquier otra tecla para no: n
Establezca la contraseña para root aquí.
Nueva contraseña:
Re-ingrese nueva contraseña:

Después de esto puedes decir más o menos A cualquier otro mensaje en este script, a medida que el script elimina el usuario de la prueba, elimina la base de datos de prueba, deshabilita el inicio de sesión de raíz remota y finalmente recarga su tabla de privilegios. Una vez hecho esto, ya que hemos rechazado el inicio de sesión de raíz remota, creemos una base de datos y un nuevo usuario que pueda acceder a esa base de datos de forma remota sin tener que tener que ssh (o iniciar sesión) en el Servidor de Unix/Linux Shell. Pero antes de hacer eso, verifiquemos si nuestra construcción de MySQL tiene TLS incorporada o no.

Verificar si TLS está disponible

TLS está disponible en MySQL solo si MySQL está compilado para que se haya integrado en él. No hay un módulo dinámico para cargar. Entonces, si no está seguro de que su paquete MySQL tenga TLS instalado o no, puede verificarlo ejecutando:

$ sudo mysql
MySQL> Mostrar variable 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.00 seg)

Si dice que las variables Have_openssl y have_ssl tener valores establecidos en DESACTIVADO Entonces tienes SSL y estás listo (solo necesitas habilitarlo, leyendo más). Si los valores se establecen en NO, Entonces debe obtener una versión diferente de MySQL de su administrador de paquetes o en otro lugar.

mysql> Salir

Configuración de MySQL

De forma predeterminada, el servidor MySQL solo escucha en la interfaz de Loopback, es decir en la dirección 'localhost' o '127.0.0.1 ', para conexiones remotas, también queremos que escuche en la IP estática pública. Para hacer esto, abra el archivo, /etc/mysql/my.CNF y agregar los siguientes pares de líneas al final.


[mysqld]
require_secure_transport = on
bind-address =

Aquí, reemplaza el con la IP real de su servidor. Si tiene dudas sobre qué IP usar, puede usar 0.0.0.0 para escuchar en todas las interfaces. Ahora reinicie el servidor, para que se realice la nueva configuración.

$ sudo servicio mysql reiniciar

Creación de usuario remoto

Nota: Si desea usar la base de datos en producción, es probable que el cliente que se conecte a esta base de datos, su front -end, tenga una IP estática. Si ese es el caso, reemplace el símbolo de porcentaje '%' con la IP del cliente apropiada. '%' es solo un comodín, que significa 'cualquier valor'. Estaremos configurando nuestro myuser para que pueda iniciar sesión desde cualquier dirección IP (por ejemplo, la dirección IP cambiante de su conexión de banda ancha nacional) que es, posiblemente, insegura.

$ sudo mysql
mySQL> Crear base de datos myDatabase;
MySQL> Crear usuario 'myUser'@'%' identificado por 'contraseña' requiere ssl;
mysql> otorgar todo en mydatabase.* A 'myuser'@'%';

Reemplazar 'contraseña' con una contraseña segura real y tenemos un usuario nombrado myuser que tiene acceso completo a la base de datos mydatabase.

Habilitando TLS (también conocido como 'SSL')

Mientras registra el shell MySQL como el usuario root de MySQL, puede verificar el estado de conexión escribiendo \ s:

mysql> \ s
--------------
mysql ver 14.14 distribuir 5.7.24, para Linux (x86_64) usando editline wrapper
ID de conexión: 5
Base de datos actual:
Usuario actual: root@localhost
SSL: no en uso
Pager actual: Stdout
Usando Outfile: "
Usando delimitador :;
Versión del servidor: 5.7.24-0ubuntu0.18.04.1 (Ubuntu)
Versión del protocolo: 10
Conexión: Localhost a través de Unix Socket

Preste atención a las líneas resaltadas sobre la conexión y SSL. Si bien este estado está bien para un inicio de sesión local del usuario raíz, para cuando iniciamos sesión en TLS como el myuser El tipo de conexión estará sobre TCP/IP, no es un enchufe sin procesar y un cifrado SSL estará en uso. Hay un orden simple para lograr esto. Pero primero salgamos nuestro mensaje mysql.

mysql> Salir

Ahora corre,

$ sudo mysql_ssl_rsa_setup --uid = mysql
$ sudo servicio mysql reiniciar


Una vez hecho esto, puedes mirar el Have_ssl variable de nuevo.

$ sudo mysql
mySQL> mostrar variables como '%ssl%';
+---------------+-----------------+
| Variable_name | Valor |
+---------------+-----------------+
| have_openssl | SÍ |
| have_ssl | SÍ |
| SSL_CA | California.PEM |
| ssl_capath | |
| SSL_CERT | servidor.PEM |
| ssl_cipher | |
| SSL_CRL | |
| ssl_crlpath | |
| SSL_KEY | llave del servidor.PEM |
+---------------+-----------------+
9 filas en el set (0.01 seg)

Iniciar sesión en un cliente mysql separado

Hay nuevos parámetros que indican que el certificado TLS y la clave están en su lugar y TLS está habilitado. Ahora puede iniciar sesión en esta máquina, abrir un cliente MySQL en su computadora local, si no tiene una (y está usando Debian o Ubuntu) obtenga un cliente MySQL Shell:

$ sudo apt install mysql-client
$ mysql -u myuser -p -h

Reemplace la myuser y Con su nombre de usuario y IP de servidor real, ingrese la contraseña elegida y debe iniciarse sesión en la base de datos. Verifique la conexión:

mysql> \ s
--------------
mysql ver 14.14 distribuir 5.7.24, para Linux (x86_64) usando editline wrapper
ID de conexión: 5
Base de datos actual:
Usuario actual: remoto_user@yourLocalip
SSL: el cifrado en el uso es DHE-RSA-AES256-SHA
Pager actual: Stdout
Usando Outfile: "
Usando delimitador :;
Versión del servidor: 5.7.24-0ubuntu0.18.04.1 (Ubuntu)
Versión del protocolo: 10
Conexión: a través de TCP/IP
Caracteres del servidor: Latin1
DB personajes: Latin1
Caracteres del cliente: UTF8
Conn. personaje: UTF8
Puerto TCP: 3306
Tiempo de actividad: 13 min 52 segundos
Hilos: 2 Preguntas: 32 Consultas lentas: 0 abre: 107 Tablas de descarga: 1
Tablas abiertas: 100 consultas por segundo AVG: 0.038
--------------

Puede ver que ahora está usando RSA para cifrar su tráfico y la conexión es una IP específica sobre TCP/IP. Ahora, su conexión con esta base de datos MySQL es segura.

Conclusión

Esta es la forma más sencilla de asegurar sus conexiones MySQL remotas con TLS. Tenga en cuenta que esto no es lo mismo que asegurar un cliente de Phpmyadmin sobre TLS. Eso es TLS y HTTP combinados, y requiere que asegure la interfaz web. La conexión entre el PhPMyadmin, que hace que su interfaz de usuario web, y la base de datos aún no esté cifrada, lo que está bien siempre que estén en el mismo servidor.

Puede obtener más información sobre la conexión TLS, CAS subyacente, certificados y gestión de claves en los documentos oficiales de MySQL.