Actualizado el 14-01-2007
versión para imprimir
Primeros pasos tras la instalación
Siempre que queramos utilizar MySQL deberemos hacer login como usuarios en el servidor.
MySQL permite asignar a cada usuario privilegios distintos, que determinan las tareas que podrá realizar cada uno: acceder, modificar, consultar datos y realizar tareas administrativas y de control en la base de datos.
El sistema de usuarios MySQL es independiente del sistema de usuarios de la plataforma linux o windows en que esté ejecutandose. El usuario root no es el usuario root de linux.
Al instalar MySQL, por defecto se crea el usuario root, sin ninguna contraseña. Este el usuario más importante, ya que posee total control sobre las bases de datos, por lo que lo primero que debemos hacer es proporcionarle una contraseña. De lo contrario, cualquier persona que tenga acceso local o remoto a nuestro ordenador podria acceder y hacer cualquier cosa con los datos, las tablas o las bases.
Asimismo, es aconsejable crear un nuevo usuario para acceder a las bases de datos, al que daremos solo los permisos necesarios para las tareas que debemos hacer con él, y dejar a root solo para tareas administrativas y de control. Otra buena idea es la de borrar los usuarios que se crean por defecto.
Los usuarios que MySQL crea por defecto al instalarse tienen distintos permisos segun hayas instalado MySQL en linux o windows.
En Linux
Despues de instalar MySQL en linux, los privilegios de acceso por defecto se establecen ejecutando scripts/mysql_install_db. Este script lanza el servidor mysqld y crea los siguientes usuarios y permisos:
root es un superusuario con todos los permisos. Debe conectarse desde localhost. Carece de contraseña.
Se crea un usuario anónimo que tiene todos los privilegios respecto de las bases de datos cuyos nombres sean test o empiecen por test_. Accede también desde localhost.
En Windows:
En la instalación por defecto, todos los usuarios locales (que accedan desde localhost tienen todos los privilegios respecto de todas las bases de datos, sin necesidad de contraseña. Para asegurar la instalación es conveniente eliminar estos usuarios anónimos, y establecer unos nuevos con contraseña, asi como fijar la contraseña del root o superusuario:
C:\> C:\mysql\bin\mysql mysql mysql> DELETE FROM user WHERE Host='localhost' AND User=''; mysql> QUIT C:\> C:\mysql\bin\mysqladmin reload C:\> C:\mysql\bin\mysqladmin -u root password tu_nueva_contraseña
Lo anterior solo establece contraseña para el usuario root que se conecta desde localhost. Si nuestra base de datos va a estar conectada a internet, necesitamos también asignar una contraseña a root cuando se conecte a través de host (nombre de tu máquina, root@host):
C:\mysql\bin>mysqladmin u root -h tu_host password tu_password
Las tablas en mysql
En toda instalación MySQL se crea la base de datos mysql, que controla el acceso a todas las bases de datos. Contiene varias tablas, con la información que vamos a ver a continuación.
Con el uso adecuado de estas tablas podemos tener un gran control y variedad de formas de acceso a nuestras bases. Podremos dar a usuarios permisos totales sobre parte de las bases de datos, o permisos parciales para todas las bases de datos, o descender a detalles como permisos sobre tablas o incluso sobre columnas.
Al tiempo de escribirse este artículo, MySQL crea seis tablas en la base de datos mysql: user, db, host, tables_priv, columns_priv, func. Cada tabla tiene una serie de campos (los primeros) que determinan su alcance o finalidad (permiten especificar valores para usuarios, bases de datos, puntos de acceso), mientras que el resto de campos sirve para conceder o denegar permisos para acciones concretas (Y/N)
En primer lugar, la tabla user, donde se especifican permisos globales.| Host | localhost | localhost | % | % |
|---|---|---|---|---|
| User | root | irv | root | phpuser |
| Password | 5a1a | 5aff | 5ffa | 4975 |
| Select_priv | Y | Y | Y | N |
| Insert_priv | Y | Y | Y | N |
| Update_priv | Y | Y | Y | N |
| Delete_priv | Y | Y | Y | N |
| Create_priv | Y | Y | Y | N |
| Drop_priv | Y | Y | Y | N |
| Reload_priv | Y | Y | Y | N |
| Shutdown_priv | Y | Y | Y | N |
| Process_priv | Y | Y | Y | N |
| File_priv | Y | Y | Y | N |
| Grant_priv | Y | N | Y | N |
| References_priv | Y | Y | Y | N |
| Index_priv | Y | Y | Y | N |
| Alter_priv | Y | Y | Y | N |
Vamos a explicar su contenido. Para empezar, el signo % en MySQL es un comodín, así que si para un usuario especificamos, en el campo host el signo %, queremos decir que podrá acceder desde cualquier host.
En el ejemplo de la tabla superior puedes ver que los usuarios root y phpuser pueden acceder desde cualquier host.
Las tres primeras columnas, host, user, password sirven para almacenar el nombre de usuario, host desde el que puede acceder y contraseña, encriptada. Las restantes columnas señalan los privilegios para cada usuario, y pueden tener un valor Y/N, segun tengan o no dicho privilegio.
Los permisos que puedes reconocer aqui se refieren a operaciones Select, Insert, Update, Delete, Create, Drop, Reload, Shutdown, Process, File, Grant, References, Index, Alter
En la tabla db podemos especificar permisos para bases de datos individuales. Las tres primeras columnas sirven para especificar el nombre de usuario a quien se reconoce permisos, el host desde el que puede acceder, y la base de datos a la que se van a aplicar los permisos. Los siguientes campos se refieren, como en el caso anterior, a los privilegios que se conceden/deniegan (valores Y/N). Los permisos indicados en esta tabla solo se aplican a la base de datos identificada en cada columna:
| Host | % | % | % |
|---|---|---|---|
| Db | sample_db | php_category | php_directory |
| User | phpuser | phpuser | phpuser |
| Select_priv | Y | Y | Y |
| Insert_priv | Y | Y | Y |
| Update_priv | Y | Y | Y |
| Delete_priv | Y | Y | Y |
| Create_priv | Y | Y | Y |
| Drop_priv | Y | Y | Y |
| Grant_priv | N | N | N |
| References_priv | Y | Y | Y |
| Index_priv | Y | Y | Y |
| Alter_priv | Y | Y | Y |
la tabla host controla permisos globales para máquinas con acceso a nuestras bases de datos. Contiene los mismos campos que la tabla db.
tables_priv es similar a la tabla db aunque su rango es inferior, ya que permite especificar permisos para tablas concretas dentro de bases de datos. En esta tabla, el campo Table_name es el nombre de la tabla de la base de datos.Grantor contiene el nombre de la persona que ha concedido los permisos y Table_priv los permisos para la tabla.
columns_priv permite especificar permisos para ciertas columnas de tablas determinadas. En el campo Column_priv controlamos el grado de acceso del usuario a esa columna.
Las tablas estan relacionadas entre sí, y por ejemplo un usuario autorizado con carácter global no podrá acceder desde una concreta máquina que tenga prohibido o restringido el acceso en la tabla host, de la misma forma que desde una máquina autorizada en host no podrá acceder un usuario que expresamente no esté autorizado en user. Un usuario sin permisos globales puede ver modalizados sus privilegios para una base concreta en la tabla db.
Como los permisos de la tabla user tienen alcance global, la regla es, respecto de los permisos mas importantes, denegarlos con carácter general y autorizarlos con carácter particular. Por ejemplo, denegando Delete_priv a un usuario en la tabla user y reconociendoselo en la tabla db para una base concreta, conseguimos que solo pueda borrar en esa base de datos.
Si ves con detalle el contenido de cada una de las tablas te darás cuenta de que todos los permisos de administración del servidor, es decir, shutdown, reload, process, etc... se especifican únicamente en la tabla user mientras que los permisos de acceso a las bases de datos (insert, delete, alter ...) pueden especificarse, segun su rango y alcance, en el resto de las tablas.
Jerarquia de control
En cada acceso que se produce al servidor MySQL, en primer lugar se compara la entrada con la tabla user para ver si existe coincidencia con el nombre de usuario, host y contraseña. Si es así, se autoriza el login
Si una vez realizada la conexión el usuario realiza una consulta sql, MySQL compara primero los permisos del usuario en la tabla user, y si carece de ellos, consulta a la tabla bd para comprobar si hay permisos especificos para ese usuario, host y base de datos. Si tampoco ahi estan los permisos necesarios, consulta por último las tablas Tables_priv y Columns_priv. Si tampoco los encuentra, genera un mensaje de error.
Como ves, se realizan dos filtros independientes, uno para admitir la conexión, y otro para cada consulta
Para afinar los permisos la técnica, como se ha dicho anteriormente, es denegarlos en las tablas globales y concederlos en las tablas particulares.
privilegios de usuarios
Una buena práctica es utilizar el superusuario root solo cuando verdaderamente sea necesario, y funcionar habitualmente con otro usuario con los permisos adecuados para la tarea a desarrollar. Puedes sacar ventaja del hecho de que puedes asignar permisos distintos para cada nueva base de datos, distinguir segun el usuario acceda de forma local o remota, etc.
Podemos asignar permisos actuando directamente sobre las tablas de la base de datos mysql pero no es la forma mas cómoda ni mas segura. Lo indicado es, una vez hecho login como root, asignar permisos con el comando GRANT:
mysql> grant select, insert on *.* to tester@'%' identified by 'blah'; Query OK, 0 rows affected (0.17 sec)
Con este comando creamos un usuario llamado tester que tiene el derecho de seleccionar e insertar datos en todas las bases de datos y tablas (*.*), con la contraseña blah.
Como ya sabes el signo % despues del nombre de usuario significa que tester podrá hacer login desde cualquier máquina. Si en su lugar hubieramos escrito tester@localhost solo podria conectar en modo local; y si solo queremos dar permiso a tester desde una máquina remota, deberiamos haber escrito el nombre de dicha máquina: tester@mimaquina.midominio.org
El comando GRANT no solo concede permisos, sino que sirve para crear nuevos usuarios. Basta con conceder permisos a un usuario para que si este no existía, sea creado en la tabla user.
mysql> GRANT select, insert, update, create, alter, delete, drop ON directorio.* TO tester@localhost IDENTIFIED BY 'blah';
En este otro ejemplo damos permisos a tester si accede por localhost para seleccionar, insertar datos, actualizar, crear, modificar y borrar tablas en todas las tablas de la base de datos directorio (directorio.*)
mysql> GRANT all ON directorio.alfa To tester@localhost IDENTIFIED BY 'Blah';
concede todos (all) los permisos disponibles para la tabla alfa dentro de la base de datos directorio a tester
mysql> GRANT USAGE ON *.* To tester@localhost IDENTIFIED BY 'Blah';
permite la conexión a tester a cualquier base de datos y tablas, pero no concede ningun otro privilegio.
Finalmente si queremos retirar permisos, usamos REVOKE, de forma similar a GRANT:
mysql> REVOKE ALL ON *.* FROM tester@'5';
Glosario
Host es el nombre de la máquina del usuario.
User el nombre del usuario que va a acceder a MySQL, al que concedemos o negamos permisos.
Password la contraseña del usuario .
Select_priv Permiso para realizar consultas SELECT.
Insert_priv Permiso para añadir datos con INSERT.
Update_priv Permiso para editar y actualizar datos con UPDATE.
Delete_priv Permiso para borrar datos con DELETE.
Create_priv Permiso para crear nuevas tablas o bases de datos con CREATE.
Drop_priv Permiso para borrar tablas o bases de datos con DROP.
Reload_priv Permiso para actualizar las tablas de permisos con FLUSH.
Shutdown_priv Permiso para apagar el servidor.
Process_priv Permiso para consultar los procesos del servidor con MYSQLADMIN PROCESSLIST o SHOW PROCESSLIST (o cancelar esos procesos).
File_priv Permiso para que el usuario lea o escriba en ficheros residentes en el server.
Grant_priv Permiso para que el usuario pueda conceder permisos a otros usuarios con GRANT.
References_priv ??.
Index_priv Permiso para indexar tablas (crear o borrar índices).
Alter_priv Permiso para cambiar la estructura de una tabla.
Db La base de datos a la cual son aplicables los privilegios. Un servidor MySQL puede albergar varias bases de datos.