MySQL es un sistema de gestión de bases de datos
claramente orientado a la web, y una de los síntomas en su arquitectura ha
venido siendo que la creación de los usuarios se
realiza en la misma sentencia que el permiso (grant) de acceso a una o varias
bases de datos. La orientación de MySQL va cambiando con el tiempo y el uso que
se le da a las bases de datos cada vez trasciende más el entorno web,
actualmente hay tres formas de crear un usuario:
La forma clásica, con la sentencia GRANT
Utilizando la sentencia GRANT podemos
crear un usuario a la par que otorgarle uno o varios privilegios sobre los
objetos de una base de datos, o la base de datos completa.
Al encontrarse una sentencia de tipo GRANT, el motor de MySQL revisa si el usuario existe previamente para el contexto que estamos asignándole permisos, y si dicho usuario no está presente en el sistema, lo crea.
No entraré en detalles sobre todas las opciones que nos permite ejecutar la sentencia GRANT, sino solo en las que se refieren a la creación del usuario.
Pongamos un ejemplo, queremos crear el usuario diego para la base de datos test:
Al encontrarse una sentencia de tipo GRANT, el motor de MySQL revisa si el usuario existe previamente para el contexto que estamos asignándole permisos, y si dicho usuario no está presente en el sistema, lo crea.
No entraré en detalles sobre todas las opciones que nos permite ejecutar la sentencia GRANT, sino solo en las que se refieren a la creación del usuario.
Pongamos un ejemplo, queremos crear el usuario diego para la base de datos test:
- Nos conectamos con un
usuario que tenga privilegios, root, como propietario de la base de datos, los
tiene.
$ mysql
-u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.0.67 Source distribution
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.0.67 Source distribution
Nos conectamos
utilizando -u para indicarle el usuario y si quisieramos indicarle un password,
deberiamos poner -p (sin añadirle la contraseña), en este caso la cuenta root,
al ser una máquina de desarrollo, está desprotegida.
- Lanzamos la sentencia
GRANT, indicando los permisos que otorgamos, la base de datos y los objetos de
la misma sobre los que estamos asignando privilegios, el nombre del usuario y
el password:
mysql>
GRANT SELECT, INSERT ON test.* TO 'diego'@'localhost' IDENTIFIED BY 'pass_diego';
En este ejemplo
permitimos al usuario diego que seleccione (SELECT) e inserte (INSERT) en todos
los objetos (*) de la base de datos test, además indicamos que el contexto sea
la máquina local de la base de datos (localhost), lo que impedirá que el
usuario se conecte desde otras máquinas, y finalmente asignamos un password
mediante IDENTIFIED BY.
Si quisieramos que el usuario no tuviera un password, deberemos omitir la
cláusula IDENTIFIED BY.
En el caso de que el modo SQL del servidor estuviera en NO_AUTO_CREATE_USER, la creación de usuarios no estaría permitida a no ser que tuvieran asignado un password no vacío.
En el caso de que el modo SQL del servidor estuviera en NO_AUTO_CREATE_USER, la creación de usuarios no estaría permitida a no ser que tuvieran asignado un password no vacío.
- Una vez hecho esto,
podremos conectarnos con nuestro usuario y realizar las acciones para las que
hemos asignado permisos:
$ mysql
-u diego -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.0.67 Source distribution
mysql> use test;
Database changed
mysql> select * from frutas;
+-----------+----------+
| nombre | color |
+-----------+----------+
| fresa | rojo |
| manzana | verde |
| uva | verde |
+-----------+----------+
3 rows in set (0,03 sec)
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 5.0.67 Source distribution
mysql> use test;
Database changed
mysql> select * from frutas;
+-----------+----------+
| nombre | color |
+-----------+----------+
| fresa | rojo |
| manzana | verde |
| uva | verde |
+-----------+----------+
3 rows in set (0,03 sec)
Más detalles sobre la sentencia GRANT y los privilegios disponibles en
la documentación de mysql.
La sentencia CREATE USER
A partir de la versión MySQL 5.0.2 existe la posibilidad de crear usuarios
sin necesidad de asignarles privilegios, utilizando la sentencia CREATE USER.
Por ejemplo, para crear
el usuario andrea:
$ mysql
-u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.0.67 Source distribution
mysql> CREATE USER 'andrea'@'localhost' IDENTIFIED BY 'fer_pass';
Query OK, 0 rows affected (0,00 sec)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.0.67 Source distribution
mysql> CREATE USER 'andrea'@'localhost' IDENTIFIED BY 'fer_pass';
Query OK, 0 rows affected (0,00 sec)
Al igual que con la
sentencia GRANT, el contexto 'localhost' define que el usuario solamente se
puede conectar desde el servidor de MySQL, y el IDENTIFIED BY define el
password del usuario, se puede omitir, para un usuario sin password, siempre
que el modo SQL no sea NO_AUTO_CREATE_USER.
Conexión con el usuario,
utilizando la opción -p:
$ mysql
-u andrea -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.0.67 Source distribution
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.0.67 Source distribution
Los privilegios necesarios para ejecutar la sentencia CREATE USER son CREATE USER o bien INSERT en la
base de datos mysql.
El usuario recién creado no tiene privilegio alguno, por lo que deberemos asignarle permisos utilizando sentencias GRANT(esta vez sin la cláusula IDENTIFIED BY).
El usuario recién creado no tiene privilegio alguno, por lo que deberemos asignarle permisos utilizando sentencias GRANT(esta vez sin la cláusula IDENTIFIED BY).
Más detalles sobre esta sentencia en la documentación de mysql.
Modo hardcore: insertando en la tabla
users
Este es un método que
MySQL no recomienda demasiado, es un poco más complejo que los otros dos, pero
va bien a la hora de resolver problemas, como que por ejemplo alguno de las
formas anteriores esté dando algún problema extraño.
Para ello es necesario un usuario con privilegio INSERT en la base de datos mysql. También debo decir que se ha de tener mucho cuidado con esta base de datos, ya que contiene toda la información de usuarios y permisos.
Para ello es necesario un usuario con privilegio INSERT en la base de datos mysql. También debo decir que se ha de tener mucho cuidado con esta base de datos, ya que contiene toda la información de usuarios y permisos.
Ejemplo de creación del usuario juan usando INSERT en
nuestra base de datos. Nos conectamos con un usuario con privilegios, en este
caso root, y seleccionamos la base de datos mysql mediante la sentencia USE.
$ mysql
-u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 5.0.67 Source distribution
mysql> use mysql
Database changed
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 23
Server version: 5.0.67 Source distribution
mysql> use mysql
Database changed
Y después realizamos la
sentencia de inserción para añadir nuestro usuario:
mysql>
INSERT INTO user VALUES('localhost','juan',PASSWORD('pass_juan'),'Y','Y',
'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
'N','N','N','','','','',0,0,0,0);
Query OK, 1 row affected (0,00 sec)
'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
'N','N','N','','','','',0,0,0,0);
Query OK, 1 row affected (0,00 sec)
Es necesario llamar a la función PASSWORD() para
almacenar el password codificado, en los otros casos, el IDENTIFIED BY se
encarga de hacer la codificación.
En este caso se le dan permisos globales de INSERT y SELECT, para saber a qué corresponde cada columna, se puede hacer un DESCRIBE user.
En este caso se le dan permisos globales de INSERT y SELECT, para saber a qué corresponde cada columna, se puede hacer un DESCRIBE user.
mysql>
DESCRIBE user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
(...)
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
| Select_priv | enum('N','Y') | NO | | N | |
| Insert_priv | enum('N','Y') | NO | | N | |
| Update_priv | enum('N','Y') | NO | | N | |
| Delete_priv | enum('N','Y') | NO | | N | |
| Create_priv | enum('N','Y') | NO | | N | |
| Drop_priv | enum('N','Y') | NO | | N | |
| Reload_priv | enum('N','Y') | NO | | N | |
| Shutdown_priv | enum('N','Y') | NO | | N | |
(...)
Para asignar privilegios a bases de datos específicas o tablas específicas,
se debe usar GRANT.
Utilizando este método, tenemos que forzar que se refresquen las tablas de permisos usando FLUSH PRIVILEGES.
Utilizando este método, tenemos que forzar que se refresquen las tablas de permisos usando FLUSH PRIVILEGES.
mysql>
FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,01 sec)
Query OK, 0 rows affected (0,01 sec)
Una vez hecho esto, ya
nos podremos conectar:
$ mysql
-u juan -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.67 Source distribution
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 5.0.67 Source distribution
Más información sobre el uso de este método, en comparación con el GRANT,
en la documentación de mysql.
Otras consideraciones
También se pueden crear usuarios desde la herramienta visual MySQL
Administrator, que forma parte de las GUI Tools que ofrece gratuitamente MySQL
y se pueden descargar desde aquí.
(Es multiplataforma, pero en Mac funciona bastante mal)
Para saber con qué usuario estamos conectados en este momento, podemos usar
la función CURRENT_USER() o USER().
mysql>
SELECT CURRENT_USER();
+------------------+
| CURRENT_USER() |
+------------------+
| diego@localhost |
+------------------+
1 row in set (0,00 sec)
+------------------+
| CURRENT_USER() |
+------------------+
| diego@localhost |
+------------------+
1 row in set (0,00 sec)
Al crear un usuario, se
define el contexto desde el que se puede conectar, por ejemplo 'diego'@'localhost'
solamente se puede conectar desde el mismo servidor de la base de datos, para
crear usuarios que se puedan conectar desde varias máquinas, se puede crear un
usuario por cada máquina o usar el comodín '%', el usuario 'diego'@'%' se
podría conectar desde cualquier máquina, y el usuario 'andrea'@'192.168.1.%' se
podría conectar desde máquinas con una dirección IP comprendida entre
192.168.1.1 y 129.168.1.255.
Por ejemplo:
GRANT
SELECT, INSERT ON test.* TO 'diego'@'%' IDENTIFIED BY 'pass_diego';
CREATE USER 'andrea'@'192.168.1.%' IDENTIFIED BY 'fer_pass';
CREATE USER 'andrea'@'192.168.1.%' IDENTIFIED BY 'fer_pass';
En el caso de que
estemos realizando la creación de un usuario mediante el método INSERT y nos
aparezca el siguiente error:
ERROR
1136 (21S01): Column count doesn't match value count at row 1
La razón es que algunas
de las columnas de la tabla user no tienen valor por defecto (por ejemplo
ssl_type), y no las hemos informado todas, es necesario hacerlo.
No hay comentarios:
Publicar un comentario