Anuncios

Bienvenidos sean a este post, hoy veremos como conectarnos a traves de SSL.

Anuncios

Si bien mariadb soporta SSL no siempre esta activo, para poder usarlo debe ser compilado con yaSSL u OpenSSL, por lo general los paquetes binarios ya viene compilados con yaSSL, una manera muy practica de verificar si esta presente es a traves de have_ssl, veamos los valores posibles:

  • YES, significa que esta instalado y activado
  • DISABLED, significa que esta instalado pero no activado
  • NO, significa que no esta instalado
Anuncios

Por lo general de manera predeterminada se encuentra instalado pero no activado, una forma de verificarlo es mediante el siguiente comando:

MariaDB [(none)]> select @@global.have_ssl;
+-------------------+
| @@global.have_ssl |
+-------------------+
| DISABLED          |
+-------------------+
1 row in set (0.000 sec)

MariaDB [(none)]>
Anuncios

Ahora vamos a pasar a ver como habilitar la conexion suponiendo que esten en estado DISABLED, para comenzar vamos a crear los certificados, vamos a crear un nuevo directorio llamado certs, dentro de esta vamos a ejecutar el siguiente comando:

Anuncios
Nota: 
Todo esto deben hacerlo con root o como yo con sudo. 
Anuncios
tinchicus@dbn001vrt:~/certs$ sudo openssl genrsa 2048 > ca-clave.pem
Anuncios

Esto nos genera una nueva clave, una vez realizado vamos a ejecutar el siguiente comando:

$ sudo openssl req -new -x509 -nodes -days 3600 -key ca-clave.pem -out ca-cert.pem
Anuncios

Este comando lo usaremos para crear el certificado CA, una vez ejecutado nos aparecera el siguiente mensaje:

tinchicus@dbn001vrt:~/certs$ sudo openssl req -new -x509 -nodes -days 3600 -key ca-clave.pem -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
Anuncios

Aqui debemos pasar el pais desde donde lo crearan, en este caso pide los dos caracteres que identifican a tu pais, por ejemplo:

  • AR, Argentina
  • BR, Brasil
  • UY, Uruguay
  • ES, España
Anuncios

Estos son solo algunos de ejemplo, sino quieren pasarlo simplemente pongan un punto (.) y lo dejara en blanco, luego tenemos las siguientes lineas:

  • State or Province Name (full name) [Some-State], aqui deben ingresar la provincia o estado donde vivan
  • Locality Name (eg, city) [], el nombre de la ciudad o pueblo
  • Organization Name (eg, company) [Internet Widgits Pty Ltd], ingresen el nombre de la compañia
  • Organizational Unit Name (eg, section) [], el nombre de la seccion que administra los certificados
  • Common Name (e.g. server FQDN or YOUR name) [], un nombre identificador
  • Email Address [], una direccion de correo
Anuncios

El dato que es mas obligatorio completar es Common Name, asignen un nombre que puede ser el servidor, el de ustedes, o un alias por ejemplo yo use tinchicus, ya veremos porque es importante, una vez completado los datos se procede a crear el certificado y si pedimos un listado de los archivos nos quedara de la siguiente manera:

tinchicus@dbn001vrt:~/certs$ ls -l
total 8
-rw-r--r-- 1 root      root      1302 ago 27 07:52 ca-cert.pem
-rw-r--r-- 1 tinchicus tinchicus 1675 ago 27 07:50 ca-clave.pem
tinchicus@dbn001vrt:~/certs$
Anuncios

Con nuestros certificados creados podemos proceder a crear los certficados para el servidor y el cliente, el primero sera para el servidor, ejecutemos el siguiente comando:

$ sudo openssl req -newkey rsa:2048 -days 3600 -nodes -keyout clave-server.pem -out req-server.pem
Anuncios

