LinuxParty

NUESTRO SITIO necesita la publicidad para costear hosting y el dominio. Por favor considera deshabilitar tu AdBlock en nuestro sitio. También puedes hacernos una donación entrando en linuxparty.es, en la columna de la derecha.
Inicio desactivadoInicio desactivadoInicio desactivadoInicio desactivadoInicio desactivado
 

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:

  1. /etc/mysql/ssl/ca-cert.pem - Archivo de certificado para la Autoridad de certificación (CA).
  2. /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:

  1. /etc/mysql/ssl/server-cert.pem - Archivo de certificado del servidor MariaDB.
  2. /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',

 

Pin It

Escribir un comentario


Código de seguridad
Refescar



Redes:



 

Suscribete / Newsletter

Suscribete a nuestras Newsletter y periódicamente recibirás un resumen de las noticias publicadas.

Donar a LinuxParty

Probablemente te niegues, pero.. ¿Podrías ayudarnos con una donación?


Tutorial de Linux

Filtro por Categorías