Habiendo leído cómo funciona MySQL y  conociendo las herramientas para manipular la base de datos vamos a ver un poco la «infraestructura» del proyecto web, dónde está la base de datos, qué permisos necesitamos para acceder a la base, tablas, usuarios dependiendo de dónde estemos ubicados.

Hay 2 posibles implementaciones (las más habituales si no hablamos de clúster u otros…) para la base de datos:

  • Base de datos y servidor web en el mismo equipo (Como nuestros laboratorios con XAMPP)
  • Base de datos en un equipo y servidor web en otro equipo (Es la mejor práctica).

Veamos la imagen:

infraestructura_mysql_apache

En el caso 1 podremos ver una representación cuando tenemos «todos los huevos en la misma canasta», es decir, tanto la base de datos, como el servidor web se ejecutan en el mismo equipo, esto es lo más habitual para entornos de desarrollo (como nuestra instalación de XAMPP).

En el caso 2, vemos una implementación más segura, donde distribuimos la infraestructura, por un lado el servidor de base de datos y por otro lado el servidor web.

Acceso y permisos en la base de datos

No es lo mismo intentar acceder a una base de datos estando en el servidor donde está instalado el motor (MySQL o María DB) que intentar acceder a través de una aplicación web o un equipo diferente en la misma red o una red externa.

También podemos determinar cuando un usuario puede acceder a la base con determinados permisos, uno o varios como: leer, escribir, borrar, actualizar…

Puede pasar, que un usuario tenga permisos para modificar la base de datos, pero no para conectarse a la base, o que el usuario se pueda conectar a la base pero no tenga permisos para modificarla, son problemas completamente distintos (niveles de seguridad diferentes).

Comencemos por entender en un diagrama las distintas capas de seguridad y accesibilidad a la base. Vamos a tomar como ejemplo la arquitectura donde el servidor web (Apache) y la base de datos (MySQL y MaríaDB) no están en nuestro equipo local sino en un servidor externo.

Este ejemplo es un tanto más complejo, pero más detallado, ya que si todo estuviera en nuestra máquina local nos podríamos olvidar del nivel de red.

La seguridad, desde el punto más básico

  1. Seguridad de Usuario y Contraseña (MySQL)
  2. Seguridad a nivel de red / sistema operativo
  3. Seguridad Granulada en MySQL (Origen, usuario, contraseña y permisos específicos)
Niveles de seguridad base de datos

Niveles de seguridad base de datos

Tal vez sea un poco confuso el gráfico pero vamos a explicarlo paso a paso.

1) Para que la magia ocurra, debemos tener conectividad entre nuestra PC y la base de datos. Lo primero es verificar que tenemos conexión al equipo y puerto donde se encuentra la base.

Hay varias cosas que podrían impedir que podamos acceder a la base de datos desde otro equipo:

– Tenemos mal el usuario y/o contraseña «Validar el usuario y contraseña localmente en el equipo de la base»

– MySQL no está escuchando en la IP Pública (archivo my.cnf) «MySQL podría estar escuchando solo (localhost) y rechaza las conexiones desde cualquier otro origen,ejecutar Netstat para verificar que escucha en 0.0.0.0«

– MySQL no se está ejecutando en el puerto 3306 (default) «ejecutar Netstat  en el servidor de base de datos y verificar que el puerto es correcto»

– No tenemos acceso a nivel de red al equipo y puerto de destino (usaremos Telnet, como se explica a continuación).

Usar la herramienta «ping» para verificar si llegamos a un equipo es una mala práctica, siempre es preferible utilizar Telnet. El protocolo ICMP usado por ping puede estar restricto, lo cual no significa que no estemos llegando el equipo.

Paso 1, validación de Red y Sistema Operativo

Para verificar que llegamos al equipo y su puerto, podemos utilizar la herramienta «telnet» disponible casi en todos los sistemas operativos (A partir de Windows Vista debemos activarla a través del panel de control) podemos por ejemplo ejecutar:

telnet nombredelequipo 3306

Para ejecutar esto usaremos «CMD» en Windows o una consola de Linux.

Tras ejecutar el comando, deberíamos obtener algo similar a esto:

Telnet al puerto de MySQL en mi PC (local)

Una pantalla en negro o un mensaje como este significan que estamos llegando hasta la base de datos.

Si esto no sucede, recuerden que deben estar en la misma red o tener acceso vía internet, SELinux, el Firewall de Windows o la configuración de my.cnf (ip pública) pueden ser el origen del problema.

Paso 2, validación de usuario y contraseña

Una vez alcanzamos al equipo a nivel de red, entonces comenzamos a hablar con MySQL, el cual normalmente por seguridad preguntará por un usuario y contraseña válidos.

Es importante probar el usuario y contraseña. Aunque estos datos estén correctos aún MySQL podría negarnos el ingreso al mototr de base de datos.

Paso 3, Seguridad granular

Granularidad significa «ser específicos» como ir desde una gran roca hasta convertirla en polvo. Es este último paso, MySQL podría ser configurado para ser específico.

Por ejemplo, podríamos habilitar al usuario «pepe» para acceder a la base «dominio_test» únicamente si pepe se conecta desde el origen «MyPC» (si el nombre del equipo es otro «origen» es distinto, se le negará el acceso).

Con esto garantizamos que «pepe» pueda acceder a la base de datos, pero podemos ser más específicos y no permitirle ejecutar sentencias tipo UPDATE, SELECT o INSERT, según lo deseemos, podemos controlar exactamente qué puede hacer «pepe» dentro de la base de datos.

Para realizar estas tareas, podemos usar los siguientes comandos desde el CLI de MySQL:

# Crear un usuario
CREATE USER 'usuario'@'origen' IDENTIFIED BY 'password';

# Origen y Granularidad de permisos sobre la base:

GRANT ALTER, SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON database.* TO 'usuario'@'origen' IDENTIFIED BY 'password';

Con estos pasos podremos definir exactamente quién se conecta, desde dónde y qué puede hacer en la base de datos.