Esto nos volvera a pedir los mismos datos que utilizamos para crear los certificados, pueden omitir todos los datos salvo el Common Name y ahi les recomiendo utilizar la palabra servidor para que se diferencie del anterior y ya veremos porque mas adelante, despues de esto y de agregar (o no) la direccion de correcto nos preguntara la siguiente:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
Anuncios

Aqui nos pide una contraseña para poder acceder al certificado, se puede dejar en blanco, y por ultimo nos permite ingresar un nombre de compañia opcional, con todo esto nos genero dos archivos, uno de tipo clave (clave-server.pem) y otro de tipo req (req-server.pem), con estos dos archivos creados vamos a ejecutar el siguiente comando:

$ sudo openssl rsa -in clave-server.pem -out clave-server.pem
Anuncios

Con esto generamos la clave RSA, ahora vamos a ejecutar el siguiente comando:

$ sudo openssl x509 -req -in req-server.pem -days 3600 -CA ca-cert.pem -CAkey ca-clave.pem -set_serial 01 -out cert-server.pem
Anuncios

Con todo esto generamos el certificado que sera publico, cert-server.pem, y anteriormente hemos generado la clave privada, clave-server.pem, con estos dos archivos generados para el servidor pasemos a los certificados del cliente, para ello primero ejecutaremos los siguientes comandos:

$ sudo openssl req -newkey rsa:2048 -days 3600 -nodes -keyout clave-cliente.pem -out req-cliente.pem
Anuncios
Nota: 
Cuando pida el ingreso de Common Name utilicen cliente o cualquier otro distinto a los anteriores.
Anuncios
$ sudo openssl rsa -in clave-cliente.pem -out clave-cliente.pem
Anuncios
$ sudo openssl x509 -req -in req-cliente.pem -days 3600 -CA ca-cert.pem -CAkey ca-clave.pem -set_serial 01 -out cert-cliente.pem
Anuncios

Observen que es exactamente lo mismo que lo anterior pero variamos los nombres unicamente para identificar que son del cliente en lugar del servidor, al igual que en el caso anterior generamos la clave privada (clave-cliente.pem) y la clave publica (cert-cliente.pem), en caso de trabajar con Debian dirijanse a /etc/ssl y agreguen un nuevo directorio llamado mariadb, una vez creado vamos a mover o copiar los archivos creados anteriormente a este nuevo directorio:

Anuncios
Nota: 
Recuerden hacerlo con root o como en mi caso con sudo
Anuncios
  • ca-cert.pem
  • ca-clave.pem
  • cert-server.pem
  • clave-server.pem
  • cert-cliente.pem
  • clave-cliente.pem
  • req-cliente.pem
  • req-server.pem
Anuncios

Con todo esto realizado nos deberia quedar de la siguiente forma:

tinchicus@dbn001vrt:~/certs$ ls -l /etc/ssl/mariadb/
total 32
-rw-r--r-- 1 root root 1302 ago 27 07:59 ca-cert.pem
-rw-r--r-- 1 root root 1675 ago 27 07:59 ca-clave.pem
-rw-r--r-- 1 root root 1151 ago 27 07:59 cert-cliente.pem
-rw-r--r-- 1 root root 1151 ago 27 07:59 cert-server.pem
-rw------- 1 root root 1675 ago 27 07:59 clave-cliente.pem
-rw------- 1 root root 1675 ago 27 07:59 clave-server.pem
-rw-r--r-- 1 root root 1021 ago 27 07:59 req-cliente.pem
-rw-r--r-- 1 root root 1025 ago 27 07:59 req-server.pem
tinchicus@dbn001vrt:~/certs$
Anuncios

Una vez hecho cambien la ubicacion de la terminal a /etc/ssl/mariadb/ (no hace falta ser root) y desde ahi ejecutaremos el siguiente comando:

$ openssl verify -CAfile ca-cert.pem cert-server.pem cert-cliente.pem
Anuncios

