LinuxParty
yo estoy buscando configurar MariaDB SSL / TLS (Capa de sockets seguros) y conexiones seguras desde el cliente MySQL y la aplicación PHP / Python. ¿Cómo habilito SSL para el servidor y el cliente MariaDB que se ejecutan en Linux o un sistema similar a Unix?
En este tutorial, aprenderemos a configurar el servidor MariaDB con TLS / SSL para establecer conexiones seguras desde la consola y los scripts PHP / Python. Esto no es necesario si se hace con el protolo HTTPS, es sólo para usar Scripts que se conectan con MariaDB sin protolo WEB.
Cómo configurar MariaDB SSL / TLS
Probé estas instrucciones en RHEL / CentOS 7/8, Debian 9/10, Ubuntu 16.04 / 18.04 / 18.04 LTS, Arch Linux y FreeBSD. Sin embargo, también debería funcionar en otras distribuciones de Linux.
Paso 1 - Instale MariaDB
Escriba el comando según su variante de Linux o Unix.
Ubuntu / Debian Linux Instalar servidor / cliente MariaDB
Escriba el siguiente comando apt-get o apt:
$ sudo apt-get install mariadb-server mariadb-client
CentOS / RHEL / Fedora Linux Instalar servidor / cliente MariaDB
Escriba el siguiente comando yum:
$ sudo yum install mariadb-server mariadb
El usuario de Fedora Linux escribe el siguiente comando dnf:
$ sudo dnf install mariadb-server mariadb
Instale el servidor / cliente MariaDB en Arch Linux
Escriba el siguiente comando de pacman:
$ sudo pacman -S mariadb
FreeBSD Unix Instalar el servidor / cliente MariaDB
Para instalar el puerto, ejecute:
# cd /usr/ports/databases/mariadb100-server/ && make install clean
# cd /usr/ports/databases/mariadb100-client/ && make install clean
Para agregar el paquete binario, ingrese:
# pkg install mariadb100-server mariadb100-client
Instalación de Alpine Linux MariaDB
Utilice el comando apk:
# apk add mysql mysql-client
# mysql_install_db --user=mysql --datadir=/var/lib/mysql
# rc-update add mariadb
# rc-service mariadb start
# mysqladmin -u root password 'my-password-here'
Paso 2 - Asegure MariaDB
Escriba el siguiente comando:
$ mysql_secure_installation
Paso 3: cree el certificado de CA (TLS / SSL)
Cree un directorio llamado ssl en el directorio / etc / mysql / usando el comando mkdir:
$ cd /etc/mysql
$ sudo mkdir ssl
$ cd ssl
Nota: El valor de Nombre común utilizado para el servidor y los certificados / claves de cliente deben diferir del valor de Nombre común utilizado para el certificado de CA. Para evitar problemas, los configuro de la siguiente manera. De lo contrario, obtendrá la verificación de la certificación falló error. Por lo tanto, configúrelo de la siguiente manera:
Nombre común de CA: Administrador de MariaDB
Nombre común del servidor: Servidor MariaDB
Nombre común del cliente: Cliente MariaDB
Escriba el siguiente comando para crear una nueva clave de CA:
$ sudo openssl genrsa 2048 > ca-key.pem
O
$ sudo openssl genrsa 4096 > ca-key.pem
Escriba el siguiente comando para generar el certificado con esa clave:
$ sudo openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
Ahora debe tener dos archivos de la siguiente manera:
- /etc/mysql/ssl/ca-cert.pem - Archivo de certificado para la Autoridad de certificación (CA).
- /etc/mysql/ssl/ca-key.pem - Archivo de claves para la autoridad de certificación (CA).
Voy a utilizar ambos archivos para generar los certificados de servidor y cliente.
Paso 4: crea el certificado SSL del servidor
Para crear la clave del servidor, ejecute:
$ sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout server-key.pem -out server-req.pem
Luego procese la clave RSA del servidor, ingrese:
$ sudo openssl rsa -in server-key.pem -out server-key.pem
Resultados de muestra:
writing RSA key
Finalmente firme el certificado del servidor, ejecute:
$ sudo openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Resultados de muestra:
Signature ok subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=MariaDB server Getting CA Private Key
Ahora debes tener archivos adicionales:
- /etc/mysql/ssl/server-cert.pem - Archivo de certificado del servidor MariaDB.
- /etc/mysql/ssl/server-key.pem - Archivo de claves del servidor MariaDB.
Debe utilizar los dos archivos anteriores en el servidor MariaDB y en cualquier otro nodo que vaya a utilizar para el tráfico de clúster / replicación. Estos dos archivos protegerán la comunicación del lado del servidor.
Paso 5: cree el certificado TLS / SSL del cliente
El cliente mysql, la aplicación PHP / Python / Perl / Ruby usará el certificado del cliente para asegurar la conectividad del lado del cliente. Debe instalar los siguientes archivos en todos sus clientes, incluido el servidor web. Para crear la clave de cliente, ejecute:
$ sudo openssl req -newkey rsa:2048 -days 365000 -nodes -keyout client-key.pem -out client-req.pem
A continuación, procese la clave RSA del cliente, ingrese:
$ sudo openssl rsa -in client-key.pem -out client-key.pem
writing RSA key
Finalmente, firme el certificado del cliente, ejecute:
$ sudo openssl x509 -req -in client-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Resultados de muestra:
Signature ok subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd/CN=MariaDB client Getting CA Private Key
Paso 6: ¿Cómo verifico los certificados?
Escriba el siguiente comando para verificar los certificados y asegurarse de que todo se haya creado correctamente:
$ openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
Resultados de muestra:
server-cert.pem: OK client-cert.pem: OK
No debería haber ningún error y debe obtener una respuesta correcta para los certificados del servidor y del cliente.
Paso 7: configurar el servidor MariaDB para usar SSL
Edite vi /etc/mysql/mariadb.conf.d/50-server.cnf o /etc/mysql/mariadb.cnf de la siguiente manera:
$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
Agregar / editar en [mysqld] como sigue:
### MySQL Server ### ## Securing the Database with ssl option and certificates ## ## There is no control over the protocol level used. ## ## mariadb will use TLSv1.0 or better. ## #ssl ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem ## Set up TLS version here. For example TLS version 1.2 and 1.3 ## tls_version = TLSv1.2,TLSv1.3
Guarde y cierre el archivo. Proteja las claves usando el comando chmod / comando chown:
## Assuming that mariadb (mysqld) server started by the mysql user ##
$ sudo chown -Rv mysql:root /etc/mysql/ssl/changed ownership of '/etc/mysql/ssl/server-key.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/client-req.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/server-req.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/ca-key.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/server-cert.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/client-cert.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/ca-cert.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/client-key.pem' from root:root to mysql:root changed ownership of '/etc/mysql/ssl/' from root:root to mysql:root
Puede reiniciar mariadb de la siguiente manera:
$ sudo /etc/init.d/mysql restart
Para la distribución de Linux basada en systemd, use el comando systemctl:
$ sudo systemctl restart mysql
Asegúrese de que no se informe ningún error ssl. Aquí hay una forma simple de verificar que usando el comando grep $ sudo grep ssl /var/log/syslog
$ sudo grep ssl /var/log/syslog | grep key
$ sudo grep mysqld /var/log/syslog | grep -i ssl
Paso 8: configurar el cliente MariaDB para usar SSL
Configure el cliente MariaDB como 192.168.1.200 para usar SSL (agregue /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf):
$ sudo vi /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
Agregar / editar en [mysql] sección:
## MySQL Client Configuration ## ssl-ca=/etc/mysql/ssl/ca-cert.pem ssl-cert=/etc/mysql/ssl/client-cert.pem ssl-key=/etc/mysql/ssl/client-key.pem ## Force TLS version for client too #tls_version = TLSv1.2,TLSv1.3 ### This option is disabled by default ### ### ssl-verify-server-cert ###
Guarde y cierre el archivo. Debe copiar /etc/mysql/ssl/ca-cert.pem, /etc/mysql/ssl/client-cert.pem y /etc/mysql/ssl/client-key.pem a todos sus clientes. Por ejemplo:
vivek@server: rsync /etc/mysql/ssl/ca-cert.pem /etc/mysql/ssl/client-cert.pem /etc/mysql/ssl/client-key.pem
user@client:/etc/mysql/ssl
Paso 9: verificación
Escriba el comando de comando mysql:
$ mysql -u User-Name-Here -h Server-IP-here -p DB-Name-Here
$ mysql -u root -h 192.168.1.100 -p mysql
$ mysql -u root -h 127.0.0.1 -p mysql
Escriba lo siguiente :
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
Resultado:
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. MariaDB [(none)]> show variables like '%ssl%'; +---------------------+--------------------------------+ | Variable_name | Value | +---------------------+--------------------------------+ | have_openssl | NO | | have_ssl | YES | | ssl_ca | /var/lig/mysql/pki/chain.pem | | ssl_capath | | | ssl_cert | /var/lib/mysql/pki/cert.pem | | ssl_cipher | | | ssl_crl | | | ssl_crlpath | | | ssl_key | /var/lib/mysql/pki/privkey.pem | | version_ssl_library | YaSSL 2.4.4 | +---------------------+--------------------------------+ 10 rows in set (0.001 sec)
O emita el comando de estado:
MariaDB [(none)]> status;
Verifique las conexiones SSL vs TLS. El siguiente comando debería fallar ya que ssl 3 no es compatible y no está configurado para su uso:
$ openssl s_client -connect 192.168.1.100:3306 -ssl3
140510572795544:error:140A90C4:SSL routines:SSL_CTX_new:null ssl method passed:ssl_lib.c:1878:Compruebe TLS v 1 / 1.1 / 1.2:
$ openssl s_client -connect 192.168.1.100:3306 -tls1
$ openssl s_client -connect 192.168.1.100:3306 -tls1_1
$ openssl s_client -connect 192.168.1.100:3306 -tls1_2
Resultados de muestra:
CONNECTED(00000003) --- no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 5 bytes and written 7 bytes --- New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1 Cipher : 0000 Session-ID: Session-ID-ctx: Master-Key: Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None Start Time: 1485335036 Timeout : 7200 (sec) Verify return code: 0 (ok) ---
Cómo leer el archivo de captura de paquetes tcpdump para verificar la comunicación segura
Finalmente, puede usar el analizador de paquetes de comando tcpdump que se ejecuta bajo la línea de comando para buscar en el puerto 3306:
$ sudo tcpdump -i eth0 -s 65535 port 3306 -w /tmp/mysql.pcap
Ahora conéctese desde su aplicación PHP / Python / Perl / Ruby mysql o la aplicación mysql de la consola:
$ mysql -u bar -h 192.168.1.100 -p foo
Utilice tcpdump para verificar que no se intercambie información de texto claro, incluidas las contraseñas, entre el servidor y el cliente de la siguiente manera:
$ tcpdump -r /tmp/mysql.pcap | less
Puede leer el tráfico capturado con tcpdump u otras herramientas como Wireshark.
Paso 10: agregue un usuario al servidor MariaDB
Escriba el siguiente comando:
$ mysql -u root -p
Crea una base de datos llamada foo:
CREATE DATABASE foo;
Agregue un usuario llamado bar para una base de datos llamada foo:
GRANT ALL ON foo.* TO bar@localhost IDENTIFIED BY 'mypassword' REQUIRE SSL;
Otorgue acceso desde el servidor web alojado en 192.168.1.200:
GRANT ALL ON foo.* TO Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo. IDENTIFIED BY 'mypassword' REQUIRE SSL;
Hacer una conexión segura desde bash shell
Puede iniciar sesión desde la consola de la siguiente manera:
$ mysql -u bar -p -h 192.168.1.100 foo
Hacer una conexión segura desde Python
Primero instale la interfaz Python en MySQL:
$ sudo apt-get install python-mysql.connector
O para Python v3.x
$ sudo apt-get install python3-mysql.connector
Aquí hay un código de Python de muestra para conectarse de forma segura mediante SSL:
#!/usr/bin/python import MySQLdb ssl = 'cert': '/etc/mysql/ssl/client-cert.pem', 'key': '/etc/mysql/ssl/client-key.pem' conn = MySQLdb.connect(host='192.168.1.100', user='bar', passwd='mypassword', ssl=ssl) cursor = conn.cursor() cursor.execute("SHOW STATUS LIKE 'Ssl_cipher'") print cursor.fetchone()
O
#!/usr/bin/python # Note (Example is valid for Python v2 and v3) from __future__ import print_function import sys import mysql.connector from mysql.connector.constants import ClientFlag config = { 'user': 'bar', 'password': 'mypassword', 'host': '192.168.1.100', 'client_flags': [ClientFlag.SSL], 'ssl_ca': '/etc/mysql/ssl/ca-cert.pem',
-
MySQL
- Solucionar cuando ''No puedo entrar en mi (nuevo) phpmyadmin''
- Cómo instalar el servidor MySQL en Ubuntu Linux
- Cómo deshabilitar el acceso de inicio de sesión root para PhpMyAdmin
- Cómo configurar MariaDB / MySQL con SSL / TLS
- ERROR 1045: Access denied for user: 'root@localhost' (Using password: YES)
- Error #1045 El servidor MySQL no autorizó su ingreso
- Mytop: una herramienta útil para controlar y monitorizar el rendimiento de MySQL / MariaDB en Linux
- AutoMySQLBackup para crear Backups automáticos en Linux
- Backups tus Bases de Datos MySQL Automáticamente.
- Configurar Servidor MySQL / MariaDB (para alto rendimiento)
- Creando Backups automáticos de MySQL con AutoMySQLBackup en Ubuntu 9.10
- Cómo Establecer una balanceador de Carga de MySQL en Cluster con MySQL 5.1
- Cómo configurar MySQL 5 con balanceo de carga en clúster
- MySQL / Galera permite tener un cluster de servidores MySQL sincronizados.
- Crear copias de seguridad MySQL en Ubuntu con mylvmbackup