Crear un Usuario y Otorgarle Permisos en Mysql

MySQL es un sistema de gestión de bases de datos relacional, multihilo y multiusuario con más de seis millones de instalaciones en todo el mundo. Uno de los sistemas más populares en bases de datos y quizás el más extendido a través de internet debido a su facilidad de uso, su potencia, y que viene integrado con la mayoría de aplicaciones o sistemas de gestión de contenido. Practicamente no hay CMS que no lo incluya como su primera opción, y como un servidor (el que suscribe) lleva varios días haciendo migraciones masivas y compulsivas de aplicaciones que usan mysql, he decidido elaborar una serie de guías con las operaciones más usadas y alguna un poco más avanzada. En este serie de artículos aprenderemos a crear bases de datos, crear usuarios, asignar privilegios, realizar backups, restaurar las copias de seguridad, hacer modificaciones sobre las tablas, y a enviar comandos sql a través de shell script (bash).

Lo primero es obligatorio, en el supuesto de servidores que administremos completamente: ¿por qué crear usuarios mysql cuando puedo usar al todopoderoso root en todas mis aplicaciones? Bien, como seguramente ya sabremos, el usuario principal y superprivilegiado en mysql se llama root, es el usuario que se crea por defecto con todas las instalaciones del sistema de gestión de bases de datos, y desde el cual tendremos que trabajar para crear otros usuarios. Este usuario puede hacerlo todo dentro de mysql, tendrá acceso y control total de todas las tablas en todas las bases de datos, por tanto no es muy buena idea usarlo para aplicaciones que no necesitan acceder a otras tablas que no sea las suyas, pues supone un riesgo de seguridad importante, en el supuesto de que nuestra aplicación hiciera algo incorrecto ya fuera por una inyección SQL, por un bug de la aplicación o por cualquier otro motivo, ya que estariamos comprometiendo todas las bases de datos que compartieran hosting con nuestra aplicación. Entra dentro de lo que se llama buenas prácticas, crear un usuario nuevo para cada aplicación (con contraseñas enrevesadas e inhumanas si es posible). Así, en un sistema en el que corramos nagios, otrs, mediawiki, y wordpress (por ejemplo), crearíamos un usuario para cada una de estas aplicaciones.

1.Conexión al sistema de gestión de bases de datos (SGBD)

Pero vamos por partes, un SGBD no es otra cosa que un servidor de esos que tanto nos gustan, y lo primero debiera ser tener disponible el servidor mysql en nuestro sistema. Si no lo tienes, y utilizas Debian/Ubuntu, ejecuta ‘apt-get install mysql-server‘ ya!

Para establecer conexión, usaremos el comando ‘mysql’ para ello, sea cual sea tu sistema operativo. Si estás en windows, tendrás que abrir una terminal y posicionarte manualmente en la ruta del ejecutable, a no ser que lo tengas incluido en el path. En Linux, normalmente no tendremos este problema si hemos instalado el servidor desde la paquetería.

Uso: mysql [OPCIONES] [database]

Opciones más comunes (consultar listado completo con mysql –help):

  • -h = Esta opción especifica el host al que nos conectaremos. Si no usamos esta opción, conectará al host por defecto, localhost. Puede usarse una IP o un nombre canónico que pueda ser resuelto.
  • -u = Con esta opción se especifica el usuario con el que nos conectaremos a la base de datos. Si no se especifica ninguna opción, nos conectaremos con el nombre del usuario que estemos usando en ese momento.
  • -p = Indica al intérprete de mysql que vamos a usar una contraseña para acceder al S.G.B.D. Si no tenemos contraseña puesta, o si entramos en modo seguro, se puede omitir.
  • [database] = es opcional, podemos poner el nombre de la base de datos a la que nos queremos conectar, una vez hayamos entrado al sistema gestor de bases de datos.
[email protected]:~# mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 5.5.47-0ubuntu0.12.04.1 (Ubuntu)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

Nota: Por lo explicado antes sobre las conexiones por defecto, el comando anterior sería similar a usar un simple ‘mysql -p

2.Crear Usuarios en MySQL

Un vez dentro del intérprete de mysql, podremos gestionar los usuarios y las bases de datos, así como otros parámetros más avanzados, con las instrucciones específicas del lenguaje SQL.

Es bueno recordar que mysql guarda la información de sus usuarios y demás en una base de datos que está presente en todo sistema mysql. ¿Adivináis el nombre?: mysql. Esto no quiere decir que para crear usuarios vayamos a editar directamente las bases de datos, pero es bueno saberlo por si en algún momento necesitamos acceso a atributos en concreto.

En fin, una vez dentro de una terminal mysql, podemos crear usuarios con la sentencia CREATE USER;   (Nótese que toda sentencia dentro del intérprete debe terminar con ‘;’, para que se ejecute.)