Este comando si todo lo anterior lo hicimos correctamente nos debera devolver la siguiente salida:

tinchicus@dbn001vrt:/etc/ssl/mariadb$ openssl verify -CAfile ca-cert.pem cert-server.pem cert-cliente.pem 
cert-server.pem: OK
cert-cliente.pem: OK
tinchicus@dbn001vrt:/etc/ssl/mariadb$
Anuncios

Esto nos indica que los certificados se crearon correctamente, si recuerdan les recomende utilizar distintos nombres para Common Name, esto es debido a que cada certificado no pueden tener el mismo nombre y en caso de haber pasado siempre el mismo nombre o ninguno nos hubiera devuelto lo siguiente al momento de verificarlo:

error 18 at 0 depth lookup: self signed certificate
Anuncios

Con nuestros tres certificados creados y verificados podemos pasar a ver como configurar a mariadb para que los utilice, pero antes debemos ejecutar desde fuera de este directorio el siguiente comando:

$ sudo chown -R mysql:mysql /etc/ssl/mariadb/
Anuncios

Este cambiara los propietarios en el directorio para que pueda ser accedido por el usuario que ejecuta al daemon de mysql (mariadb), con esto realizado ahora si podemos pasar al primer paso en la modificacion para habilitar el ssl en el servidor, y para ello primero iremos a este archivo:

/etc/mysql/mariadb.conf.d/50-server.conf
Anuncios
Nota: 
Esta es la ubicacion para un debian.
Anuncios

En el archivo debemos buscar la etiqueta [mysqld] y agregaremos las siguientes tres lineas:

ssl-ca=/etc/ssl/mariadb/ca-cert.pem
ssl-cert=/etc/ssl/mariadb/cert-server.pem
ssl-key=/etc/ssl/mariadb/clave-server.pem
Anuncios

Con esto le informaremos donde estan nuestro archivos de certificados, con esto solamente ya tenemos habilitados los certificados pero nos falta un solo paso para habilitarlo definitivamente:

$ sudo systemctl restart mysql
Anuncios

Con esto reiniciaremos a nuestro daemon y por lo tanto tomara efecto el uso de ssl veamos si se habilito:

MariaDB [(none)]> select @@global.have_ssl;
+-------------------+
| @@global.have_ssl |
+-------------------+
| YES               |
+-------------------+
1 row in set (0.001 sec)

MariaDB [(none)]>
Anuncios

Con esto ya tenemos a nuestro servidor habilitado pero todavia nos falta nuestro cliente y para ello debemos utilizar dos archivos:

  • cert-cliente.pem
  • clave-cliente.pem
Anuncios

Esto les recomiendo copiarlo en un lugar donde el usuario tenga permisos, por ejemplo en el home del usuario dentro de una carpeta especifica, vamos a hacer un ejemplo dentro del home y vamos a crear un directorio llamado .mariadb-certs:

tinchicus@dbn001vrt:~$ mkdir .mariadb-certs
Anuncios

Con nuestro nuevo directorio pueden copiar los dos archivos antes citados desde la ubicacion /etc/ssl/mariadb:

$ sudo cp /etc/ssl/mariadb/*-cliente.pem ~/.mariadb-certs/
Anuncios

En este caso copiamos los archivos antes mencionados y uno mas pero que no nos molesta:

tinchicus@dbn001vrt:~$ ls -l .mariadb-certs/
total 12
-rw-r--r-- 1 tinchicus tinchicus 1151 ago 27 10:53 cert-cliente.pem
-rw------- 1 root      root      1675 ago 27 10:53 clave-cliente.pem
-rw-r--r-- 1 tinchicus tinchicus 1021 ago 27 10:53 req-cliente.pem
tinchicus@dbn001vrt:~$
Anuncios

Como pueden observar dos de los archivos se modifico el propietario al del home con el faltante debemos hacer lo siguiente:

$ sudo chown tinchicus:tinchicus .mariadb-certs/clave-cliente.pem
Anuncios
Nota: 
Si no se cambio el propietario automaticamente deben hacer el paso anterior con los otros archivos.
Anuncios

Con los tres archivos copiados y con el propietario establecido con nuestro usuario, vamos a crear un nuevo archivo llamado .my.cnf:

$ nano .my.cnf
Anuncios

Dentro de este archivo agregaremos el siguiente codigo:

[client]

ssl-cert=/home/tinchicus/.mariadb-certs/cert-cliente.pem
ssl-key=/home/tinchicus/.mariadb-certs/clave-cliente.pem
Anuncios

Estas lineas establecen la ubicacion de los certificados para poder utilizar SSL contra el servidor, manejarlo de esta forma nos permite tenerlo de una forma mas individual y en caso de que otro usuario necesite acceder a la base podemos usar los mismos pasos para configurarlo sin afectar a este, con todo esto tenemos ya habilitado tanto el servidor como el cliente, vamos a crear un usuario para verificar su funcionamiento:

MariaDB [(none)]> create user
    -> user03@localhost identified by 'clave'
    -> require SSL;
Anuncios

Con esto creamos un nuevo usuario, con una contraseña (obligatorio) y por ultimo usamos a REQUIRE para pasarle que use SSL, por ultimo le estableceremos unos permisos para el usuario:

MariaDB [(none)]> grant select on base1.* to user03@localhost;
Anuncios

Con este comando le concedemos permisos de lectura a nuestro usuario en todas las tablas de la base1, con todo esto realizado prueben de ingresar con el usuario y ejecutemos el siguiente comando:

MariaDB [(none)]> status;
--------------
mariadb  Ver 15.1 Distrib 10.3.29-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

Connection id:		42
Current database:	
Current user:		user03@localhost
SSL:			Cipher in use is DHE-RSA-AES256-SHA
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server:			MariaDB
Server version:		10.3.29-MariaDB-0+deb10u1-log Debian 10
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
UNIX socket:		/var/run/mysqld/mysqld.sock
Uptime:			56 min 2 sec

Threads: 6  Questions: 79  Slow queries: 4  Opens: 33  Flush tables: 1  Open tables: 26  Queries per second avg: 0.023
--------------

MariaDB [(none)]>
Anuncios
Anuncios

Como pueden observar ahora tenemos en la opcion SSL establecido un cifrador y todos los usuarios tambien lo utilizaran pero cual es la diferencia? La diferencia estara que si nosotros deshabilitamos los certificados SSL del cliente los usuarios que no lo requieran podran seguir ingresando correctamente pero los que necesitan de dicha encriptacion no podran ingresar porque no poder registrarse correctamente, antes de finalizar les muestro una opcion de como iniciar el servidor con ssl sin modificar el archivo de configuraciones:

mysql --ssl-ca=/etc/ssl/mariadb/ca-cert.pem --ssl-cert=/etc/ssl/mariadb/cert-server.pem --ssl-key=/etc/ssl/mariadb/clave-server.pem
Anuncios

Como pueden ver puede resultar menos practico pero puede ser necesario para algunas circunstancias, lo mismo aplica al cliente sino quieren modificar al archivo de configuraciones del mismo, por ultimo pueden usar el REQUIRE para el comando GRANT de la misma forma que vimos en este post a la hora de crear usuarios.

Anuncios

Un ultimo detalle, una buena practica en caso de querer usar conexiones remotas SSL es compartir los certificados del cliente en un recurso para que pueda ser descargado y utilizado desde los mismos, simplemente aplicando los mismos pasos que vimos anteriormente.

Anuncios

En resumen, hoy hemos visto SSL, en realidad como hacer conexiones encriptadas con este protocolo, primero como crear los certificados, donde ubicarlos, como configurarlos para un servidor, como configurarlos para un cliente, creamos un usuario para poder verificarlo, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50