Sintaxis básica:

Usage: CREATE USER 'usuario'@'host' IDENTIFIED BY 'contraseña';

Donde ‘usuario‘ es el nombre de usuario (sin las comillas, que por cierto pueden ser opcionales), ‘host‘ son los sitios desde donde se le permite al usuario conectarse, y deben ser ip’s o hostnames validos, y ‘contraseña‘ es la clave de acceso. Se pueden usar asteriscos como comodines, por ejemplo

mysql> CREATE USER 'leonidas'@'*' IDENTIFIED BY 'leonidas';
 Query OK, 0 rows affected (0.00 sec)

Creará un usuario llamado leonidas con password leonidas, y que podrá acceder desde cualquier host, mientras que

mysql> CREATE USER 'leonidas'@'localhost' IDENTIFIED BY 'leonidas';
 Query OK, 0 rows affected (0.00 sec)

Creará un usuario llamado leonidas con password leonidas, que sólo podrá acceder desde el propio servidor. Para permitir acceso desde varios host, repetiremos la sentencia tantas veces como hosts de origen queramos permitir. Si estamos usando mysql para un cms tipo wordpress o similar, todo en el mismo host, la opción ‘localhost’ será más que suficiente y la recomendada por seguridad.

3.Crear Bases de Datos en MySQL

Una vez tenemos el usuario, vamos a crearle una base de datos sobre la que pueda trabajar. Podemos ver las bbdd presentes en el sistema con la orden show databases, y para crear la bbdd nueva, usaremos ‘CREATE DATABASE basededatos’.

Por ejemplo, vamos a crear una base de datos llamada ‘spartans’:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql> CREATE DATABASE spartans;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| spartans           |
+--------------------+
4 rows in set (0.00 sec)

exploits_of_a_mom

la importancia de proteger el input…

4.Asignar permisos en MySQL

Con la base de datos y el usuario creados, podemos asignar permisos a este último.

Para ello usaremos la sentencia GRANT ‘PRIVILEGIO’ ON ‘OBJETIVO’ TO ‘USUARIO’, donde ‘Privilegio’ es el privilegio a otorgar, ‘Objetivo’  hace referencia a las bases de datos y tablas sobre las que se aplicará el permiso, y ‘Usuario’ es una relación usuario-host de conexión. ¿Recordáis del punto 2 que al crear un usuario se especificaba el host desde el que se podía conectar el usuario? Pues esto es más de lo mismo, seguridad a nivel ip. También se pueden usar astéricos como comodines.

Para verlo más claro;

GRANT [permiso] ON [nombre de bases de datos].[nombre de tabla] TO ‘[nombre de usuario]’@'localhost’;

Por ejemplo, para asignar todos los permisos sobre todos los elementos de la base de datos a leonidas;

GRANT ALL PRIVILEGES ON * . * TO 'leonidas'@'localhost';

Esta sentencia dará permiso al usuario llamado leonidas permiso sobre todas las tablas en todas las bases de datos, siempre y cuando se conecte desde el propio servidor.

Otro ejemplo, vamos a dar todos los permisos a leonidas sobre la base de datos spartans, desde el localhost. Este es el comando más típico si nos dedicamos a instalar aplicaciones web que utilicen mysql, en el servidor;

mysql> GRANT ALL PRIVILEGES ON spartans. * TO 'leonidas'@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

La sentencia FLUSH PRIVILEGES es necesaria para que se apliquen los permisos nuevos.

Otros posibles permisos que se pueden asignar a los usuarios, y que en un principio no se usarían mucho para aplicaciones web, son:

  • ALL PRIVILEGES: control total sobre las bases de datos especificadas.
  • CREATE: permite crear nuevas tablas o bases de datos.
  • DROP: permite eliminar tablas o bases de datos.
  • DELETE: permite eliminar registros de tablas.
  • INSERT: permite insertar registros nuevos en tablas.
  • SELECT: permite leer registros en las tablas. Útil si queremos crear un usuario de sólo lectura sobre la base de datos.
  • UPDATE: permite actualizar registros existentes en tablas.
  • GRANT OPTION: permite quitar privilegios a otros usuarios.

Conclusiones

En este primer artículo hemos visto que es bien fácil crear usuarios para nuestras aplicaciones con mysql, y cómo las buenas prácticas no están reñidas con la sencillez. En la próxima entrega, veremos como realizar copias de seguridad con mysqldump, como integrarlas en un script para programar copias de seguridad de nuestra base de datos, y cómo restaurarlas.

 

Nota: viñeta extraida de http://xkcd.com/327/

Deja un comentario

Tu dirección de correo electrónico no será publicada.

7 + 2 =